All-to-All 通信(All-to-All Communication)是一种集合通信模式:参与计算的每个节点,都要把自己的数据分成若干份,分别发送给其他所有节点。
打个比方:班里 8 个同学,每人手里有一叠卡片。老师要求每个人把卡片按颜色分给对应的同学——红色给小明,蓝色给小红……于是每个人都要给其他 7 个人各寄一包卡片。这就是 All-to-All。它和“班长把通知念一遍”(Broadcast)或“大家把零花钱凑一起买礼物”(All-reduce)完全不同。
在 MoE(Mixture of Experts,混合专家)和专家并行(AI 词典:Expert Parallelism">Expert Parallelism)里,All-to-All 是核心通信。假设有 8 张 GPU,每张卡上有一批 token。MoE 的路由器会为每个 token 选择几个专家,而这些专家分散在不同 GPU 上。于是,每张 GPU 都要把本地 token 按目标专家所在的 GPU 分组,然后通过 All-to-All 发给其他所有 GPU;专家算完后,还要再来一次 All-to-All,把结果送回原来的 GPU。这就是 dispatch 和 combine 两次通信。
为什么它最贵?首先,每个 GPU 都要和所有其他 GPU 通信,通信模式是“全对全”,网络里同时有大量小数据包在飞,容易拥塞。其次,数据量不小:每个 token 的隐藏向量都要被发送,而且通常要做两次。更麻烦的是,如果路由不均,某些专家特别热门,对应的 GPU 就会收到远超平均的数据,成为木桶短板,其他 GPU 只能干等。相比之下,All-reduce 可以用环形算法让数据接力传递,链路利用更均匀;All-gather 只是各节点把自己的数据广播出去,没有个性化的分发。All-to-All 则要求每个节点同时向多个目标发送不同内容,对网络拓扑和带宽要求最高。
| 通信模式 | 数据流向 | 典型用途 | 特点 |
|---|---|---|---|
| All-reduce | 所有节点归约后得到相同结果 | 梯度求和 | 可用环形算法,较高效 |
| All-gather | 每个节点收集所有节点的数据 | 参数同步 | 各节点广播自己的数据 |
| All-to-All | 每个节点向每个其他节点发送不同数据 | MoE 专家并行 | 个性化分发,易拥塞 |
对 AI 从业者来说,优化 MoE 训练和推理,很大一部分工作就是减少 All-to-All 的代价:比如调整专家数量、改进路由均衡、利用更快的卡间互联(如 NVLink)或拓扑感知的调度。对普通职场人,可以这样理解:为什么大模型训练需要那么贵的网络设备?因为像 All-to-All 这样的通信,一旦跨机器,就可能比计算本身还慢。具体硬件规格和性能数据,以官方页面为准。
