TurboQuant. Nén KV cache xuống 3 bit mà accuracy không đổi.
Hỏi một câu vào model đang giữ 200K token context, GPU nuốt vài chục GB chỉ để nhớ KV. TurboQuant của Google Research xoay vector trước khi quantize, nén key và value xuống 3 bit, giảm 6 lần memory, chạy nhanh hơn tới 8 lần trên H100. Không cần fine-tune, không cần calibration, accuracy trên LongBench gần như không sứt mẻ. Bài viết mổ xẻ tại sao quantize thẳng KV cache hỏng, phép quay Hadamard biến đường cong outlier thành phân phối beta thế nào, và lớp Quantized Johnson-Lindenstrauss khử nốt bias còn lại.
Bạn dán một file 80 trang vào Claude rồi hỏi một câu. Vài giây sau câu trả lời hiện ra, đẹp đẽ. Ở phía server, GPU vừa phải giữ trong VRAM một bảng tra mang tên KV cache: mỗi token trong cửa sổ context để lại một vector key và một vector value, lưu lại để các bước generate sau khỏi tính lại. 200K token context trên Llama-3.1 70B khoảng 40GB chỉ riêng KV. Long context càng dài, GPU càng chật.
Cách rõ nhất để cắt giảm: nén KV cache xuống ít bit hơn. Nhưng ai từng thử int3 thẳng tay đều thấy accuracy lao dốc, model sinh chữ lảm nhảm. Tháng 3 năm 2026, nhóm Amir Zandieh và Vahab Mirrokni ở Google Research công bố TurboQuant trong paper ICLR. KV cache xuống 3 bit. Trên LongBench accuracy gần như không đổi. Trên H100, key được quantize 4-bit chạy nhanh hơn baseline tới 8 lần. Không cần fine-tune, không cần calibration trên dataset.
Vì sao quantize thẳng tay hỏng accuracy
Quantization chuyển một vector float32 thành vector ít bit hơn bằng cách chia khoảng giá trị thành các bin đều. Vấn đề là phân phối các toạ độ của key vector không đều. Một vài chiều có giá trị cực lớn, phần lớn các chiều còn lại nhỏ và dồn quanh 0.
Đó là outlier. Khi bin được căn theo dải max-min, outlier kéo dải rộng ra, nên vùng dày của phân phối chỉ rơi vào một vài bin. 3 bit nghĩa là 8 bin. Nếu 7 bin bị bỏ trống vì outlier kéo dải, gần như mọi giá trị bị nén về cùng một bin. Thông tin chết.
TurboQuant phá outlier bằng một phép xoay. Họ dùng Hadamard transform: nhân vector key với một ma trận trực giao có toạ độ chỉ ±1, độ dài vector giữ nguyên. Sau phép quay, các outlier không biến mất, chúng được trải đều cho mọi chiều. Phân phối từ chữ U lệch chuyển thành dạng beta gần như cân đối, giống một quả chuông. Bin chia đều giờ khớp với phân phối, mỗi bin có lượng dữ liệu xấp xỉ nhau, sai số quantize nhỏ hẳn lại.
Phép quay là khả nghịch. Khi cần dùng key trong attention, query cũng được quay bằng ma trận tương ứng. Inner product giữa query và key sau khi quay bằng đúng inner product trước khi quay. Tính chất hình học giữ nguyên, chỉ phân phối toạ độ đẹp hơn.
QJL khử bias còn lại
Quantize sau xoay vẫn còn sai số nhỏ. Vector trả về không bằng đúng vector gốc, chênh một đoạn. Khi tính inner product với hàng trăm nghìn key, các sai số nhỏ này không tự triệt tiêu, chúng tích thành bias hệ thống cộng vào điểm attention.
TurboQuant tính phần residual giữa vector quantize và vector gốc, rồi nén nó bằng Quantized Johnson-Lindenstrauss (QJL): chiếu residual qua một ma trận ngẫu nhiên, lấy dấu ±1, lưu 1 bit cho mỗi chiều chiếu. Đây là một kỹ thuật cũ của lý thuyết toán tính khoảng cách, lần này được lắp vào đường ước lượng inner product. Kết quả: ước lượng inner product trở thành unbiased, kỳ vọng đúng bằng inner product gốc, sai số có thể giảm thêm bằng cách tăng số chiều chiếu.
Nhân key với ma trận trực giao ±1. Outlier rải đều, phân phối từ U lệch chuyển sang dạng beta.
Mỗi toạ độ ép vào 1 trong 8 bin. Bin chia đều giờ khớp phân phối, sai số quantize nhỏ.
Chiếu residual qua ma trận ngẫu nhiên, lưu dấu ±1. Inner product trở thành unbiased.
3 bit, 6 lần memory, accuracy gần như nguyên
200K token context · 40GB KV cache · LongBench 47.2 · MMLU 78.1
200K token context · 6.4GB KV cache · LongBench 47.0 · MMLU 78.1. Không fine-tune.
Trên needle-in-haystack, TurboQuant 3-bit giữ 100% recall với context 1 triệu token. Nhóm tác giả test thêm trên Mistral 7B và Gemma 2 27B, cùng kiểu kết quả: accuracy không sứt mẻ, memory KV còn 1/6.
Phần thưởng phụ là tốc độ. Vì key chỉ còn 3 bit nên load từ HBM về SRAM nhanh hơn nhiều. Trên H100, kernel TurboQuant 4-bit cho key chạy nhanh tới 8 lần so với baseline fp32.Long context không còn là cuộc đua memory, nó trở lại là cuộc đua compute.
Không phải bữa trưa miễn phí
Hadamard transform thêm một phép nhân ma trận khi insert key vào cache. Với key dimension 128, chi phí xoay nhỏ so với attention chính, nhưng vẫn cần kernel CUDA viết kỹ. Đến tháng 4 năm 2026 đã có bản cho llama.cpp, MLX, và PyTorch do cộng đồng port; bản chính thức của Google chưa public.
Sàn 3 bit không phải tuyệt đối. Đẩy xuống 2.5 bit accuracy bắt đầu rớt nhẹ trên reasoning benchmark, 2 bit thì hỏng rõ trên LongBench. Mỗi bit ăn vào dung lượng thông tin, tới một ngưỡng QJL cũng không cứu được.
TurboQuant chỉ cứu inference. Train vẫn cần fp16 hoặc bf16 cho gradient. Và nó chỉ giảm bottleneck KV cache, không chạm tới prefill: xử lý prompt dài lần đầu vẫn tốn compute như cũ.
Bật khi memory-bound, bỏ khi prefill-bound
Bật TurboQuant khi pipeline serve long context, batch lớn, GPU đang chật vì KV. Một H100 80GB sau khi gắn TurboQuant 3-bit có thể giữ context 1 triệu token cho 4 sequence song song mà trước đó chỉ giữ được 1. Cost per token giảm nhiều nhất ở phần decode, đúng phần chiếm phần lớn thời gian chat.
Bỏ qua nếu workload chủ yếu là one-shot prompt ngắn dưới 4K token, hoặc model nhỏ dưới 7B (KV cache không là bottleneck), hoặc khi chưa có kernel TurboQuant cho runtime của bạn. Quantize int4 hoặc int8 chuẩn vẫn dễ tích hợp hơn cho các trường hợp đó.
Lớn hơn TurboQuant là tín hiệu nó đại diện. Một paper duy nhất, không cần training data, không cần chỉnh model, đẩy được KV cache xuống mức trước đây tưởng không thể. Nếu bạn đang xếp roadmap inference cho long context năm 2026, đây là kỹ thuật đáng theo dõi sát.