Repository navigation
How Expert Balance Works.zh
sikkatu edited this page Oct 17, 2026
·
2 revisions
大型 MoE 模型每层有数百个路由专家。在 4 块 96 GB 卡上(共 384 GB,扣除预留后 每卡约 90 GB 有效),大模型的专家权重装不下 —— 而且还需要给 KV cache 留空间。 但流量实际上只触及一小部分专家。
- 热门库(hot) —— 驻留在显存中的专家。每 token 零传输成本。
- 冷门库(cold) —— 其余专家,锁定在主机内存中,按需经 PCIe 读取 (UVA:GPU 可直接访问主机内存,无需显式拷贝内核)。
在 PCIe 4.0 上(该级别主机每卡约 25 GB/s 有效带宽)冷门命中更慢,但热门集覆盖了 绝大多数路由 token —— 因此平均速度依然很快。
一个共享规划器(patches/hotsplit_plan.py,纯 numpy,单元测试覆盖)完成全部工作:
-
路由直方图 —— 每个专家被路由到的次数(来自
balance.sh的样本流量 —— DeepSeek/GLM 配方自带;MiMo 配方改为自带参考expert_hist_mix.json,请用patches/hotsplit_rerank.py按你的流量重新排序)。 -
贪心热门集 —— 按路由占比 ÷ 字节数(热门度 ÷ 大小)排序专家,
填满每 rank 预算
HOTSPLIT_HOT_GIB。 - 校验 —— NaN/负数/专家数不匹配会报错;预算溢出会报错。
- 预言机校验 —— 小规模时用暴力规划器确认贪心结果是最优的。
同一规划器在四个配方中逐字节一致(由测试强制保证)。
-
Static(
HOTSPLIT_DYNAMIC=0)—— 加载时按直方图固定热门集。 -
Dynamic(
HOTSPLIT_DYNAMIC=1,默认)—— 热门集运行时自适应:每经过HOTSPLIT_DYN_STEPS个引擎步,评估实时路由计数,把最弱的热门专家换成最强的冷门 专家(host→GPU 拷贝在专用 CUDA 流上执行,通过事件发布 —— decode 图重放永远不会 看到“半完成”的换入换出)。
更新参数在启动时校验(HOTSPLIT_DYN_STEPS=0 这类垃圾值拒绝启动),规划器连续失败
会中止运行,每次更新记录一行 hot/cold hit-rate —— 这个数字证明该模式确有价值。
| 参数 | 含义 | 默认值 |
|---|---|---|
HOTSPLIT_HOT_GIB |
每 rank 热门预算(GiB) | 留空 = 原版放置的 GPU 常驻专家字节(不是整个库) |
HOTSPLIT_DYNAMIC |
运行时自适应 | 1 |
HOTSPLIT_DYN_STEPS |
两次换入换出之间的步数 | 2000 |
HOTSPLIT_DYN_MAX_SWAPS |
每层每次更新的换入换出数 | 2 |
HOTSPLIT_DYN_MARGIN |
仅当 incoming > margin × outgoing 时换 | 1.25 |
HOTSPLIT_VRAM_RESERVE_GIB |
CUDA graph / KV cache 余量 | 2 |
HOTSPLIT_NUMA_POLICY |
preferred / bind / off | preferred |
本硬件:卡是 PCIe Gen 5,但主机插槽是 PCIe 4.0,内存是 DDR4。所有配方都在
实测平台(nvidia-smi、numastat)上测量,而不是照抄规格书。
English
Русский
中文