记录一下
ncclSystemError: System call (socket, malloc, munmap, etc) failed.
RuntimeError: NCCL error in: /opt/conda/conda-bld/........../ProcessGroupNCCL.cpp:911, unhandled system error, NCCL version 2.7.8
ncclSystemError: System call (socket, malloc, munmap, etc) failed.
通过export NCCL_DEBUG=INFO来查看日志信息。
如果设置NCCL_IB_DISABLE=1的话,会强制 NCCL 使用 IP 套接字进行通信,而不是尝试使用可能不可用的 IB/RoCE。InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 是高性能网络协议,通常在分布式和高性能计算环境中使用,允许进行快速数据传输。注意,使用 IP 套接字可能会比使用 IB/RoCE 传输慢,因为它通常不会利用硬件加速特性,但如果硬件或驱动程序支持有问题,这可能是一个有用的临时解决方案。
参考:pytorch 多机多卡DDP训练遇到ncclSystemError: System call (socket, malloc, munmap, etc) failed错误解决办法-优快云博客
日志信息如下:
gpu04: [0] bootstrap.cc:32 NCCL WARN Bootstrap : no socket interface found
gpu04: [0] NCCL INFO init.cc:101 -> 3
gpu04: [0] NCCL INFO init.cc:123 -> 3
gpu04: [0] NCCL INFO init.cc:140 -> 3
RuntimeError: NCCL error in: /opt/conda/conda-bld/....../torch/lib/c10d/ProcessGroupNCCL.cpp:845, internal error, NCCL version 2.7.8
ncclInternalError: Internal check failed. This is either a bug in NCCL or due to memory corruption
添加
import os
os.environ["NCCL_IB_TC"] = "128"
os.environ["NCCL_IB_GID_INDEX"] = "3"
os.environ["NCCL_IB_TIMEOUT"] = "22"
或
NCCL_SOCKET_IFNAME
环境变量在 NCCL 中用于指定用于通信的网络接口。当在网络上跨多个 GPU 执行集体操作时,如果系统中有多个网络接口,可以通过设置此变量来确保 NCCL 使用正确的接口,以获得最佳性能。
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0" #此处eth0为每台机器的网卡名字,使用ifconfig查看,要是出现多个网卡名字,找到那个有IP地址、网关和掩码的那个名字
######################################
#或者 NCCL_SOCKET_IFNAME=en,eth,em,bond
#en,eth,em,bond:这些是网络接口的名称前缀。这个设置指示 NCCL 只使用那些名称以 en、eth、em 或 bond #开头的网络接口。例如:
#en 通常是以太网接口的名称前缀,如 en0、en1 等。
#eth 是传统的以太网接口前缀,如 eth0、eth1 等。
#em 可能是某些系统上以太网接口的前缀。
#bond 是用于网络绑定的接口前缀,通常用于高可用性或负载均衡。
这会指导 NCCL 使用 eth0
接口进行所有基于 IP 的通信。如果默认接口不合适,或者系统中有多个接口而你想使用特定的一个进行分布式训练任务,这样设置就非常必要了。
参考:日志提示“no socket interface found”_AI开发平台ModelArts_故障排除_训练作业_业务代码问题_华为云 (huaweicloud.com)
Environment Variables — NCCL 2.19.3 documentation (nvidia.com)