分布式并行: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 规模大、写入慢
高性能集群不仅是算法问题,也依赖调度、监控、存储和运维能力。
历史分布式补充
本页保留课程合并前的分布式并行说明。
当前版本补充消息协议、Buffer 生命周期、拓扑、I/O 和故障恢复。
Rank 与 Communicator
Rank 是 Communicator 内的进程编号。
Communicator 隔离通信上下文和参与集合。
点对点
消息匹配使用 Source、Destination、Tag 和 Communicator。
Tag 应有稳定协议。
Blocking
Blocking 不一定表示远端已经处理。
理解具体调用的完成条件。
Nonblocking
Nonblocking 启动操作后返回。
完成前 Buffer 和 Request 必须保持有效。
Collective
Broadcast、Reduce、Allreduce、Gather、Scatter 和 Alltoall 是全体协议。
顺序与参数必须一致。
Allreduce
用于梯度、残差和全局统计。
受消息、Rank、拓扑和最慢参与者影响。
域分解
分区考虑:
- 工作;
- 内存;
- 边界;
- 通信;
- 局部性;
- 迁移。
Halo
Ghost 数据保存远端边界副本。
先计算内部,再交换边界可帮助重叠。
Progress
Nonblocking API 不保证自动进展。
MPI 实现、网络和线程模式影响通信推进。
拓扑
节点、Socket、NUMA、GPU 和 NIC 共同决定路径。
进程映射需要拓扑感知。
小消息
受延迟、协议和软件开销限制。
合并消息可减少次数,但增加等待。
大消息
受带宽、Buffer 和拥塞限制。
分块有助于流水,但增加请求管理。
Straggler
同步阶段等待最慢 Rank。
分析每 Rank 时间和工作量,不只看平均。
分布式 I/O
大量小文件会压力元数据服务。
Collective I/O、Aggregator 和分块格式是候选方案。
Checkpoint
Checkpoint 需要一致性、完整性、版本和恢复验证。
写完不等于能恢复。
故障
处理节点、网络、存储、OOM、取消和部分输出。
重试要与幂等协议结合。
混合并行
MPI、OpenMP、SIMD 和 GPU 可以分层组合。
避免线程和进程过度订阅。
强扩展
固定问题,观察时间、效率和通信。
弱扩展
每资源工作近似固定,观察全局成本增长。
Profile
记录:
- Rank 时间;
- 消息;
- Collective;
- 等待;
- 映射;
- I/O;
- 网络;
- 正确性。
历史版本边界
MPI 实现、网络硬件和集合算法持续变化。
旧延迟与带宽数字只适用于原环境。
当前课程映射
当前文章新增:
- Communicator;
- Tag 协议;
- Nonblocking 生命周期;
- 拓扑;
- I/O;
- Checkpoint;
- 故障;
- 测量和完成标准。
阅读完成标准
应能:
- 设计分区;
- 匹配消息;
- 使用 Collective;
- 管理 Buffer;
- 分析 Halo;
- 找 Straggler;
- 设计恢复;
- 限定历史结果。
归档复现记录
- MPI 实现;
- 版本;
- 节点;
- CPU/GPU;
- 网络;
- Rank 映射;
- 线程级别;
- 输入与分区;
- 消息统计;
- Collective;
- I/O;
- 原始 Trace;
- 正确性;
- 当前差异。
核心总结
- 分布式并行使用消息而不是共享变量协作。
- 通信成本由启动延迟、带宽、数据量和拓扑共同决定。
- 集合通信是多机 AI 与 HPC 的关键基础设施。
- 应尽量重叠通信和计算,并减少全局同步。
- 扩展性能最终常被最慢节点和网络限制。
下一篇:[[10-performance-engineering]]