Công thức tính VRAM
Mọi bài toán định cỡ GPU đều quy về một phương trình:
Trong đó chỉ có hai công thức thật, còn overhead là ước lượng.
1. Model Weights
| Precision | Bytes/tham số | Model 7B | 70B |
|---|---|---|---|
| FP32 | 4,0 | 28 GB | 280 GB |
| FP16 / BF16 | 2,0 | 14 GB | 140 GB |
| FP8 / INT8 | 1,0 | 7 GB | 70 GB |
| Q8_0 | ~1,06 | 8,5 GB | ~75 GB |
| Q6_K | ~0,81 | 6,3 GB | ~57 GB |
| Q5_K_M | ~0,69 | 5,5 GB | ~48 GB |
| Q4_K_M ★ | ~0,55 | 4,7 GB | ~38,5 GB |
| Q3_K_M | ~0,43 | 3,9 GB | ~30 GB |
| Q2_K | ~0,31 | 3,0 GB | ~22 GB |
Q4_K_M là điểm ngọt: giữ khoảng 95% chất lượng, giảm gần 4 lần bộ nhớ.
MoE — điểm dễ hiểu nhầm nhất
Với model MoE phải phân biệt hai con số:
| Ý nghĩa | Dùng để tính | |
|---|---|---|
| Total params | Toàn bộ trọng số | VRAM — mọi expert phải nằm trong VRAM |
| Active params | Số tham số dùng cho 1 token | Tốc độ — chi phí tính toán |
Ví dụ Qwen3.5-35B-A3B: sinh token nhanh như model 3B, nhưng vẫn phải nạp đủ 35B vào VRAM.
2. KV Cache
Để sinh token thứ 100, model phải "nhìn" cả 99 token trước. Không cache thì mỗi bước phải tính lại Key/Value cho toàn bộ lịch sử — O(n²). Cache biến nó thành O(n).
| Thừa số | Nghĩa | Ghi chú |
|---|---|---|
2 | Key + Value | luôn là 2 |
Layers | Số layer transformer | mỗi layer giữ KV riêng |
KV Heads | Số head sau GQA/MQA | KHÔNG phải query head |
Head Dim | Chiều mỗi head | 128 không còn là chuẩn — xem Cạm bẫy kiến trúc |
Seq | Độ dài context | tuyến tính |
Batch | Số request đồng thời | tuyến tính |
Ví dụ — Llama 3.1 8B
layers=32, kvHeads=8, headDim=128, FP16
| Context | KV Cache | % của tổng (weights Q4 = 4,7 GB) |
|---|---|---|
| 4K | 0,54 GB | ~10% |
| 8K | 1,07 GB | ~18% |
| 32K | 4,29 GB | ~46% |
| 128K | 17,18 GB | ~77% |
Ở 128K, KV cache lớn hơn cả trọng số model. Đây là lý do model chạy tốt ở 8K lại OOM ở 128K.
GQA tiết kiệm bao nhiêu?
Llama 3.1 8B có 32 query head nhưng chỉ 8 KV head → KV giảm 4 lần so với MHA. Công thức tự tính đúng nếu dùng đúng số KV head.
3. Runtime Overhead
| Thành phần | Dung lượng |
|---|---|
| CUDA context | ~300–500 MB |
| Activation memory | ~200–500 MB |
| Framework buffers | ~200 MB (llama.cpp) → ~1 GB (vLLM batch lớn) |
Quy tắc: giữ 5–10% VRAM làm headroom. Công cụ này dùng
max(1,2 GB; weights × 7%) để không quá thấp với model lớn.
4. Tốc độ sinh token
Decode là memory-bandwidth-bound: mỗi token phải đọc trọn bộ trọng số active từ VRAM. Nên công thức gốc là:
Số byte mỗi token gồm trọng số active cộng KV cache đọc lại mỗi bước — nên tốc độ giảm khi tăng context. Công cụ tính áp dụng công thức này với hệ số hiệu chỉnh rút từ số đo thật.
1008 ÷ 17,6 ≈ 57 token/giây cho
một luồng. Không phần mềm nào vượt được con số này.