训练作业运行失败,出现NCCL报错
问题现象
训练作业的状态“运行失败”,查看训练作业的“日志”,存在NCCL的报错,例如“NCCL timeout”、“RuntimeError: NCCL communicator was aborted on rank 7”、“NCCL WARN Bootstrap : no socket interface found”或“NCCL INFO Call to connect returned Connection refused, retrying”。
原因分析
NCCL是一个提供GPU间通信原语的库,实现集合通信和点对点发送/接收原语。当训练作业出现NCCL的报错时,可以通过调整NCCL的环境变量尝试解决问题。
处理步骤
- 进入状态“运行失败”的训练作业详情页,单击“日志”页签,查看NCCL报错。
- 如果出现报错“NCCL timeout”或者“RuntimeError: NCCL communicator was aborted on rank 7”,则表示InfiniBand Verbs超时。单击右侧“重建”,重新创建训练作业,设置环境变量“NCCL_IB_TIMEOUT=22”,提交训练作业后等待作业完成。
- 如果出现报错“NCCL WARN Bootstrap : no socket interface found”或“NCCL INFO Call to connect returned Connection refused, retrying”,则表示NCCL无法找到通信网卡或者是无法正常访问IP地址。需要排查训练代码中是否有设置NCCL_SOCKET_IFNAME环境变量,该环境变量由系统自动注入,训练代码中无需设置。训练代码去除NCCL_SOCKET_IFNAME环境变量设置逻辑后,单击右侧“重建”,重新创建训练作业,提交训练作业后等待作业完成。
- 等待训练作业是否变成“已完成”状态。
- 是,故障处理完成。
- 否,则联系技术支持排查节点状态。
建议与总结
- 环境变量NCCL_SOCKET_IFNAME用于指定通信的网卡名称。“NCCL_SOCKET_IFNAME=eth0”表示仅使用eth0网卡通信。该环境变量由系统自动注入,由于通信网卡名称不固定,因此训练代码不应默认设置该环境变量。
- 环境变量NCCL_IB_TIMEOUT用于控制InfiniBand Verbs超时。NCCL使用的默认值为18,取值范围是1~22。