TROISINH
BreakthroughsKV Cache & Inference

KV Cache — Đừng tính lại cái đã tính, cache K và V

Cache Key và Value trong autoregressive generation giảm tính toán từ O(n²) xuống O(n), mở khóa long-context inference hiệu quả cho LLM production.

Production LLM inference đối mặt với "quadratic compute trap" — nếu không có KV Cache, việc sinh token thứ 1000 đòi hỏi phải tính lại attention với cả 999 tokens trước đó từ đầu. Điều này khiến latency tăng dần theo thời gian và VRAM bị đốt cháy vô ích. KV Cache là kỹ thuật then chốt giúp GPT-4, Claude và Llama chạy real-time mà không cần tính lại những gì đã qua.

Vấn đề

Trong autoregressive generation, mỗi token mới phụ thuộc vào tất cả các token trước đó. Attention mechanism tính điểm tương tác bằng công thức Attention(Q, K, V) = softmax(QK^T/√d)V.

Nếu không caching: khi sinh token thứ n, bạn phải tính Key (K) và Value (V) cho cả chuỗi từ 1 đến n từ đầu. Độ phức tạp là O(n²) cho mỗi bước — với context 128K tokens, đây là 16 tỷ phép tính cho một token duy nhất. Thực tế tệ hơn: bạn đang tính lại đi tính lại cùng một K và V cho những token đã sinh từ 999 bước trước, chỉ để lấy thêm một kết quả mới.

Hậu quả là latency tăng tuyến tính theo độ dài context. Một model 70B với 100K context sẽ trở nên không sử dụng được khi mỗi token mới mất vài giây để sinh ra, trong khi GPU đang bận 99% thời gian để tính lại những gì nó đã biết.

Ý tưởng cốt lõi

Quá khứ là bất biến trong causal attention.

Trong autoregressive models, mỗi token chỉ nhìn thấy những gì đứng trước nó (causal masking). Token thứ 5 sẽ không bao giờ cần cập nhật lại Key hay Value của mình khi token thứ 1000 xuất hiện, vì nó không "biết" tương lai tồn tại. Mối quan hệ giữa token 5 và các token 1-4 là cố định vĩnh viễn.

KV Cache khai thác điều này bằng cách tính một lần, dùng mãi mãi:

  1. Prefill phase: Xử lý toàn bộ input prompt một lần, tính K và V cho tất cả các token, lưu vào GPU memory.
  2. Decode loop: Khi sinh token mới, chỉ tính Query (Q) cho token đó. Sau đó tính attention score giữa Q mới và toàn bộ K đã cache, weighted sum với toàn bộ V đã cache.
  3. Append: Tính K và V cho token vừa sinh ra, thêm vào cache, lặp lại.

Đây chính là "aha moment": bạn đang biến bài toán từ "mỗi token tính lại cả chuỗi" thành "chỉ tính thêm một bước". Compute cost mỗi token giảm từ O(n²) xuống O(n) cho memory access và O(1) cho compute thực sự (vì K, V đã có sẵn).

Hãy tưởng tượng một hội đồng chuyên gia họp kiểu "panel discussion":

  • Không có KV Cache: Mỗi khi có thành viên mới vào phòng, cả 1000 người cũ phải đứng lên tự giới thiệu lại từ đầu (O(n²) bắt tay).
  • Có KV Cache: Các chuyên gia cũ viết lý lịch (K) và ý kiến (V) lên bảng trắng một lần. Thành viên mới chỉ cần đọc bảng, viết thêm thông tin của mình, rồi đặt câu hỏi (Q). Không ai cần giới thiệu lại.

Query là cái thay đổi (câu hỏi mới), còn Key và Value là bất biến (thông tin đã ghi).

Tại sao nó hoạt động

Cơ chế này hoạt động nhờ tính chất bất biến nhân quả (causal immutability) của decoder-only transformers. Causal mask đảm bảo rằng K và V tại vị trí i chỉ phụ thuộc vào tokens 1...i, không bao giờ phụ thuộc tokens i+1 trở đi. Do đó, khi ta thêm token mới vào cuối, K và V của các token cũ không đổi — chúng là hằng số đối với tương lai.

Mathematically, attention là weighted average: output = Σᵢ softmax(q_new · k_i) × v_i. Ta không cần tính lại k_i và v_i cho i < n, vì chúng đã được tính ở bước trước và lưu trong tensor. Chỉ cần tính dot product giữa q_new và cache cũ — phép nhân vector-matrices thay vì phép nhân matrices đầy đủ.

Tuy nhiên, điều này tạo ra memory wall mới: để tránh tính lại, ta phải lưu trữ toàn bộ K và V trong VRAM. Với model 70B, context 100K tokens, KV Cache chiếm hơn 80GB bộ nhớ — lớn hơn cả trọng lượng model. Đây là lý do các kỹ thuật như PagedAttention (quản lý cache như virtual memory) và KV Cache Quantization (nén xuống 3-4 bit) trở nên thiết yếu.

Ý nghĩa thực tế

Trade-off bản chất: KV Cache đổi compute lấy memory. Bạn trả giá bằng GB VRAM để mua lại tốc độ sinh token không đổi (constant time per token), bất kể context dài bao nhiêu. Không có kỹ thuật này, long-context inference (100K+ tokens) là bất khả thi về mặt kinh tế.

Hiệu quả thực tế:

  • Throughput: vLLM với KV Cache tối ưu đạt throughput cao hơn 23× so với HuggingFace Transformers baseline trên cùng phần cứng, nhờ giảm waste từ 70% xuống dưới 4% khi kết hợp với PagedAttention.
  • Nén hiện đại: KVTC đạt 20× compression với < 1% accuracy loss trên Llama 3; NVIDIA NVFP4 giảm 3× latency và tăng 20% cache hit rate.
  • Giới hạn: Cache chỉ tồn tại trong session — nếu user bắt đầu chat mới hoặc thay đổi system prompt, cache bị xóa. Đây là lý do Prefix Caching (cache system prompt dùng lại cho nhiều request) quan trọng cho production RAG.

Ai đang dùng: Universal trong production serving — từ OpenAI GPT-4, Anthropic Claude, đến open-source stack (vLLM, SGLang, llama.cpp, TensorRT-LLM). Không có KV Cache, không có real-time chatbot.

Limitations thực tế:

  • Memory wall: Context 1M tokens trên Llama 3 70B đòi hỏi hàng trăm GB VRAM chỉ cho KV Cache, chưa kể weights.
  • Prefill bottleneck: Cache chỉ giúp decode phase (sinh token). Xử lý prompt dài ban đầu (prefill) vẫn tốn compute và latency.
  • Session-local: Cache mất khi kết thúc session. Multi-turn chat với lịch sử dài dần sẽ tiêu tốn memory tuyến tính.

Đào sâu hơn

Paper gốc:

  • "KV Cache Transform Coding for Compact Storage in LLM Inference" (arXiv:2511.01815, 2026) — KVTC, nén cache 20×.
  • "SCBench: A KV Cache-Centric Analysis of Long-Context Methods" (arXiv:2412.10319, 2024) — benchmark tập trung vào KV Cache patterns.

Cùng cụm (Inference Optimization):

Đọc tiếp:

On this page