更新时间:2024-04-11 GMT+08:00

训练作业运行失败,出现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的环境变量尝试解决问题。

处理步骤

  1. 进入状态“运行失败”的训练作业详情页,单击“日志”页签,查看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环境变量设置逻辑后,单击右侧“重建”,重新创建训练作业,提交训练作业后等待作业完成。
  2. 等待训练作业是否变成“已完成”状态。
    • 是,故障处理完成。
    • 否,则联系技术支持排查节点状态。

建议与总结

  • 环境变量NCCL_SOCKET_IFNAME用于指定通信的网卡名称。“NCCL_SOCKET_IFNAME=eth0”表示仅使用eth0网卡通信。该环境变量由系统自动注入,由于通信网卡名称不固定,因此训练代码不应默认设置该环境变量。
  • 环境变量NCCL_IB_TIMEOUT用于控制InfiniBand Verbs超时。NCCL使用的默认值为18,取值范围是1~22。