欢迎光临
我们一直在努力

怎样排查RDMA网络丢包导致的分布式训练挂起(Deadlock)?

在现代AI基础设施中,分布式训练(如使用PyTorch DDP和NCCL)对网络延迟和带宽的要求极高。RDMA(Remote Direct Memory Access)技术,无论是基于InfiniBand还是RoCEv2,都是实现高性能集群通信的关键。然而,RDMA链路上的微小不稳定或丢包(Packet Loss)往往不会立即导致连接中断,而是表现为NCCL集体通信操作(如all_reduce)的长时间无响应,最终导致训练挂起(Deadlock或Timeout)。

本文将提供一套系统的、可实操的排查流程,帮助您快速定位和解决由RDMA稳定性问题引起的分布式训练挂起。

1. 理解挂起的根源:NCCL Timeout

分布式训练挂起通常是由于某个GPU或节点未能及时完成集合通信操作,导致所有节点等待超时。在RDMA环境中,如果链路存在偶发的丢包,数据重传机制会显著增加延迟,一旦超过框架的容忍阈值,就会触发超时。

关键诊断步骤:

  1. 设置NCCL调试级别: 将环境变量设置为INFOWARN,观察挂起时NCCL日志是否停留在某个特定的操作上。

1
2
export NCCL_DEBUG=INFO
# 运行您的训练脚本
  1. 增加NCCL超时时间(临时诊断): 虽然这不是长期解决方案,但可以确认问题是否是由于边缘超时导致的。

1
2
3
4
# 默认通常是30秒,可以临时调高查看是否能通过
export NCCL_IB_TIMEOUT=22
# 注意:这个值是IB链接层重试的次数,不是秒数。设置得越高,等待时间越长。
export NCCL_NET_GDRCOPY_ENABLE=0

2. 检查RDMA物理层和驱动状态

在深入分析计数器之前,确保RDMA设备处于健康状态。

2.1 检查设备和端口状态

使用ibstatibdev2netdev确认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. 解决与缓解措施

  1. 更换线缆和SFP: 计数器显示高SymbolErrorsLinkDownEvents时,首先更换线缆或SFP光模块,这是最常见也是最直接的物理层解决方案。
  2. 固件更新: 确保HCA和RDMA交换机的固件都更新到供应商推荐的稳定版本。
  3. RoCE配置优化: 如果使用RoCE,确保网络配置中正确启用了ECN(Explicit Congestion Notification)或PFC(Priority Flow Control),并且端到端(HCA -> 交换机 -> HCA)配置完全一致。
  4. NCCL拓扑配置: 对于复杂集群,使用NCCL_TOPO_FILENCCL_IB_HCA来明确指定使用的RDMA设备,避免NCCL尝试使用不稳定或配置错误的链路。
  5. 操作系统层面: 检查操作系统日志(dmesg),看是否有关于HCA驱动或内存注册失败的警告信息。
【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 怎样排查RDMA网络丢包导致的分布式训练挂起(Deadlock)?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址