问题描述

使用nvidia-smi时,发现 Nvidia Tesla L40 的显存显示为 45GiB (46080MiB) 而不是 48GiB (49140MiB)。

查阅资料后得知,需要关闭ECC功能,才能利用这3GiB的显存(同时还可以提升5~10%的计算性能)。

运行如下命令,关闭4张L40的ECC功能,输入nvidia-smi发现无效,故重启,重启后仍然无效

sudo nvidia-smi -i 0,1,2,3 -e 0

故障原因

分析内核日志dmesg,得知,由于nVidia对内核进行了patch(通过 NVIDIA 内核模块,如 nvidia-drm 和 nvidia-modeset)

在某些情况下,NVIDIA 的内核模块会阻止驱动程序 reload 参数,因而无法正常开关 gpu 的 ECC 功能。

这种故障通常发生在使用 apt 安装 nvidia 驱动后,原因是 apt 的 deb 包安装脚本无法正确对内核进行 patching。

因而,建议转为使用https://developer.nvidia.com/cuda-downloadsrunfile,安装会更加友好和可靠。

解决方案

以下操作需要root权限

  • 使用 nvidia-smi 关闭显卡的 ecc 功能 (将0,1,2,3自行替换为你的显卡id)Disable ECC and check whether the “pending” mode changes to enabled.

    sudo nvidia-smi -i 0,1,2,3 -e 0
    sudo nvidia-smi -q -d ECC #查看ecc是否关闭
    

    如果在输出中看到,则说明更改仍在pending。

    ECC Mode
    Current                           : Disable
    Pending                           : Enable
    

    如果重启或执行 sudo nvidia-smi -r 后,发现 ECC 仍无法关闭,请执行 sudo nvidia-smi -q -d ECC 检查状态。如果 Current 为 Enable 且 Pending 为 Disable,则需要重新加载显卡驱动内核模块,请继续按照以下步骤操作

  • 使用Ctrl+Alt+F2,或者在ssh终端中,将系统模式切换到命令行模式,关闭桌面管理相关的服务 Disable display manager

    sudo systemctl isolate multi-user.target
    sudo nvidia-smi -i 0,1,2,3 -e 0 # ensure ECC disable status is pending
    
  • 手动卸载 NVIDIA 内核模块 Manually unload drivers’ kernel modesetting

    sudo modprobe -r nvidia-drm # modprobe -r的效果等同于rmmod
    sudo modprobe -r nvidia_drm
    sudo modprobe -r nvidia_modeset
    sudo modprobe -r nvidia-uvm
    
  • 重载GPU以及驱动 Reset & Reload Driver and GPU

    查看 ECC 是否成功关闭,此时nvidia-smi中的显存应该为48GiB;

    sudo nvidia-smi -r
    sudo nvidia-smi -q -d ECC #check ecc status 
    

    得到如下输出,则说明成功。

    ECC Mode
    Current                           : Disable
    Pending                           : Disable
    
  • 切换到可视化模式 Start the graphical environment again

    sudo systemctl start graphical.target
    sudo nvidia-smi -q -d ECC #check ecc status 
    

参考文档