分布式并行:MPI、集合通信、RDMA 与多机多卡 / Distributed Parallelism with MPI, Collective Communication, and RDMA
📅 创建时间:2026-07-20 🏷️ 标签:#MPI #分布式计算 #集合通信 #RDMA #多机多卡 📚 前置知识:[[08-heterogeneous-computing]] 📚 相关知识:[[/02-systems-and-performance/02-computer-architecture-and-hardware/08-mpi-cluster-hpc]] [[/04-ai/03-ai-infrastructure/clusters/07-nccl-cluster-networking]]
1. 从共享内存到消息传递
一台服务器中的线程可以访问共享内存。不同服务器拥有独立地址空间,只能通过网络交换消息。
节点 A 节点 B
CPU + 内存 A ← 网络消息 → CPU + 内存 B
GPU 0/1 GPU 0/1程序必须明确:谁拥有数据、何时发送、发给谁、接收后怎样继续计算。
2. MPI 的基本概念
MPI 是高性能计算中常用的消息传递标准。每个进程拥有 Rank:
Rank 0 Rank 1 Rank 2 Rank 3点对点通信:
MPI_Send(..., destination, tag, communicator);
MPI_Recv(..., source, tag, communicator, ...);需要避免双方都等待接收、消息标签不匹配和缓冲区生命周期错误。
3. 集合通信
Broadcast
一个 Rank 把数据发给所有 Rank。
Reduce
各 Rank 的数据进行求和、最大值等归约,结果送到一个 Rank。
AllReduce
所有 Rank 提供数据,并让所有 Rank 获得归约结果。分布式训练的梯度同步经常使用它。
AllGather
每个 Rank 收集所有 Rank 的数据分片。
AllToAll
每个 Rank 向所有其他 Rank 发送不同数据,常见于专家并行和数据重分布。
成熟通信库会根据消息大小和拓扑选择 Ring、Tree 等算法。
4. 延迟与带宽模型
一次消息传输可以粗略表示为:
通信时间 = 启动延迟 α + 数据量 / 带宽大量小消息主要受延迟影响,大消息主要受带宽影响。因此常见优化包括:
- 合并小消息
- 减少同步次数
- 使用非阻塞通信
- 在计算期间提前发送边界数据
- 让通信模式匹配网络拓扑
5. Halo Exchange
网格被划分到不同节点后,每个节点需要邻居的边界数据:
节点 A 区域 | Halo | 节点 B 区域典型步骤:
- 更新本地内部网格。
- 异步发送边界。
- 同时计算不依赖远程数据的区域。
- 等待边界到达。
- 计算边界区域。
这是通信与计算重叠的经典案例。
6. RDMA 与高速互联
传统网络通信需要多次内核和内存拷贝。RDMA 允许网卡直接访问已注册内存,减少 CPU 参与和拷贝。
集群常见互联层次:
GPU 内部互联 / NVLink
节点内 PCIe / NVSwitch
节点间 InfiniBand / RoCE / Ethernet通信库需要理解拓扑,避免本可走高速链路的数据绕行低速路径。
7. 多 GPU 并行策略
数据并行
每张 GPU 保留完整模型,处理不同数据,最后同步梯度。简单,但模型必须能放入单卡。
张量并行
把单个矩阵或层切到多张 GPU,需要频繁集合通信。
流水线并行
不同 GPU 保存不同层,微批次在阶段间流动,存在流水线气泡。
专家并行
不同专家分布在不同设备,Token 通过 AllToAll 路由,负载均衡十分重要。
现实中的大型训练常组合多种并行方式。
8. 分布式系统特有问题
- 某个 Rank 变慢会拖慢全部同步参与者
- 网络拥塞造成性能抖动
- 节点或 GPU 故障导致任务中止
- 日志分散,定位问题困难
- 不同节点环境不一致
- Checkpoint 规模大、写入慢
高性能集群不仅是算法问题,也依赖调度、监控、存储和运维能力。
8. Communicator
Communicator 定义参与进程集合和通信上下文。
不要默认所有操作都使用全局 Communicator。
按子域、节点、设备或算法阶段创建子 Communicator,可以减少无关参与者。
9. Tag 与匹配
点对点消息通过 Source、Destination、Tag 和 Communicator 匹配。
Tag 应形成明确协议,而不是散落魔法数字。
HALO_X_MINUS
HALO_X_PLUS
CONTROL_STOP
CHECKPOINT_READY错误匹配会造成数据错位或死锁。
10. Blocking 与 Nonblocking
Blocking 调用返回条件依具体 API 定义。
Nonblocking 调用返回只表示操作已启动。
Irecv / Isend
-> compute independent interior
-> Waitall
-> compute boundary真正重叠取决于 MPI 实现、网络进展和独立计算量。
11. Buffer 生命周期
Nonblocking 操作完成前,发送和接收 Buffer 不能被错误修改或释放。
请求对象也需要统一管理和错误处理。
12. Collective
常见集合通信:
- Broadcast;
- Reduce;
- Allreduce;
- Gather;
- Allgather;
- Scatter;
- Alltoall;
- Barrier。
Collective 是所有参与 Rank 的协议。 调用顺序或参数不一致会挂起或产生错误。
13. Allreduce
Allreduce 常用于梯度、残差和全局统计。
成本取决于:
- 消息大小;
- Rank 数;
- 算法;
- 网络拓扑;
- 数据类型;
- GPU Direct;
- 最慢 Rank。
减少调用频率或合并小归约可能降低延迟。
14. 域分解
域分解目标同时包括:
- 计算均衡;
- 内存均衡;
- 边界小;
- 局部性;
- 迁移成本;
- 可扩展元数据。
规则网格可按块划分。 非结构网格和图需要分区器与权重。
15. Halo
每个 Rank 保存 Owned 与 Ghost/Halo 数据。
local compute on owned interior
-> exchange boundary
-> update ghost values
-> compute boundary-dependent workHalo 宽度由算法 Stencil 和离散决定。
16. 重叠通信
先发布接收,再发布发送,然后计算不依赖远端的数据。
重叠失败原因:
- 没有 Progress;
- 内部计算太短;
- Wait 太早;
- Buffer 依赖;
- 网络饱和;
- GPU 同步。
Timeline 证明是否真正重叠。
17. 拓扑
进程映射应考虑:
- 节点;
- Socket;
- NUMA;
- GPU;
- NIC;
- PCIe;
- 交换网络。
错误映射会让本应本地的通信跨更慢链路。
18. 小消息与大消息
小消息主要受延迟和软件开销限制。
大消息更受带宽、缓冲和拥塞限制。
合并小消息有益,但会增加等待和 Buffer。
19. 负载不均
全局阶段由最慢 Rank 决定。
记录每 Rank:
- 计算;
- 通信;
- 等待;
- 工作量;
- 内存;
- I/O;
- 重试。
平均值会隐藏 Straggler。
20. 分布式 I/O
所有 Rank 写单独小文件会给元数据服务带来压力。
候选方案:
- Collective I/O;
- Aggregator;
- 分块格式;
- 并行文件系统;
- 对象存储;
- 本地暂存;
- 异步 Checkpoint。
格式还要支持恢复和版本。
21. Checkpoint
Checkpoint 需要定义:
- 一致时刻;
- 分片;
- 完整性;
- 原子发布;
- 保留策略;
- 重启映射;
- 版本;
- 失败清理。
保存成功必须能在干净任务中实际恢复。
22. 故障
传统 MPI 常把 Rank 故障视为整个作业失败。
应用仍需处理:
- 节点丢失;
- 网络错误;
- 文件失败;
- 超时;
- OOM;
- 作业取消;
- 部分 Checkpoint。
调度器重试必须与幂等和恢复协议结合。
23. 混合并行
MPI across nodes
-> OpenMP / threads within node
-> SIMD within core
-> GPU kernels on accelerators每层资源数需要协调,避免过度订阅。
24. 测量
报告:
- Rank/Node/GPU;
- 进程映射;
- 消息数量与字节;
- Collective 时间;
- 计算通信重叠;
- 负载不均;
- I/O;
- 强弱扩展;
- 正确性。
25. 工具
- MPI 内置统计;
- Nsight Systems;
- VTune MPI/HPC 分析;
- Trace 工具;
- 网络计数器;
- 调度器指标;
- 文件系统指标。
26. 完成标准
应能:
- 设计分区;
- 定义消息协议;
- 管理 Nonblocking Buffer;
- 选择 Collective;
- 分析 Halo;
- 验证重叠;
- 找 Straggler;
- 设计 Checkpoint;
- 测量扩展。
核心总结
- 分布式并行使用消息而不是共享变量协作。
- 通信成本由启动延迟、带宽、数据量和拓扑共同决定。
- 集合通信是多机 AI 与 HPC 的关键基础设施。
- 应尽量重叠通信和计算,并减少全局同步。
- 扩展性能最终常被最慢节点和网络限制。
下一篇:[[10-performance-engineering]]