Định tuyến top-k và tham số hoạt động
Định tuyến top-k và tham số hoạt động
Một mô hình khoe 671 tỉ tham số nhưng nói mỗi token chỉ dùng 37 tỉ. Nghe như quảng cáo. Thực ra cả hai con số đều dựng lại được từ tệp cấu hình mà mô hình công bố, bằng phép nhân bạn tự làm được, và bài này bắt bạn làm.
Ở chương trước bạn thấy chi phí sinh chữ nằm ở bộ nhớ chứ không ở phép tính. Bài này sang một chỗ khác của cùng mô hình: khối feed-forward. Trong một transformer dày, khối này chiếm phần lớn tham số, và mọi token đều chạy qua toàn bộ nó. Muốn mô hình biết nhiều hơn thì phải làm khối đó to ra, mà to ra thì mỗi token lại tốn thêm đúng bằng ngần ấy.
Trộn chuyên gia cắt sợi dây buộc hai chuyện đó lại với nhau. Thay vì một khối feed-forward duy nhất, mỗi lớp giữ nhiều chuyên gia cùng hình dạng, và một bộ định tuyến nhỏ chọn ra vài chuyên gia cho mỗi token. Kho kiến thức lớn lên theo số chuyên gia, còn chi phí mỗi token chỉ lớn lên theo số chuyên gia được chọn. Từ đó có hai con số hoàn toàn khác nhau mà người ta hay nhét vào cùng một chỗ.
Bảng tính dưới đây tách hai con số đó ra và cho bạn tự đẩy chúng đi hai hướng.
| Thành phần | Có trong bộ nhớ | Chạy cho một token |
|---|---|---|
| 58 lớp MoE | 656,46 tỉ | 22,99 tỉ |
| 3 lớp dày | 1,19 tỉ | 1,19 tỉ |
| attention, 61 lớp | 11,41 tỉ | 11,41 tỉ |
| nhúng vào và đầu ra | 1,85 tỉ | 1,85 tỉ |
| ma trận cổng định tuyến | 106,43 triệu | 106,43 triệu |
| cộng lại | 671,03 tỉ | 37,55 tỉ |
Một chuyên gia đáng giá bao nhiêu
Bắt đầu từ đơn vị nhỏ nhất. Một chuyên gia là một khối feed-forward có cổng, tức ba ma trận chứ không phải hai: ma trận cổng, ma trận đi lên, ma trận đi xuống. Cả ba đều nối chiều mô hình với chiều trong, nên:
một chuyên gia = 3 × chiều mô hình × chiều trong
Với DeepSeek-V3 đang mở sẵn trong bảng, chiều mô hình là 7.168 và chiều trong của một chuyên gia là 2.048:
3 × 7.168 × 2.048 = 44.040.192
Khoảng 44 triệu tham số. Nhỏ đến bất ngờ, và đó là chủ ý: chuyên gia trong MoE thường hẹp hơn nhiều so với lớp dày tương ứng, vì mỗi lớp có hàng trăm cái như vậy.
Một lớp MoE phải chứa hết. 256 chuyên gia định tuyến cộng 1 chuyên gia chia sẻ là 257:
257 × 44.040.192 = 11.318.329.344
Hơn 11 tỉ tham số cho một lớp. Mô hình có 61 lớp, trong đó 3 lớp đầu vẫn là lớp dày (first_k_dense_replace bằng 3), nên còn 58 lớp MoE:
58 × 11.318.329.344 = 656.463.101.952
Cộng nốt bốn thứ còn lại là ra đúng 671 tỉ
Chuyên gia là phần lớn nhất nhưng không phải tất cả. Bốn thành phần còn lại đều tính được từ chính tệp config.json mà mô hình công bố, không phải đoán.
Attention. DeepSeek-V3 dùng multi-head latent attention, tức là không chiếu thẳng từ dòng residual sang các đầu mà đi xuống một không gian tiềm ẩn hạng thấp rồi đi lên lại. Vì vậy có năm ma trận chứ không phải bốn, và cả năm kích thước đều nằm trong config.json:
q_a_proj : 7.168 × 1.536 = 11.010.048
q_b_proj : 1.536 × 128 × (128 + 64) = 37.748.736
kv_a_proj : 7.168 × (512 + 64) = 4.128.768
kv_b_proj : 512 × 128 × (128 + 128) = 16.777.216
o_proj : 128 × 128 × 7.168 = 117.440.512
-----------
187.105.280
Nhân 61 lớp được 11.413.422.080. Bảng in đủ năm số hạng này ngay dưới các dòng công thức khi bạn đang ở preset DeepSeek-V3.
Nhúng vào và đầu ra. Hai bảng riêng biệt, mỗi bảng cỡ từ vựng × chiều mô hình:
2 × 129.280 × 7.168 = 1.853.358.080
Ba lớp dày dẫn đầu. Cùng ba ma trận như một chuyên gia, nhưng ở chiều trong 18.432:
3 × 3 × 7.168 × 18.432 = 1.189.085.184
Ma trận cổng của bộ định tuyến. Đây là thứ hay bị quên. Mỗi lớp MoE cần một ma trận chiều mô hình × số chuyên gia để chấm điểm:
58 × 7.168 × 256 = 106.430.464
Cộng cả năm:
| Thành phần | Tham số |
|---|---|
| chuyên gia MoE, 257 × 58 lớp | 656.463.101.952 |
| attention MLA × 61 lớp | 11.413.422.080 |
| nhúng vào và đầu ra | 1.853.358.080 |
| FFN dày × 3 lớp | 1.189.085.184 |
| ma trận cổng định tuyến | 106.430.464 |
| tổng | 671.025.397.760 |
671.025.397.760. Con số mô hình được công bố là 671 tỉ. Lệch 25 triệu tham số, tức 0,004%. Đây không phải trùng hợp: bảng này không lấy con số công bố ở đâu cả, nó cộng từ các trường trong config.json, và cái ra được đúng bằng cái người ta ghi trên bìa.
Còn mỗi token thì trả bao nhiêu
Cùng cấu hình đó, một token chỉ chạy qua k chuyên gia định tuyến cộng chuyên gia chia sẻ. Ở đây k là 8, chia sẻ là 1, nên 9 chuyên gia:
58 × 9 × 44.040.192 = 22.988.980.224
Bốn thành phần kia thì chạy cho mọi token, không có gì để bỏ bớt: attention, hai bảng nhúng, ba lớp dày, và cả ma trận cổng, vì bộ định tuyến phải chấm điểm toàn bộ 256 chuyên gia mới biết chọn ai. Cộng lại:
22.988.980.224 + 11.413.422.080 + 1.853.358.080 + 1.189.085.184 + 106.430.464
= 37.551.276.032
37,55 tỉ, so với con số 37 tỉ thường được trích. Có một cách kiểm chéo rất gọn: lấy tổng trừ đi các chuyên gia không nổ. Mỗi lớp MoE có 248 chuyên gia ngồi không:
671.025.397.760 − 58 × 248 × 44.040.192 = 671.025.397.760 − 633.474.121.728
= 37.551.276.032
Đúng con số cũ. Hai đường tính hoàn toàn khác nhau gặp nhau ở một chỗ, đó là dấu hiệu phép kế toán không có lỗ.
Tỉ lệ thưa là 17,9×, và mỗi token dùng 5,60% số tham số.
Hai cái núm đi hai hướng
Chỗ đáng dừng lại nằm ở đây. Kéo thanh số chuyên gia định tuyến từ 256 xuống 32: tổng tụt từ 671,03 tỉ còn 98,76 tỉ, trong khi ô tham số hoạt động gần như không nhúc nhích, từ 37,55 tỉ xuống 37,46 tỉ. Nó có động, nhưng chỉ động đúng 93.126.656 tham số, tức phần cột bị cắt khỏi các ma trận cổng (58 × 7.168 × 224). Đó là 0,25% của con số hoạt động, trong khi tổng mất đi 85%.
Rồi làm ngược lại: trả về 256 và kéo k từ 8 xuống 1. Tổng đứng yên tuyệt đối ở 671,03 tỉ trong khi hoạt động tụt còn 19,67 tỉ và tỉ lệ thưa vọt lên 34,1×. Kéo k lên 16 thì hoạt động thành 57,99 tỉ, lớn hơn cả một mô hình dày 50 tỉ, mà tổng vẫn không đổi một tham số nào.
Hai cái núm, hai con số, gần như không cái nào chạm vào cái kia. Đó là toàn bộ ý tưởng của MoE gói trong một câu: kho kiến thức đi theo số chuyên gia, hoá đơn mỗi token đi theo k. Ngoại lệ duy nhất là ma trận cổng, và nó nhỏ đến mức không đổi được kết luận.
Có một cái trần cho tỉ lệ thưa, bảng in ngay dưới ô tỉ lệ. Nếu chỉ nhìn phần chuyên gia thì tỉ lệ đúng bằng:
(số chuyên gia + chia sẻ) / (k + chia sẻ) = 257 / 9 = 28,6
Tỉ lệ thật là 17,9 chứ không phải 28,6, và khoảng cách đó là bốn thành phần luôn chạy: chúng chỉ làm mẫu số to lên. Kéo k lên đúng 256 thì mọi chuyên gia đều nổ, tỉ lệ về đúng 1,0 và ô hoạt động trùng khít ô tổng: mô hình thưa vừa biến thành mô hình dày.
Bộ định tuyến chọn ai, và với trọng số nào
Hình trong bảng vẽ đúng một token. Với mỗi chuyên gia, bộ định tuyến sinh một điểm cổng; bảng xếp các chuyên gia theo điểm giảm dần, tô đậm k cái trên cùng và in trọng số trộn của chúng ở cột phải. Đổi k là thấy vạch cắt trượt lên xuống và tập thắng đổi theo. Đổi token đang định tuyến sang 1 là cả tám cái tên đổi hết: token 0 chọn 35, 185, 25, 212, 60, 202, 72, 209, token 1 chọn 24, 85, 52, 104, 146, 113, 98, 60.
Có hai cách biến điểm thô thành điểm, và bảng cho bạn bật qua lại.
Softmax ép điểm của toàn bộ 256 chuyên gia cộng lại bằng 1. Nên khi bạn lấy top-8, tám cái đó chỉ giữ một phần nhỏ của cái bánh: tắt chuẩn hoá lại và bảng ghi tổng trọng số 0,4857, tức tám chuyên gia thắng chỉ nắm 48,57% khối lượng, 248 chuyên gia còn lại giữ phần kia. Bật chuẩn hoá lại thì tám trọng số ấy cộng về 1 mà vẫn rất chênh nhau: 0,3595 / 0,2290 / 0,1187 / 0,0878 / 0,0554 / 0,0519 / 0,0492 / 0,0485.
Sigmoid thì khác hẳn: mỗi chuyên gia có một cổng riêng, không ai ràng buộc ai. Tổng điểm của cả 256 chuyên gia là 128,351, chẳng gần 1 chút nào. Và vì sigmoid bão hoà, tám cái đứng đầu đều dính sát trần: điểm cao nhất là 0,995. Tắt chuẩn hoá lại thì tổng trọng số của tám cái thắng là 7,8326, tức đầu ra của lớp bị nhân lên gần tám lần so với một lớp dày bình thường.
Đó chính là lý do DeepSeek-V3 có cờ norm_topk_prob. Bật nó lên, trọng số của k cái thắng được chia lại cho tổng của chính chúng, nên cộng lại đúng 1 dù hàm điểm là gì. Bảng in tổng ngay dưới hình để bạn kiểm: bật thì 1,0000, tắt thì 7,8326 với sigmoid và 0,4857 với softmax.
Một hệ quả dễ bỏ qua: với sigmoid, sau khi chuẩn hoá lại tám trọng số gần như bằng nhau, 0,1271 / 0,1268 / 0,1259 / 0,1253 / 0,1240 / 0,1238 / 0,1236 / 0,1235. Softmax giữ được độ chênh, sigmoid thì san phẳng. Hai lựa chọn đó là quy ước thiết kế của từng mô hình, không phải cái nào đúng cái nào sai, và bảng này không đo được cái nào huấn luyện tốt hơn.
Thưa không miễn phí: chỗ sinh viên nhầm nhiều nhất
Đây là phần quan trọng nhất của bài, và nó nằm ở cái thẻ màu đỏ.
Mỗi token chỉ dùng 37,55 tỉ tham số. Nhưng bộ định tuyến không biết trước token tiếp theo sẽ gọi ai, nên toàn bộ 671,03 tỉ tham số phải nằm sẵn trong bộ nhớ. Ở FP8, một byte mỗi tham số, đó là 624,94 GiB, tức 8 thẻ 80 GiB. Nếu bạn tính theo phần hoạt động thì ra 34,97 GiB và kết luận một thẻ là đủ. Sai gấp tám lần, và là kiểu sai làm hỏng cả một bản dự toán hạ tầng.
Đổi byte mỗi tham số sang BF16: 1,22 TiB, 16 thẻ. Đổi sang INT4: 312,47 GiB, 4 thẻ. Đổi VRAM một thẻ sang 24 GiB: 27 thẻ. Con số hoạt động 37,55 tỉ không đổi trong suốt lúc đó, vì nó không liên quan gì tới chuyện chứa.
Nói cho gọn: thưa làm mỗi token rẻ đi, không làm mô hình nhẹ đi. MoE mua tốc độ bằng bộ nhớ, và đó là một cuộc đổi chác chứ không phải bữa trưa miễn phí.
Vài thứ khác đáng nghịch
Chuyên gia chia sẻ. Đặt số chuyên gia chia sẻ về 0: tổng còn 668,47 tỉ, hoạt động còn 35,00 tỉ, và trần tỉ lệ nhảy từ 28,6 lên đúng 32, vì 256 / 8 bằng 32. Một chuyên gia chia sẻ được lưu một lần nhưng chạy mọi lần, nên nó lấy đi 2.554.331.136 tham số ở cả hai cột, giống hệt nhau. Bài kế tiếp trong chương nói kỹ chuyện này.
Lớp dày dẫn đầu. Đặt số lớp đầu để dày về 0: cả 61 lớp thành MoE, tổng lên 703,80 tỉ và cần 655,46 GiB, tức 9 thẻ thay vì 8. Ô hoạt động chỉ nhích lên đúng 5.505.024 tham số, và đó là ba ma trận cổng mới (3 × 7.168 × 256) chứ không phải phần feed-forward. Phần feed-forward hoạt động không đổi một chút nào, vì có một trùng hợp đẹp: DeepSeek chọn chiều trong của chuyên gia là 2.048 và của lớp dày là 18.432, mà 9 × 2.048 đúng bằng 18.432. Nghĩa là chín chuyên gia hoạt động của một lớp MoE tốn đúng bằng một lớp dày. Đổi chiều trong của lớp dày sang 9.216 rồi thử lại thì trùng hợp đó biến mất.
Kéo số lớp đầu để dày lên 61 thì không còn lớp MoE nào, cũng không còn ma trận cổng nào: mô hình thành một mô hình dày 37,44 tỉ tham số, tỉ lệ thưa về đúng 1,0 và bảng nói thẳng điều đó ra.
Mixtral. Bấm preset Mixtral-8x7B-v0.1: 8 chuyên gia, chọn 2, không có chuyên gia chia sẻ, không có lớp dày dẫn đầu, attention thường bốn phép chiếu nên 41.943.040 mỗi lớp. Bảng ra 46,70 tỉ tổng và 12,88 tỉ hoạt động, so với con số công bố 46,7 tỉ và 12,9 tỉ. Lại khớp. Trần tỉ lệ đúng bằng 8 / 2 = 4, và mỗi token dùng 27,58% số tham số, so với 5,60% của DeepSeek-V3. Cùng một cơ chế, hai mức thưa cách nhau gần một bậc.
Sim này nói được gì và không nói được gì
Phần này phải nói thẳng, vì một phép đếm đúng vẫn dễ bị đọc quá xa.
Phép đếm tham số thì khớp, và khớp là chuyện kiểm được. Với DeepSeek-V3 bảng ra 671.025.397.760 so với 671 tỉ công bố, lệch 0,004%; với Mixtral ra 46,70 tỉ so với 46,7 tỉ. Không con số nào trong hai cái đó được nhập tay từ thông cáo: chúng cộng từ các trường trong config.json. Nếu bạn sửa một tham số thì tên mô hình biến mất khỏi dòng nguồn, đúng như phải thế.
Chỗ duy nhất cần một quy ước là phần hoạt động. Bảng đếm cả hai bảng nhúng vào con số hoạt động, giống cách các model card định nghĩa: tham số hoạt động bằng tổng trừ đi những chuyên gia không nổ. Về mặt vật lý thì một token chỉ đọc một hàng của bảng nhúng vào chứ không nhân với cả bảng, nên nếu đếm theo kiểu đó thì con số sẽ thấp hơn đúng 926.671.872 tham số. Bảng chọn quy ước của model card để con số so được với cái người ta công bố, và đây là chỗ nói rõ ra để bạn biết mình đang so cái gì với cái gì.
Điểm cổng ở đây là tôi đặt ra, tất định, không có gì được học. Một bộ định tuyến thật nhân vector token với một ma trận cổng đã huấn luyện, và cái nó học được là thứ quan trọng nhất của cả cơ chế: chuyên gia nào nên nhận loại token nào. Sim đếm đúng kích thước ma trận đó nhưng không có nội dung của nó, nên nó chỉ cho bạn thấy hình dạng của phép chọn top-k và phép chuẩn hoá trọng số, tức phần cơ học, chứ không phải phần trí tuệ.
Sim không nói được mô hình thưa có thông minh bằng mô hình dày hay không. Một mô hình 671 tỉ tham số chạy 37,55 tỉ mỗi token có mạnh bằng một mô hình dày 37,55 tỉ tham số không? Câu trả lời chỉ có bằng cách huấn luyện cả hai rồi đo, và không có con số nào ở trang này đụng tới nó. Bảng chỉ khẳng định một chuyện: với cấu hình như vậy thì số tham số phải là như vậy.
Còn nhiều thứ nữa chưa có trong bảng. Mất cân bằng tải giữa các chuyên gia, hệ số bias của bộ định tuyến, chi phí truyền thông khi các chuyên gia nằm trên nhiều thẻ khác nhau, các tham số vụn như trọng số của lớp chuẩn hoá: mỗi thứ là một bài riêng hoặc quá nhỏ để đổi kết luận, và đều không nằm trong phép đếm này. Đó cũng là một phần của khoảng lệch 0,004% ở trên.
Số trong preset có ngày và có thể đã lạc hậu. Hai preset mang tên mô hình thật lấy số từ config.json phát hành kèm mô hình, đọc ngày 27/07/2026, ghi ngay trên giao diện cùng danh sách trường đã dùng. Preset thứ ba ghi rõ là cấu hình tròn số bịa ra để tính tay và cố tình không có attention. Lĩnh vực này đổi rất nhanh, nên nếu bạn có số mới hơn thì gõ thẳng vào, cả 11 ô đều sửa được. Cổng kiểm số của bài canh phép tính; nó không canh và không thể canh việc mô hình ngoài kia có đúng hình dạng đó hay không.
MoE tách một con số thành hai. Tham số tổng bằng số lớp MoE × (số chuyên gia + chia sẻ) × 3 × chiều mô hình × chiều trong, cộng attention, nhúng, lớp dày và ma trận cổng, và nó quyết định bạn cần bao nhiêu VRAM. Tham số hoạt động thay số chuyên gia bằng k ở đúng số hạng đầu tiên và giữ nguyên mọi số hạng còn lại, và nó quyết định mỗi token tốn bao nhiêu phép tính. Với DeepSeek-V3 hai vế đó là 671.025.397.760 và 37.551.276.032, đúng bằng con số công bố. Nhớ đúng một câu là đủ: bộ nhớ trả cho toàn bộ, phép tính trả cho phần được chọn. Ai quên vế đầu sẽ đặt mua thiếu bảy cái card.
- 1Một lớp MoE có 256 chuyên gia định tuyến, 1 chuyên gia chia sẻ, chiều mô hình 7.168, chiều trong của chuyên gia 2.048. Riêng phần chuyên gia của lớp đó chứa bao nhiêu tham số?
- 2Bạn giữ nguyên mọi thứ và chỉ kéo số chuyên gia định tuyến từ 256 xuống 32. Điều gì xảy ra với hai con số lớn?
- 3Cấu hình mặc định cần 8 thẻ 80 GiB để chứa trọng số ở FP8, trong khi mỗi token chỉ dùng 34,97 GiB tham số. Vì sao không thể dùng một thẻ 80 GiB?
Bài này mới chỉ giả định bộ định tuyến chia việc đều cho mọi chuyên gia. Thực tế không như vậy, và chuyện gì xảy ra khi vài chuyên gia bị gọi liên tục còn phần lớn ngồi không là nội dung của bài tiếp theo. Muốn xem lại toàn bộ lộ trình môn học thì quay về phần giới thiệu.