KV Cache
Bộ nhớ đệm KV
LLM sinh text từng token một. Khi sinh token thứ 100, nó cần tính attention giữa token 100 với tất cả 99 token trước. Phải tính LẠI attention cho 99 token cũ không?
Hình minh họa
Sinh câu: "Hà Nội là thủ đô"
Nhấn "Sinh token tiếp" để xem AI sinh từng token. So sánh số phép tính có/không cache.
Tính LẠI tất cả mỗi bước
Chỉ tính cho token mới
Bên trong KV Cache
Sinh token đầu tiên "Hà":
Tính Q₁, K₁, V₁ cho "Hà". Attention: Q₁ × K₁ᵀ → softmax → × V₁. Lưu K₁, V₁ vào cache.
KV Cache tăng dần mỗi token → tốn bộ nhớ. Context 200K token sẽ tốn cache rất lớn. Giải pháp nào được dùng phổ biến?
Giải thích
KV Cache là kỹ thuật tối ưu inference cho Transformer, lưu lại Key và Value tensor đã tính trong lớp self-attention để tránh tính lại khi sinh mỗi token mới. Độ lớn cache tỉ lệ thuận với context window — đây cũng chính là yếu tố giới hạn độ dài context của LLM.
# Pseudocode minh họa KV Cache
kv_cache = {"keys": [], "values": []}
for token in generated_tokens:
# Tính Q, K, V cho token mới
q_new = compute_query(token)
k_new = compute_key(token)
v_new = compute_value(token)
# Thêm vào cache
kv_cache["keys"].append(k_new)
kv_cache["values"].append(v_new)
# Attention dùng TẤT CẢ keys/values từ cache
all_keys = torch.stack(kv_cache["keys"])
all_values = torch.stack(kv_cache["values"])
# Chỉ cần 1 query mới × tất cả keys
attention = softmax(q_new @ all_keys.T / sqrt(d))
output = attention @ all_values- KV Cache lưu Key và Value đã tính, tránh tính lại khi sinh token mới
- Giảm từ O(n²) xuống O(n) phép tính — tiết kiệm ~99% ở token thứ 100
- Đánh đổi: tốn bộ nhớ GPU — cache tăng dần theo context length
- GQA/MQA giảm cache 4-8 lần bằng cách chia sẻ K,V giữa attention heads
Kiểm tra hiểu biết
KV Cache tiết kiệm tính toán bằng cách nào?