URL
TL;DR
- 目前大模型常用的三种并行:
DP:Data Parallelism,数据并行,将数据分成多份,每个GPU处理一份数据PP:Pipeline Parallelism,管道并行,将模型分成多个阶段(连续一层或多层为一个阶段),每个GPU处理一个阶段TP:Tensor Parallelism,张量并行,将模型分成多份(通常是一层/一个算子/一个张量分成多份,主要解决超长序列引起的超大张量问题),每个GPU处理一部分张量
- 对于
MoE结构,EP (Expert Parallelism)是一种新的并行策略,将MoE中的Expert分配到不同的GPU上 DeepEP是一个 用cuda实现的MoE模型的并行库,重点在于对All-to-All通信的优化
背景知识
节点内通信
- 通俗讲:一台服务器被称为一个节点,一个节点上的多个
GPU之间的通信被称为节点内通信 - 通信协议:
PCIe:比较通用的通信协议,目前最新的PCIe 6.0的带宽为32GB/s的双向带宽NVLink:NVIDIA自家的通信协议,目前最新的NVLink 5.0的带宽约为800GB/s的双向带宽
节点间通信
- 多台服务器组成一个集群,集群中的服务器之间的通信被称为节点间通信
- 通信协议:
InfiniBand:HPC领域常用的通信协议,目前最新的InfiniBand NDR可达400Gbps的双向带宽Ethernet:通用的通信协议,速度低于InfiniBand
- 通信技术:
RDMA:Remote Direct Memory Access,远程直接内存访问,RDMA通过DMA直接访问远程内存,减少了CPU的参与,提高了通信效率
通信视角下 MoE 结构的特殊性
MoE结构的本质是超大规模参数量 + 小规模激活参数量(实际计算量)来让模型更强大同时推理效率高- 由于
MoE结构在实际推理过程中,每个token激活的专家id是无法提前预测的,而是一个纯runtime的行为 - 对此,为了降低
EP通信压力,MoE结构通常会限制每个token实际激活的节点数量。例如,DeepSeek V3有1个共享专家和256个路由专家,每个token会激活1个共享专家和8个路由专家,但同时限制最多只能激活4个节点,假如得分最高的8个路由专家来自超过4个节点,那么会牺牲部分高分专家,在节点数不超过4的情况下,用贪心算法选择得分最高的4个专家 - 虽然
DP / TP / PP都存在通信问题,但都是可提前规划好的通信数据量和通信模式,只要调度得当,即可重叠计算和通信耗时,而MoE结构的通信是无法提前规划的,因此MoE结构的通信是最难优化的
关键特性和能力
DeepEP 的关键特性和能力包括:
- 高吞吐量节点内通信:使用
NVLink优化节点内所有到所有通信的内核,实现高达155 GB/s的带宽。 - 高吞吐量节点间通信:使用
RDMA实现高效的跨节点所有到所有通信,在不同的EP配置中保持大约45 GB/s的带宽。 - 低延迟内核:专用推理解码内核,分发操作延迟低至
163微秒,组合操作延迟低至318微秒。 - FP8 支持:原生支持低精度操作,包括
FP8分发,与大型模型中量化趋势一致。 - 灵活的 GPU 资源控制:可配置的
SM使用,用于计算 - 通信重叠,允许精细调整性能优化。 - 自适应路由支持:在低延迟内核中支持自适应路由,使复杂拓扑中的网络利用更高效。
技术实现
DeepEP 是用 C++ 和 CUDA 组件实现的,并带有 Python 接口。实现包括几个关键组件:
- 缓冲管理:核心
Buffer类管理NVLink和RDMA的通信缓冲区,处理内存分配和同步。 - 通信内核:
- 训练和推理预填充的高吞吐量内核
- 推理解码的低延迟内核
- 支持节点内(
NVLink)和节点间(RDMA)通信
- 事件管理:
EventOverlap类提供CUDA事件处理和计算 - 通信重叠的工具。 - 分发和组合操作:
dispatch:将令牌特征发送到跨GPU的对应专家combine:从专家收集处理后的特征并返回到原始位置
Thoughts
- 大模型,尤其是基座大模型,拼的是基建
- 大模型时代不会再出现小模型时代经常出现的 理论计算量低但实际很慢的算法 了,
GPU上快才是真的快,不光要考虑计算,存储 / 通信也同时需要认真考虑 - 软硬件
co-design是未来趋势,People who're serious about software should make their own hardware.这句名言的含金量还在上升