ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Ubuntu下NVIDIA驱动安装与nvidia-smi报错排查实战

Ubuntu下NVIDIA驱动安装与nvidia-smi报错排查实战 NVIDIA 显卡驱动在 Ubuntu 下的安装最麻烦的往往不是安装这一步而是装完以后nvidia-smi仍然报错、nouveau 和官方驱动互相干扰、CUDA 版本和驱动版本对不上。下面的内容直接进入实践先梳理驱动、CUDA、容器运行时之间的关系再按禁用 nouveau、安装驱动、验证nvidia-smi、配置 CUDA、打通 Docker GPU 的顺序完成一个可复现的 NVIDIA 环境。文章末尾会单独列出 Windows 端 NVIDIA App 和控制面板的常见问题排查以及在真实项目中值得维护的验收清单。命令和输出示例用于说明思路实际版本以生产环境为准。1. 先弄清楚驱动、CUDA、nvidia-smi 和容器运行时之间的关系1.1 这几个名词不是同一层东西普通用户很容易把“NVIDIA 驱动”和“CUDA”当成同一个东西实际上它们负责的层级完全不同。NVIDIA 驱动负责让操作系统识别 GPU并提供底层的设备访问能力。CUDA Toolkit 负责提供编译器、运行时库和数学库让 CUDA 程序能够在 GPU 上执行。nvidia-smi是驱动自带的系统管理工具它能不能正常显示 GPU 状态反映的是驱动层是否正常而不是 CUDA Toolkit 是否安装。容器运行时里还有一层nvidia-container-toolkit它负责把宿主机的 GPU 设备和驱动库暴露给 Docker 容器。容器本身不需要重复安装驱动但宿主机必须已经有一套正常工作的 NVIDIA 驱动。组件作用来源常用验证命令NVIDIA Driver加载内核模块提供 GPU 设备访问系统仓库或官方 runfilenvidia-smiCUDA Toolkit编译和运行 CUDA 程序NVIDIA 官方仓库或 runfilenvcc -VcuDNN深度网络算子库依赖 CUDANVIDIA 官方 deb/tar程序运行结果NVIDIA Container Toolkit让容器访问宿主机 GPUNVIDIA 官方 apt 源docker run --gpus all nvidia-smi1.2 驱动加载链路决定了 nvidia-smi 的报错方式Linux 下 NVIDIA 官方驱动不是单个可执行文件而是一组内核模块。核心模块是nvidia负责 GPU 与内核之间的通信nvidia_modeset负责显示输出nvidia_drm负责 DRM 接入nvidia_uvm负责 Unified Virtual Memory 相关功能。系统启动时内核加载这些模块用户态的libcuda.so再与内核模块通信。nvidia-smi报出couldnt communicate with the NVIDIA driver时问题通常不在nvidia-smi命令本身而在于内核模块没有加载、被 Secure Boot 拦截或者驱动的内核模块版本和当前内核不匹配。所以安装 NVIDIA 环境时第一步不是急着下载驱动而是先理解驱动模块是否真正进入了内核。后面的所有排查都围绕这条链路展开。2. 安装前先做环境检查确认该换驱动还是该修驱动2.1 先确认 GPU、系统版本和 Secure Boot 状态安装驱动之前先收集几项基本信息避免装到一半才发现硬件不识别或内核不匹配。uname -a cat /etc/os-release lspci | grep -i nvidia lspci -nnk | grep -i VGA\|3D mokutil --sb-statelspci | grep -i nvidia用于确认系统是否能看到 NVIDIA 显卡。如果没有输出先检查 BIOS 是否禁用了独立显卡或者 PCIe 接口是否正常。mokutil --sb-state用来确认 Secure Boot 是否开启因为 Secure Boot 会直接影响内核模块是否能被加载。2.2 判断当前驱动状态是“没装”还是“装坏了”执行nvidia-smi之前要预先判断三种常见状态nvidia-smi: command not found通常表示驱动没有安装或者/usr/bin路径里没有这个命令。NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver表示nvidia-smi存在但用户态无法与内核模块通信。正常输出 GPU 型号、驱动版本、显存和 CUDA Version表示驱动已经生效。执行完nvidia-smi后再用lsmod | grep nvidia确认模块加载情况。如果nvidia模块出现在列表里说明驱动已经被内核加载如果完全没有输出说明模块没有被加载。2.3 选择驱动安装方式不要盲目追求最新版Ubuntu 下安装 NVIDIA 驱动主要有三种方式各自适用场景不同。安装方式优点缺点推荐场景ubuntu-drivers autoinstall自动选择推荐驱动不一定是最新版本不折腾、日常开发apt install nvidia-driver-XXX稳定、依赖管理完整需要手动选择版本号明确知道版本需求NVIDIA 官方 runfile版本最新、可定制参数内核更新后需要重新处理新显卡或特殊场景对大多数 Ubuntu 用户来说优先用ubuntu-drivers autoinstall或者apt安装驱动。runfile 更适合需要特定新版驱动、并且有能力处理 DKMS 和 Secure Boot 的场景。2.4 内核头文件和 DKMS 是安装前的必选项驱动模块要编译进当前内核必须保证内核头文件存在。缺少头文件时驱动虽然能装上但内核一升级就可能失效之后就会随机触发nvidia-smi通信失败。sudo apt update sudo apt install linux-headers-$(uname -r) dkms build-essentialDKMS 的作用是让驱动模块跟随内核版本自动重新编译。安装完驱动后如果内核从6.5.0-25升级到6.5.0-27DKMS 会在新内核环境下重新编译nvidia模块避免每次升级内核后都要手动重装驱动。3. 标准安装流程先禁用 nouveau再安装官方驱动3.1 为什么必须禁用 nouveauUbuntu 自带的 nouveau 是 NVIDIA 的开源驱动。它虽然能点亮屏幕但在新 GPU 上的支持不完整而且与 NVIDIA 官方驱动存在设备节点和内核模块冲突。如果不把 nouveau 加入黑名单安装官方驱动后经常出现模块加载优先级错乱。3.2 创建 nouveau 黑名单并更新 initramfs创建黑名单文件后必须执行update-initramfs -u否则重启时 initramfs 里仍然可能保留 nouveau 模块。sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo reboot重启后验证lsmod | grep nouveau正常情况下没有任何输出。如果仍能看到 nouveau说明黑名单没有真正生效需要检查/etc/modprobe.d/下的配置是否被其他文件覆盖。3.3 通过 apt 安装官方驱动先枚举仓库里可用的驱动版本再安装。ubuntu-drivers devices apt-cache search nvidia-driver如果希望系统自动选择推荐驱动sudo ubuntu-drivers autoinstall如果已经明确知道版本号比如需要nvidia-driver-550可以直接安装sudo apt install nvidia-driver-550 sudo reboot版本号不要照搬先看ubuntu-drivers devices输出的推荐版本。3.4 使用 runfile 安装时的注意事项runfile 安装适合仓库里没有对应驱动版本的情况。基本流程是关闭图形界面、执行安装器、再重启。cd /tmp chmod x NVIDIA-Linux-x86_64-550.54.15.run sudo systemctl isolate multi-user.target sudo ./NVIDIA-Linux-x86_64-550.54.15.run sudo reboot执行systemctl isolate multi-user.target会退出图形界面操作前要先保存工作。安装器会询问是否注册 DKMS建议选择 yes。如果系统开启了 Secure Boot还要完成模块签名否则重启后nvidia模块无法加载。3.5 安装后验证驱动状态正常安装后nvidia-smi会输出类似下面的内容。----------------------------------------------------------------------------- | NVIDIA-SMI 550.54.15 Driver Version: 550.54.15 CUDA Version: 12.4 | |--------------------------------------------------------------------------- | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Tesla T4 On | 00000000:00:1E.0 Off | 0 | |---------------------------------------------------------------------------看到这一行内容说明驱动模块已经正常工作。右上角的CUDA Version: 12.4只代表驱动支持的最高 CUDA 版本不代表系统已经安装了 CUDA Toolkit。会不会有nvcc需要另外验证。4. nvidia-smi 报 cannot communicate with NVIDIA driver 的排查链路4.1 先判断是命令不存在、模块未加载还是设备不识别nvidia-smi报错时不要立刻重装系统。先按现象分类。现象常见原因第一步检查nvidia-smi: command not found驱动未安装或 PATH 异常dpkg -lcouldnt communicate with the NVIDIA driver内核模块未加载或版本不匹配dmesg、lsmodNo devices were foundGPU 未识别或驱动太旧lspci -nnk安装驱动后重启无显示Secure Boot 或显示管理器冲突mokutil --sb-state4.2 按顺序执行排查命令出现 couldnt communicate
返回列表