OpenArchLabOpen Architecture — From Models to Systems

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.

LESSON ID kv GROUP Kiến trúc Inference
Mục lục bài học

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

Sơ đồ luồng (4 bước)
  1. Bộ điều phối cần chỗ

    Yêu cầu khối bộ nhớ cho tokens sắp chạy.

  2. Cấp khối và bảng ánh xạ

    Biết mỗi đoạn token nằm ở đâu.

  3. Attention đọc và ghi

    Đọc context cũ, thêm vector của token đã forward.

  4. 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.

7Bài liên quan

8Nguồn