Cửa sổ ngữ cảnh & KV cache
Cửa sổ ngữ cảnh có tấm giá, và nó được trả bằng VRAM. Mỗi token giữ
trong ngữ cảnh buộc mô hình nhớ hai vector nhỏ mỗi tầng, và bộ nhớ ấy —
KV cache — lớn theo từng token và lặng lẽ ăn dư địa bạn tưởng mình có.
Nó giải thích những thất bại LLM-cục-bản lạ lùng nhất: cú OOM ở lượt
thứ bốn mươi, mô hình như chậm dần khi cuộc chat dài ra, card 8 GB chạy
được "ngữ cảnh 128k" trên tờ rơi mà thôi.
Cache lưu những gì
Attention cần phép chiếu khóa và giá trị của mỗi token quá khứ trước khi
chú ý token đó. Chúng được tính một lần trong prefill và giữ suốt đời
request: mỗi tầng, mỗi token, một vector K và một vector V gồm
kv_heads × head_dim số mỗi cái. Kho lưu ấy là KV cache, và đó là lý do
ngữ cảnh tốn bộ nhớ tuyến tính, mãi mãi, cho mọi request đang được phục
vụ.
Công thức
byte mỗi token = 2 (K và V) × tầng × kv_heads × head_dim × 2 byte (fp16)
Ví dụ minh họa, GQA hạng llama-3-8B (32 tầng, 8 đầu KV, head_dim 128):
2 × 32 × 8 × 128 × 2 = 131,072 byte = 128 KB mỗi token.
Ở ngữ cảnh 32k đó là 32,768 × 128 KB ≈ 4 GB KV cache — sánh được với
trọng số Q4 ngồi cạnh. Các cấu hình gọn hơn với 4 đầu KV rơi khoảng
2 GB mỗi 32k. Cấp độ lớn cho mô hình hạng 8B ở KV fp16: ngân sách 0.5–4
GB mỗi 32k tùy kiến trúc. Số liệu chính xác cho một checkpoint đến
thẳng từ config.json của nó — num_key_value_heads,num_hidden_layers, và kích thước đầu.
GQA là lý do ngữ cảnh dài rẻ đi
Grouped-query attention dùng chung một nhóm nhỏ đầu KV cho nhiều đầu
query — chẳng hạn 32 đầu query được phục vụ bởi 8 đầu KV — thu nhỏ cache
4 lần so với multi-head attention đầy đủ với chi phí chất lượng không
đáng kể. Không có GQA, bảng dưới đây sẽ to gấp 4–8 lần và ngữ cảnh dài
trên card 24 GB sẽ là chuyện thần tiên. Đó là món quà kiến trúc lớn nhất
cho công việc ngữ-cảnh-dài cục bộ, và là lý do các mô hình 7–9B hiện đại
có cửa sổ 32k–128k để phát hành.
Nó lớn nhanh thế nào
Mô hình GQA hạng 8B ở KV fp16, 128 KB mỗi token:
| Ngữ cảnh | Kích thước KV cache | Trên card 8 GB |
|---|---|---|
| 4k | ~0.5 GB | vô hình |
| 16k | ~2.1 GB | đáng kể cạnh 5 GB trọng số |
| 64k | ~8.4 GB | không vừa, chấm hết |
| 128k | ~16.8 GB | gấp 3 chính mô hình |
Bộ nhớ tăng tuyến tính theo token, nhưng tính toán attention tăng theo
bình phương ngữ cảnh — nên ngữ cảnh dài tốn VRAM và thời-gian-mỗi-token
cùng lúc.
Cần gạt khi KV nổ tung
- Lượng hóa cache. q8_0 giảm một nửa, q4_0 giảm một phần tư, với chi
phí chất lượng khiêm tốn — thường là điểm trao đổi dung lượng tốt nhất
cả chồng tầng. Trong llama.cpp, lượng hóa KV yêu cầu flash attention,
phía dưới. - Phục vụ ngữ cảnh ngắn hơn.
-c 8192chẳng tốn gì nếu prompt của
bạn 2k. Cấp phát nguyên 128k quảng cáo "phòng khi" là giữ VRAM mà bạn
sẽ không bao giờ dùng sản xuất được. - Mô hình sliding-window. Một số kiến trúc chặn cửa sổ KV mỗi tầng
bất chấp ngữ cảnh danh nghĩa — hành vi ngữ-cảnh-dài không hóa đơn
tuyến tính, với chút tổn phí hồi tưởng trên tư liệu cũ. - Flash attention. Về bản chất là lợi ích sức tính và hiệu năng
kernel — attention chính xác mà không bùng nổ kích hoạt bình phương —
và trong llama.cpp nó cũng là cổng mở khóa lượng hóa KV.
llama-server -m model-8b-q4_k_m.gguf -c 65536 -fa --cache-type-k q8_0 --cache-type-v q8_0
Ngữ cảnh quảng cáo vs hiệu dụng
Mô hình quảng cáo 128k sẽ chạy ở 128k — cache vừa và phép toán chạy.
Còn nó có suy luận được ở 128k là một tuyên bố khác. RoPE giãn và tinh
chỉnh ngữ-cảnh-dài giữ điểm tìm-kim cao trong khi khả năng hiểu rộng
thường chùng xuống sớm trước giới hạn. Hãy coi cửa sổ quảng cáo là tối đa
vật lý, giả định chất lượng mềm đi ở nửa sau, và tìm các đánh giá
ngữ-cảnh-dài từ cộng đồng cho đúng checkpoint trước khi cược một quy
trình làm việc lên nó.
Lost in the middle, và thói quen vệ sinh
Thiên lệch vị trí là có thật: mô hình chú ý mạnh nhất vào đầu và cuối
prompt và chùng ở giữa. Đặt chỉ dẫn và sự kiện then chốt đầu tiên hoặc
cuối cùng; đừng chôn cái spec mô hình phải tuân theo trong một tài liệu
dán vào. Những thói quen giữ ngữ cảnh nhỏ và sắc:
- Cắt hoặc tóm tắt các lượt cũ thay vì phát lại cả cuộc chat.
- Truy xuất và tiêm đúng đoạn liên quan, không phải cả tệp.
- Giữ system prompt ngắn; nó được gửi lại với mỗi request.
- Theo dõi VRAM trong phiên dài — sự lớn lên của KV là biến im lặng
(toán VRAM), và các flag phục vụ kiểm soát nó được
liệt kê ở Tham số engine.
Liên quan: toán VRAM · Tham số engine ·
Tốc độ