Skip to content

Commit 90904d3

Browse files
kmbandyclaude
andcommitted
cuda: remove TQ4_1S load-time q8_0 conversion to save VRAM
TQ4_1S was pre-converting to q8_0 at load time (1.7x VRAM inflation) to use dp4a kernels. Native mul_mat_vec_tq kernels already exist for both v12 (shmem) and v8 (scratch) paths — use those instead, keeping TQ4_1S at its actual 5.08 BPW in VRAM rather than q8_0's 8.5 BPW. Removes the q8_0-sized buffer pre-allocation and the set_tensor conversion path. Fixes ~10 GiB VRAM inflation on 27B models. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 37e3b15 commit 90904d3

1 file changed

Lines changed: 0 additions & 33 deletions

File tree

ggml/src/ggml-cuda/ggml-cuda.cu

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -681,32 +681,6 @@ static void ggml_backend_cuda_buffer_set_tensor(ggml_backend_buffer_t buffer, gg
681681

682682
ggml_cuda_set_device(ctx->device);
683683

684-
// TQ4_1S → q8_0 load-time conversion
685-
if (tensor->type == GGML_TYPE_TQ4_1S && offset == 0 && size == ggml_nbytes(tensor)) {
686-
const int64_t n_elements = ggml_nelements(tensor);
687-
688-
// Upload TQ4_1S to a temp GPU buffer
689-
void * tmp_tq4;
690-
CUDA_CHECK(cudaMalloc(&tmp_tq4, size));
691-
CUDA_CHECK(cudaMemcpyAsync(tmp_tq4, data, size, cudaMemcpyHostToDevice, cudaStreamPerThread));
692-
693-
// Convert TQ4_1S (tmp) → q8_0 (tensor->data, which has q8_0-sized allocation)
694-
ggml_cuda_convert_tq4_1s_to_q8_0(tmp_tq4, tensor->data, n_elements, cudaStreamPerThread);
695-
CUDA_CHECK(cudaStreamSynchronize(cudaStreamPerThread));
696-
697-
CUDA_CHECK(cudaFree(tmp_tq4));
698-
699-
// Update tensor metadata to q8_0
700-
tensor->type = GGML_TYPE_Q8_0;
701-
tensor->nb[0] = ggml_type_size(GGML_TYPE_Q8_0);
702-
tensor->nb[1] = tensor->nb[0] * (tensor->ne[0] / ggml_blck_size(GGML_TYPE_Q8_0));
703-
for (int i = 2; i < GGML_MAX_DIMS; i++) {
704-
tensor->nb[i] = tensor->nb[i-1] * tensor->ne[i-1];
705-
}
706-
707-
return;
708-
}
709-
710684
CUDA_CHECK(cudaMemcpyAsync((char *) tensor->data + offset, data, size, cudaMemcpyHostToDevice, cudaStreamPerThread));
711685
CUDA_CHECK(cudaStreamSynchronize(cudaStreamPerThread));
712686
}
@@ -827,13 +801,6 @@ static size_t ggml_backend_cuda_buffer_type_get_alloc_size(ggml_backend_buffer_t
827801
size_t size = ggml_nbytes(tensor);
828802
int64_t ne0 = tensor->ne[0];
829803

830-
// TQ4_1S → q8_0 load-time conversion: allocate q8_0-sized space in VRAM
831-
if (tensor->type == GGML_TYPE_TQ4_1S) {
832-
// q8_0 block: 34 bytes per 32 elements. TQ4_1S block: 20 bytes per 32 elements.
833-
const int64_t n_blocks = ggml_nelements(tensor) / QK_TQ4_1S;
834-
size = n_blocks * sizeof(block_q8_0);
835-
}
836-
837804
if (ggml_is_quantized(tensor->type)) {
838805
if (ne0 % MATRIX_ROW_PADDING != 0) {
839806
GGML_ASSERT(tensor->nb[0] == ggml_element_size(tensor));

0 commit comments

Comments
 (0)