Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

本页目录

分布式并行: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. 从共享内存到消息传递 ​

一台服务器中的线程可以访问共享内存。不同服务器拥有独立地址空间,只能通过网络交换消息。

text
节点 A                         节点 B
CPU + 内存 A   ← 网络消息 →    CPU + 内存 B
GPU 0/1                       GPU 0/1
1
2
3

程序必须明确:谁拥有数据、何时发送、发给谁、接收后怎样继续计算。


2. MPI 的基本概念 ​

MPI 是高性能计算中常用的消息传递标准。每个进程拥有 Rank:

text
Rank 0  Rank 1  Rank 2  Rank 3
1

点对点通信:

cpp
MPI_Send(..., destination, tag, communicator);
MPI_Recv(..., source, tag, communicator, ...);
1
2

需要避免双方都等待接收、消息标签不匹配和缓冲区生命周期错误。


3. 集合通信 ​

Broadcast ​

一个 Rank 把数据发给所有 Rank。

Reduce ​

各 Rank 的数据进行求和、最大值等归约,结果送到一个 Rank。

AllReduce ​

所有 Rank 提供数据,并让所有 Rank 获得归约结果。分布式训练的梯度同步经常使用它。

AllGather ​

每个 Rank 收集所有 Rank 的数据分片。

AllToAll ​

每个 Rank 向所有其他 Rank 发送不同数据,常见于专家并行和数据重分布。

成熟通信库会根据消息大小和拓扑选择 Ring、Tree 等算法。


4. 延迟与带宽模型 ​

一次消息传输可以粗略表示为:

text
通信时间 = 启动延迟 α + 数据量 / 带宽
1

大量小消息主要受延迟影响,大消息主要受带宽影响。因此常见优化包括:

  • 合并小消息
  • 减少同步次数
  • 使用非阻塞通信
  • 在计算期间提前发送边界数据
  • 让通信模式匹配网络拓扑

5. Halo Exchange ​

网格被划分到不同节点后,每个节点需要邻居的边界数据:

text
节点 A 区域 | Halo | 节点 B 区域
1

典型步骤:

  1. 更新本地内部网格。
  2. 异步发送边界。
  3. 同时计算不依赖远程数据的区域。
  4. 等待边界到达。
  5. 计算边界区域。

这是通信与计算重叠的经典案例。


6. RDMA 与高速互联 ​

传统网络通信需要多次内核和内存拷贝。RDMA 允许网卡直接访问已注册内存,减少 CPU 参与和拷贝。

集群常见互联层次:

text
GPU 内部互联 / NVLink
节点内 PCIe / NVSwitch
节点间 InfiniBand / RoCE / Ethernet
1
2
3

通信库需要理解拓扑,避免本可走高速链路的数据绕行低速路径。


7. 多 GPU 并行策略 ​

数据并行 ​

每张 GPU 保留完整模型,处理不同数据,最后同步梯度。简单,但模型必须能放入单卡。

张量并行 ​

把单个矩阵或层切到多张 GPU,需要频繁集合通信。

流水线并行 ​

不同 GPU 保存不同层,微批次在阶段间流动,存在流水线气泡。

专家并行 ​

不同专家分布在不同设备,Token 通过 AllToAll 路由,负载均衡十分重要。

现实中的大型训练常组合多种并行方式。


8. 分布式系统特有问题 ​

  • 某个 Rank 变慢会拖慢全部同步参与者
  • 网络拥塞造成性能抖动
  • 节点或 GPU 故障导致任务中止
  • 日志分散,定位问题困难
  • 不同节点环境不一致
  • Checkpoint 规模大、写入慢

高性能集群不仅是算法问题,也依赖调度、监控、存储和运维能力。


8. Communicator ​

Communicator 定义参与进程集合和通信上下文。

不要默认所有操作都使用全局 Communicator。

按子域、节点、设备或算法阶段创建子 Communicator,可以减少无关参与者。

9. Tag 与匹配 ​

点对点消息通过 Source、Destination、Tag 和 Communicator 匹配。

Tag 应形成明确协议,而不是散落魔法数字。

text
HALO_X_MINUS
HALO_X_PLUS
CONTROL_STOP
CHECKPOINT_READY
1
2
3
4

错误匹配会造成数据错位或死锁。

10. Blocking 与 Nonblocking ​

Blocking 调用返回条件依具体 API 定义。

Nonblocking 调用返回只表示操作已启动。

text
Irecv / Isend
  -> compute independent interior
  -> Waitall
  -> compute boundary
1
2
3
4

真正重叠取决于 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 数据。

text
local compute on owned interior
  -> exchange boundary
  -> update ghost values
  -> compute boundary-dependent work
1
2
3
4

Halo 宽度由算法 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. 混合并行 ​

text
MPI across nodes
  -> OpenMP / threads within node
  -> SIMD within core
  -> GPU kernels on accelerators
1
2
3
4

每层资源数需要协调,避免过度订阅。

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]]

最后更新于:

Pager
下一篇系统与高性能知识体系

持续记录,持续成长

Copyright © Tidenflow