Cách tính xem một chiếc GPU thật sự chạy được những gì
Câu hỏi tôi nhận được nhiều nhất, dưới dạng này hay dạng khác: “Bọn tôi có một chiếc card N gigabyte. Chạy được cái gì trên đó?”
Không ai trả lời được câu đó chỉ từ tên mô hình, và các bảng benchmark công bố kèm theo mỗi lần ra mắt mô hình cũng chẳng giúp gì — chúng được đo trên phần cứng bạn không có, ở kích thước lô và độ dài ngữ cảnh bạn sẽ không dùng. Nhưng phép tính đủ đơn giản để làm trên một tờ giấy nháp, và nó sẽ cho bạn câu trả lời trước khi bạn tiêu một đồng nào.
Có ba thứ tiêu thụ VRAM. Phần lớn mọi người chỉ dự trù cho thứ đầu tiên.
1. Trọng số
Phần dễ. Số tham số × số byte cho mỗi tham số:
| Độ chính xác | Byte/tham số | Mô hình 8B | Mô hình 32B |
|---|---|---|---|
| BF16 | 2 | 16 GB | 64 GB |
| INT8 / FP8 | 1 | 8 GB | 32 GB |
| 4-bit | ~0,5 | ~4,5 GB | ~18 GB |
4-bit không đúng bằng 0,5 byte — các phương án lượng tử hóa vẫn giữ một số tensor ở độ chính xác cao hơn và mang theo hệ số tỉ lệ — nên hãy dự trù thêm 10–15% so với con số ngây thơ ở trên.
Mô hình mixture-of-experts phá vỡ trực giác ở đây. Một mô hình MoE quảng cáo tổng số tham số rất lớn nhưng chỉ kích hoạt một phần nhỏ cho mỗi token. Điều đó giúp ích rất nhiều cho năng lực tính toán và thông lượng của bạn. Nó không giúp gì cho VRAM: bạn vẫn phải giữ toàn bộ các chuyên gia trong bộ nhớ, vì bạn không biết trước token kế tiếp sẽ cần đến những chuyên gia nào. Một mô hình MoE với số tham số kích hoạt nhỏ thì nhanh trên phần cứng khiêm tốn, chứ không nhỏ trên đó.
2. KV cache — đây mới là thứ hạ gục bạn
Mỗi token trong cửa sổ ngữ cảnh đều để lại phần key và value được cache cho từng lớp. Ước lượng:
kv_bytes ≈ 2 × số_lớp × kv_heads × head_dim × byte_mỗi_phần_tử × seq_len × batch
Số 2 là key cộng value. Có hai chi tiết cực kỳ quan trọng:
- Là
kv_heads, không phải số attention head. Các mô hình dùng grouped-query attention chia sẻ KV head giữa nhiều query head, thường ít hơn 4–8 lần. Đây là đòn bẩy lớn nhất tác động lên kích thước cache, và nó khác nhau rất nhiều giữa những mô hình có cùng số tham số. - Nó tỉ lệ với
seq_len × batch. Tuyến tính, ở cả hai chiều. Mười người dùng đồng thời ở ngữ cảnh 32k tốn đúng bằng một người dùng ở ngữ cảnh 320k.
Đây là lý do một mô hình nạp lên thì bình thường nhưng lại liên tục hết bộ nhớ khi có tải. Trọng số thì vừa. Trọng số luôn vừa. Thứ không vừa là mười hai người dùng cùng lúc với tài liệu dài trong prompt — mà với một hệ thống RAG thì đó là mọi yêu cầu.
Lượng tử hóa KV cache xuống 8-bit sẽ giảm nó đi một nửa, và thường là đánh đổi tốt hơn nhiều so với việc lượng tử hóa trọng số sâu thêm nữa.
3. Mọi thứ còn lại
Activation, CUDA graph, phân mảnh bộ nhớ, và phần chi phí của chính framework phục vụ mô hình. Hãy chừa lại 10–15% dung lượng card. Những nền tảng phục vụ có cơ chế cấp phát trước một vùng KV sẽ vui vẻ nhận hết những gì bạn đưa, rồi gục ngay ở yêu cầu dài đầu tiên.
Làm thế nào trong thực tế
Hãy tính ngược từ tác vụ, đừng tính xuôi từ mô hình:
- Xác định độ dài ngữ cảnh thật của bạn. Không phải mức tối đa của mô hình — mà của bạn. Với phần lớn hệ thống RAG thì con số là 8k–32k, do số đoạn văn bạn truy xuất quyết định, chứ không phải do tham vọng.
- Xác định mức đồng thời thật của bạn. Số yêu cầu đang xử lý đồng thời ở đỉnh, mà với một công cụ nội bộ 50 người dùng thì thường gần với 5 hơn là 50.
- Tính ngân sách KV cho hai con số đó.
- Phần còn lại, trừ đi 15% dự phòng, chính là ngân sách cho trọng số. Giờ mới chọn mô hình và mức lượng tử hóa vừa với nó.
Những đội đi theo chiều ngược lại sẽ chọn mô hình lớn nhất còn nạp được, rồi phát hiện cache chẳng còn chỗ nào để nằm, và kết luận rằng họ cần một chiếc card lớn hơn. Thường thì thứ họ cần là một mô hình nhỏ hơn và KV ở mức 8-bit.
Đừng quên những mô hình nhỏ
Một hệ thống truy xuất không chỉ có mô hình chat. Mô hình embedding và mô hình xếp hạng lại cũng phải nằm ở đâu đó — thường là thêm vài GB nữa, và chúng nằm ngay trên đường đi nóng của mọi truy vấn. Nếu chúng dùng chung card với mô hình sinh văn bản, hãy dự trù cho chúng một cách tường minh thay vì phát hiện ra chúng lúc triển khai.
Bản rút gọn
Lấy dung lượng VRAM của card. Trừ đi 15% dự phòng. Trừ đi KV cache ứng với độ dài ngữ cảnh thật nhân với mức đồng thời thật của bạn. Trừ đi mô hình embedding và mô hình xếp hạng lại. Phần còn lại là những gì bạn được phép tiêu cho trọng số.
Hãy chạy phép tính đó trước khi mua phần cứng, đừng làm sau. Đó là khác biệt giữa một hệ thống bị âm thầm bỏ xó và một hệ thống mà mọi người tiếp tục dùng.