misc/ibvwrap.cc:278 NCCL WARN Call to ibv_reg_mr_iova2 failed with error Cannot allocate memory

文章讲述了在使用NCCL后端和Mellanox网卡通过RoCE进行分布式训练时遇到的内存分配错误。通过查阅NCCL用户手册,发现是由于/etc/ssh/sshd_config中的UsePAM设置影响了非root用户的权限。解决方案包括sudo-s进入root模式、使用sudo-uroot运行命令,以及修复sshd_config文件的UsePAM设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、 问题描述:

使用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用户手册中的解决方法

https://docs.nvidia.com/deeplearning/nccl/archives/nccl_2143/user-guide/docs/troubleshooting.html#infiniband

在这里插入图片描述

编辑 /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,再重启即可。

### 关于 `/misc/enable_dram_page_blacklisting` 错误的解决方案 当遇到 `ERROR enable_dram_page_blacklisting not supported` 的提示时,这通常意味着当前运行环境或硬件不支持 DRAM 页面黑名单功能。DRAM 页面黑名单是一种用于检测和隔离潜在损坏内存页的技术[^1]。 #### 可能的原因分析 此错误可能由以下几个原因引起: - 当前操作系统版本未实现对该特性的支持。 - 硬件平台缺乏必要的驱动程序或固件更新来启用该特性。 - BIOS 或 UEFI 设置中禁用了某些高级内存管理选项。 #### 解决方案概述 以下是几种常见的解决方法: #### 方法一:升级内核版本 如果使用的 Linux 内核版本较旧,则可能缺少对 `enable_dram_page_blacklisting` 的支持。可以通过升级到最新稳定版内核解决问题。具体操作如下: ```bash sudo apt update && sudo apt upgrade sudo apt install linux-generic-hwe-20.04 reboot ``` 上述命令适用于基于 Debian 的发行版(如 Ubuntu)。对于其他发行版,请查阅官方文档获取相应的内核升级指南[^2]。 #### 方法二:检查并配置BIOS设置 进入计算机的 BIOS 或 UEFI 配置界面,查找有关 ECCError-Correcting Code)内存的支持选项以及任何与内存健康监测相关的参数。确保这些选项已开启。需要注意的是,并非所有主板都提供此类功能;如果没有找到相关条目,则说明硬件本身不具备所需能力[^3]。 #### 方法三:验证模块加载状态 确认是否有尝试手动加载名为 `dram_blacklist` 的内核模块失败的情况发生。可以执行以下命令查看模块是否存在及其加载情况: ```bash lsmod | grep dram_blacklist ``` 假如返回为空白或者报错,则表明尚未安装对应模块文件。此时可以从源码编译生成所需的 `.ko` 文件后再试一次加载动作[^4]: ```bash git clone https://github.com/example/dram-blacklist-module.git cd dram-blacklist-module make sudo insmod dram_blacklist.ko ``` 注意替换实际仓库地址至真实项目链接处。 #### 方法四:忽略特定警告信息 作为最后手段,在不影响系统正常运作的前提下可以选择屏蔽掉这条告警消息。编辑启动引导记录加入额外参数抑制日志输出即可达成目的。例如修改 GRUB 配置文件添加 kernel cmdline 参数: ```bash sudo nano /etc/default/grub ``` 定位到类似下面这一行内容之后追加指定标志位: ```plaintext GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ignore_loglevel=7" ``` 保存更改后记得刷新 grub 并重启机器生效新设定[^5]。 --- ### 总结 通过以上四种途径中的任意一种均有可能消除 `ERROR enable_dram_page_blacklisting not supported` 提示现象的发生概率。然而最根本有效的办法还是依赖于及时跟进厂商发布的补丁包或是切换兼容性更好的软硬件组合形式完成部署工作流程优化目标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretend ^^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值