在现代AI基础设施中,分布式训练(如使用PyTorch DDP和NCCL)对网络延迟和带宽的要求极高。RDMA(Remote Direct Memory Access)技术,无论是基于InfiniBand还是RoCEv2,都是实现高性能集群通信的关键。然而,RDMA链路上的微小不稳定或丢包(Packet Loss)往往不会立即导致连接中断,而是表现为NCCL集体通信操作(如all_reduce)的长时间无响应,最终导致训练挂起(Deadlock或Timeout)。
本文将提供一套系统的、可实操的排查流程,帮助您快速定位和解决由RDMA稳定性问题引起的分布式训练挂起。
Contents
1. 理解挂起的根源:NCCL Timeout
分布式训练挂起通常是由于某个GPU或节点未能及时完成集合通信操作,导致所有节点等待超时。在RDMA环境中,如果链路存在偶发的丢包,数据重传机制会显著增加延迟,一旦超过框架的容忍阈值,就会触发超时。
关键诊断步骤:
- 设置NCCL调试级别: 将环境变量设置为INFO或WARN,观察挂起时NCCL日志是否停留在某个特定的操作上。
1
2 export NCCL_DEBUG=INFO
# 运行您的训练脚本
- 增加NCCL超时时间(临时诊断): 虽然这不是长期解决方案,但可以确认问题是否是由于边缘超时导致的。
1
2
3
4 # 默认通常是30秒,可以临时调高查看是否能通过
export NCCL_IB_TIMEOUT=22
# 注意:这个值是IB链接层重试的次数,不是秒数。设置得越高,等待时间越长。
export NCCL_NET_GDRCOPY_ENABLE=0
2. 检查RDMA物理层和驱动状态
在深入分析计数器之前,确保RDMA设备处于健康状态。
2.1 检查设备和端口状态
使用ibstat或ibdev2netdev确认RDMA设备及其端口是否激活且速率正确。
1
2
3
4
5
6
7
8 # 检查所有IB设备状态
ibstat
# 示例输出的关键点:
# State: Active
# Physical state: LinkUp
# Rate: 100 Gbps (或更高)
# Port state: Lid-up
2.2 检查MTU和流控
不匹配的MTU(最大传输单元)或流控配置错误是RoCE环境下丢包的常见原因。
1
2
3
4
5
6 # 检查网络接口的MTU (如果是RoCE环境)
ip a show <interface_name>
# 检查RoCE环境下的PFC (Priority Flow Control) 状态
# 确保交换机和HCA (Host Channel Adapter) 上的配置一致
ethtool --show-pause <interface_name>
3. 核心诊断:RDMA错误计数器分析
RDMA丢包和链路不稳定的最直接证据隐藏在HCA的错误计数器中。我们必须关注那些指示链路质量下降或数据帧被丢弃的计数器。
3.1 InfiniBand/RoCE 错误计数器
使用ibstat -p或直接读取sysfs文件来获取详细的端口计数器。请重点关注以下几个指标:
| 计数器名称 | 含义 | 诊断意义 |
|---|---|---|
| LinkDownEvents | 链路断开重连的次数 | 任何非零值都表明物理链路不稳定。 |
| ReceiveErrors | 接收到的有错误的物理帧 | 高值可能表明信号质量差或MTU不匹配。 |
| SymbolErrors | 信号符号错误 | 严重指示物理层问题(如脏线缆、连接器松动)。 |
| VL15Dropped | 虚拟通道15丢包数 | InfiniBand中,VL15用于SM/SA通信。高值可能导致子网管理问题。 |
| PortRcvErrors | 端口接收错误 | 高值通常是丢包的直接体现。 |
获取计数器数据的脚本示例:
您应该在训练开始前和挂起后都运行此脚本,对比增量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #!/bin/bash
# 假设您的IB设备是 mlx5_0,端口是 1
IB_DEV="mlx5_0"
IB_PORT="1"
echo "--- RDMA Error Counters for $IB_DEV/$IB_PORT ---"
# 1. 检查物理层错误
cat /sys/class/infiniband/$IB_DEV/ports/$IB_PORT/counters/symbol_error_counter
cat /sys/class/infiniband/$IB_DEV/ports/$IB_PORT/counters/link_down_events
# 2. 检查接收和发送错误
cat /sys/class/infiniband/$IB_DEV/ports/$IB_PORT/counters/port_rcv_errors
cat /sys/class/infiniband/$IB_DEV/ports/$IB_PORT/counters/port_xmit_discards
# 3. 检查VL15丢包 (仅InfiniBand)
cat /sys/class/infiniband/$IB_DEV/ports/$IB_PORT/counters/vl15_dropped
如果发现上述任何计数器在训练过程中显著增加,则网络不稳定是训练挂起的直接原因。
4. 压力测试验证链路稳定性
使用RDMA性能测试工具(perftest包)中的带宽测试工具,模拟高压通信,验证链路的稳定性和丢包情况。
在两个节点间运行测试:
节点 A (服务器端)
1
2 # 启动ib_write_bw服务器,用于带宽测试
ib_write_bw -d mlx5_0 -i 1 -F --iters=100000
节点 B (客户端)
1
2 # 连接到节点A的IP地址
ib_write_bw -d mlx5_0 -i 1 -F -R <Node_A_IP> --iters=100000
如果测试结果(例如带宽)在不同运行周期内波动巨大,或者测试过程中出现连接中断,强烈表明RDMA链路存在间歇性问题。
5. 解决与缓解措施
- 更换线缆和SFP: 计数器显示高SymbolErrors或LinkDownEvents时,首先更换线缆或SFP光模块,这是最常见也是最直接的物理层解决方案。
- 固件更新: 确保HCA和RDMA交换机的固件都更新到供应商推荐的稳定版本。
- RoCE配置优化: 如果使用RoCE,确保网络配置中正确启用了ECN(Explicit Congestion Notification)或PFC(Priority Flow Control),并且端到端(HCA -> 交换机 -> HCA)配置完全一致。
- NCCL拓扑配置: 对于复杂集群,使用NCCL_TOPO_FILE或NCCL_IB_HCA来明确指定使用的RDMA设备,避免NCCL尝试使用不稳定或配置错误的链路。
- 操作系统层面: 检查操作系统日志(dmesg),看是否有关于HCA驱动或内存注册失败的警告信息。
汤不热吧