Chạy chỉ trên CPU
Suy luận chỉ-CPU khả thi, và các con số ít ảm đạm hơn truyền thuyết
gợi ý — miễn là bạn hiểu đây là cùng cuộc chơi băng thông với decode
GPU, chỉ là chơi với một phần mười ống. Một desktop hiện đại DDR5 hai
kênh có ~80–100 GB/s băng thông bộ nhớ. Đó là toàn bộ ngân sách; chẳng
gì ở bản thân các lõi CPU thay đổi được nhiều.
Công thức, tính thử
decode tok/s ≈ băng thông hiệu dụng (GB/s) ÷ kích thước mô hình (GB)
DDR5-5600 hai kênh đạt ~90 GB/s trên giấy; coi là 60–80 GB/s hiệu dụng
sau khi các lõi và prefetcher lấy phần của chúng. Mô hình 8B Q4 nặng
~5 GB, nên:
90 GB/s ÷ 5 GB ≈ 18 tok/s trần lý thuyết → 8–14 tok/s thực tế.
Đó không phải lỗi — đó là cùng phép tính một GPU rời lớn dùng, với một
phần mười băng thông.
Cần chờ đợi gì theo từng phần cứng
| Nền tảng | Băng thông xấp xỉ | Decode 8B Q4 | Cảm giác như |
|---|---|---|---|
| Laptop, DDR4 hai kênh | 40–50 GB/s | 5–8 tok/s | đọc được, khởi động chậm |
| Laptop, DDR5 hai kênh | 60–80 GB/s | 8–12 tok/s | chat dùng được |
| Desktop, DDR5 hai kênh | 80–100 GB/s | 10–16 tok/s | dễ chịu cho ≤8B |
| Threadripper/EPYC, bốn+ kênh | 200–460 GB/s | 30–80 tok/s | thực sự tốt |
| Server hai socket | 400+ GB/s | 60–100 tok/s | gần như RAM-GPU |
Các bậc thoải mái trên desktop hai kênh:
- Dễ chịu: chat và hỗ trợ code 7–8B Q4 ở 10+ tok/s.
- Dùng được: 13–14B Q4 ở ~5–8 tok/s. Phải chờ, nhưng không vô hạn.
- Kiên nhẫn: 24–32B Q4 ở ~2–4 tok/s. Lô qua đêm, không phải chat.
- Đừng: 70B Q4 dưới 1 tok/s trên hai kênh. Chỉ workstation bốn kênh,
và ngay cả vậy cũng nên suy nghĩ lại.
Cửa thoát: offload một phần
Nếu có một GPU nhỏ, llama.cpp tách tầng giữa CPU và GPU — ví dụ 20 trên
32 tầng trên card 8 GB. Phần cư trú trên GPU chạy với băng thông VRAM,
phần còn lại với băng thông RAM, nên tốc độ đáp giữa hai cực. Nó thắng
cả hai chế độ thuần khi trọng số không vừa nguyên vẹn ở đâu, và thắng
cảnh nhìn một "full GPU offload" quật vào bộ nhớ dùng chung.
Prefill mới là nỗi đau thật
Decode nhận hết sự chú ý, nhưng prefill mới là chỗ CPU đau: nó bị chặn
bởi sức tính, và CPU desktop chỉ có một phần nhỏ FLOP của GPU. Một
prompt 4,000-token trên mô hình 8B có thể tốn hàng chục giây trước khi
token đầu xuất hiện. Pipeline kiểu RAG với ngữ cảnh tiêm lớn trả giá
này trên từng request. Cách giảm nhẹ: giữ prompt ngắn, cho prefill theo
lô nhiều luồng hơn decode, và coi việc lập chỉ mục là chi phí một lần
(xem RAG).
Flag thực dụng
# luồng decode = lõi vật lý; prefill theo lô có thể dùng cả lõi logic
llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf -c 8192 -t 8 --threads-batch 16
# máy đa socket: trải bộ nhớ across các node NUMA
numactl --interleave=all ./llama-server -m model.gguf -t 32
# CPU này có SIMD gì? AVX2 là sàn; AVX-512 giúp prefill
lscpu | grep -o 'avx[0-9a-z_]*' | sort -u
-tđặt theo lõi vật lý thường thắng số lõi logic/SMT cho decode;
benchmark cả hai trên máy bạn, điểm giao nhau mang tính tác vụ.- AVX2 là nền ở khắp nơi; AVX-512 (Zen 4/5, Xeon gần đây) cho lợi
prefill thật. llama.cpp phát hiện hỗ trợ lúc build. - Trên máy đa socket, ghim NUMA có thể đáng giá 20%+ — bộ nhớ ở socket
xa là bộ nhớ chậm. - DDR4 laptop mang khoảng một nửa băng thông DDR5 desktop. Cùng công
thức, hằng số tệ hơn: chờ 5–8 tok/s nơi desktop cho 12.
Khi nào chỉ-CPU thực sự là câu trả lời đúng
- Embedding và lập chỉ mục RAG — thông lượng quan trọng, độ trễ thì
không; vài giờ nhúng đoạn qua đêm là miễn phí. - Mô hình tí hon trong script — bộ phân loại, trình trích xuất và
reranker 0.5–3B trả lời trong vài chục mili-giây ngay trên CPU. - Tác vụ nền theo lô — tóm tắt kho tồn ở 3 tok/s lúc bạn ngủ; không
ai xem luồng. - Thử trước khi mua — xác nhận một họ mô hình làm nổi việc trước khi
cam kết mua GPU.
Nếu mục tiêu là chat tương tác và có bất kỳ GPU nào, đặt mô hình lên đó.
Dùng Chạy lần đầu để khởi động hôm nay, và
Tốc độ để hiểu những con số bạn thấy nghĩa là gì.
Liên quan: Chạy lần đầu · Tốc độ ·
RAG