L2 · State management
Bộ nhớ đệm key và value của attention
Vùng bộ nhớ trên GPU lưu các vector Key và Value đã tính của chuỗi token để vòng lặp decode tái sử dụng.
1Định nghĩa
KV cache là vùng bộ nhớ đệm trên accelerator dùng để lưu lại các vector Key và Value của mọi token đã đi qua các lớp Attention. Nhờ giữ lại trạng thái này từ pha prefill và chỉ nối thêm 1 cặp Key/Value mới ở mỗi bước decode, mô hình tránh được việc phải tính lại toàn bộ các token đứng trước.
Dung lượng KV cache phình lên theo số lớp, số đầu Key/Value (thường được rút gọn bằng GQA hoặc MLA), số request chạy đồng thời và độ dài ngữ cảnh. Để tránh phân mảnh bộ nhớ HBM khi độ dài câu trả lời không biết trước, các engine như vLLM hay SGLang quản lý KV cache theo từng khối cố định (paged attention, tương tự trang bộ nhớ ảo của hệ điều hành) và cho phép nhiều request dùng chung các khối đầu câu (prefix caching).
Ví dụ đời thường: KV cache giống như cuốn sổ nháp đặt ngay trên bàn làm việc khi bạn đang giải một bài toán dài nhiều bước. Nhờ ghi lại kết quả tóm tắt của các bước trước vào sổ nháp, ở mỗi bước tính tiếp theo bạn chỉ việc mở sổ nhìn lại ngay lập tức thay vì phải đọc và cộng lại toàn bộ đề bài từ dòng đầu tiên.
2Luồng
- Bộ điều phối cần chỗ
Yêu cầu khối bộ nhớ cho tokens sắp chạy.
- Cấp khối và bảng ánh xạ
Biết mỗi đoạn token nằm ở đâu.
- Attention đọc và ghi
Đọc context cũ, thêm vector của token đã forward.
- Giữ lại hoặc giải phóng
Sau request, áp chính sách reuse và isolation.
Mã Mermaid
flowchart TD
step1["Bộ điều phối cần chỗ"]
step2["Cấp khối và bảng ánh xạ"]
step3["Attention đọc và ghi"]
step4["Giữ lại hoặc giải phóng"]
step1 --> step2
step2 --> step3
step3 --> step4 3Giải pháp
PagedAttention trong vLLM tổ chức cache theo block thay vì yêu cầu một vùng liên tục lớn cho từng chuỗi. Prefix caching có thể tránh tính lại phần prompt chung.
Khi gần hết bộ nhớ, engine phải chọn dừng nhận, tạm dừng request, xóa cache hoặc chuyển state tùy stack. Paging giảm lãng phí cấp phát nhưng không xóa chi phí đọc context dài.
Để xem bảng block nối block logic với block vật lý rời rạc, rồi block được trả và dùng lại, hãy chạy khối 6 (KV state manager) trong Bài Lab tổng hợp.
4Profiling
- Dung lượng mỗi active token
Ước lượng từ số lớp, key-value heads, chiều vector và bytes mỗi phần tử; đối chiếu bộ nhớ thực tế sau overhead.
- Hiệu quả cache
Đo blocks dùng/cấp, hit rate, eviction và thời gian tính lại; so cùng workload để tránh hit rate cao nhưng latency xấu.
Mẹo đo lường: ghim số liệu trên workload thật, ghi cả p50/p95/p99 thay vì chỉ trung bình, và luôn ghi lại điều kiện chạy (batch, cache, đồng thời, phần cứng) trước và sau khi tối ưu. Số đo thiếu điều kiện chạy thì không so sánh được.
5Ví dụ
Nhiều chat cùng system prompt
Prefix cache có thể dùng lại vector của hướng dẫn chung; phần hội thoại riêng vẫn cần state riêng.
Context dài và nhiều người dùng
Từng request giữ nhiều vector hơn. Phải giảm số chuỗi đồng thời hoặc dùng cách biểu diễn/partition phù hợp để tránh hết bộ nhớ.
6Thuật ngữ
- Key-value cache
- Bộ nhớ lưu các vector key và value của context tại từng lớp.
- Paged allocation
- Cấp phát thành các khối; bảng ánh xạ nối vị trí token với khối bộ nhớ vật lý.
- Prefix reuse
- Dùng lại cache của phần đầu chuỗi token giống nhau khi model state và policy cho phép.
Glossary (4)
- Model weights
- Các tham số số học được học và lưu trong checkpoint.
- Latency
- Thời gian chờ để nhận một kết quả hoặc một bước kết quả.
- Overhead
- Chi phí phụ như điều phối, chuyển đổi hoặc phát lệnh ngoài phép tính chính.
- Forward pass
- Tính kết quả model từ đầu vào theo weights hiện tại.