Skip to content

How Expert Balance Works.zh

sikkatu edited this page Oct 17, 2026 · 2 revisions

专家均衡如何工作

English | Русский | 中文

问题

大型 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,单元测试覆盖)完成全部工作:

  1. 路由直方图 —— 每个专家被路由到的次数(来自 balance.sh 的样本流量 —— DeepSeek/GLM 配方自带;MiMo 配方改为自带参考 expert_hist_mix.json,请用 patches/hotsplit_rerank.py 按你的流量重新排序)。
  2. 贪心热门集 —— 按路由占比 ÷ 字节数(热门度 ÷ 大小)排序专家, 填满每 rank 预算 HOTSPLIT_HOT_GIB。
  3. 校验 —— NaN/负数/专家数不匹配会报错;预算溢出会报错。
  4. 预言机校验 —— 小规模时用暴力规划器确认贪心结果是最优的。

同一规划器在四个配方中逐字节一致(由测试强制保证)。

Static 与 dynamic

  • 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)上测量,而不是照抄规格书。

Clone this wiki locally