一、 问题描述:
使用nccl后端及mellanox网卡使用RoCE进行分布式训练时,出现错误 NCCL WARN Call to ibv_reg_mr_iova2 failed with error Cannot allocate memory
,添加环境变量export NCCL_DEBUG=INFO
以查看nccl日志信息,出现以下错误:
nccl4:1026504:1026828 [1] misc/ibvwrap.cc:278 NCCL WARN Call to ibv_reg_mr_iova2 failed with error Cannot allocate memory
nccl4:1026504:1026828 [1] NCCL INFO transport/net_ib.cc:870 -> 2
nccl4:1026504:1026828 [1] NCCL INFO include/net.h:28 -> 2
nccl4:1026504:1026828 [1] NCCL INFO transport/net.cc:614 -> 2
nccl4:1026504:1026828 [1] NCCL INFO proxy.cc:991 -> 2
nccl4:1026504:1026828 [1] NCCL INFO proxy.cc:1019 -> 2
参考nccl用户手册中的解决方法
编辑 /etc/security/limits.conf文件并添加以下行:
* soft memlock unlimited
* hard memlock unlimited
重启后还是相同的错误,通过在github提问得知,可以先检查ulimit -l
的输出,
(https://github.com/NVIDIA/nccl-tests/issues/206
这里只有8192 ,单位KB,即8MB,显然是不够的,但是在当前用户无法运行 ulimit -l unlimited
命令,加sudo的话会提示找不到命令。这是因为ulimit 是一个 shell 内置命令,这意味着它不是作为一个单独的可执行文件存在于文件系统中,而是集成在 shell 本身中。因此,不能直接使用 sudo 来执行 ulimit,因为 sudo 会尝试寻找一个可执行文件来运行,而不会识别 shell 内置的命令。
jxh@nccl4:~/nccl/nccl-tests$ type ulimit
ulimit is a shell builtin
二、 解决方案:
- 目前尝试的
sudo -s
进入root是可以的,但是也要在root用户中输入命令才可以使用IB运行。
- 或者在当前用户输入sudo -u root + 原本的命令,以root用户运行该命令。
三、 追根溯源:
偶然发现是因为 /etc/ssh/sshd_config文件被更改,UsePAM 被设置成了no,
UsePAM no
正常情况下参照nccl用户手册,编辑/etc/security/limits.conf文件再重启应该是可以的。
这是因为/etc/security/limits.conf文件是在 PAM 配置中被引用的,usepam 被设置成了no,所以导致非root用户都无法使用ib
–> 编辑 /etc/ssh/sshd_config文件,将UsePAM 设置成yes,再重启即可。