ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux服务器NVIDIA GPU驱动安装与nvidia-smi排错

Linux服务器NVIDIA GPU驱动安装与nvidia-smi排错 在 Linux 服务器上安装 NVIDIA GPU 驱动表面看是几条命令的事真到机房里、远程 SSH 里、生产容器里显卡型号、内核版本、Secure Boot、CUDA 版本、运行库、DKMS、容器工具链都会冒出来刷存在感。我自己从早期跑深度学习训练到后来给 GPU 集群做批量交付装驱动这件事踩过的坑不比调模型少。这篇内容面向刚拿到 GPU 服务器的新手也写给需要维护多卡机器的运维和算法同学目标很简单把 NVIDIA GPU 驱动装稳让 nvidia-smi 正常出图让 PyTorch、PaddleOCR、FFmpeg 这些上层工具能真正吃到显卡。1. 先搞清楚Linux服务器装NVIDIA GPU驱动到底在装什么1.1 驱动、CUDA、cuDNN不是一回事很多新手会把“装 GPU 驱动”和“装 CUDA”混在一起结果 nvidia-smi 出来了就以为 CUDA 也好了或者 CUDA 装上了nvidia-smi 却报错又回头怀疑显卡坏了。实际关系可以这样理解NVIDIA GPU 驱动是操作系统和显卡之间的翻译官负责让内核识别显卡、加载 nvidia 内核模块、创建 /dev/nvidia* 设备节点CUDA Toolkit 是建立在驱动之上的开发套件提供 nvcc、cudart、cuBLAS 等库cuDNN 又是 CUDA 之上专门为深度学习优化的库。没有驱动CUDA 无从谈起只有驱动没有 CUDA Toolkit很多编译型项目也跑不起来。nvidia-smi 右上角显示的 “CUDA Version: 12.x” 经常让人误会。它代表当前驱动最高支持的 CUDA 运行时版本不代表系统里已经装了 CUDA 12.x。比如你只装了驱动没有装 CUDA Toolkitnvidia-smi 依然会显示这个版本号但 nvcc -V 可能提示找不到命令。反过来如果你装 CUDA Toolkit 时选择了 runfile并且勾选了安装驱动它可能会覆盖系统原有驱动造成版本混乱。我的习惯是宿主机只走发行版仓库或官方 runfile 装驱动CUDA Toolkit 单独装容器环境里再用镜像解决 CUDA 和 cuDNN 的版本组合。还有一个容易忽略的角色nvidia-container-toolkit。如果你用 Docker 或 Kubernetes 跑 GPU 任务宿主机只需要驱动容器里需要的是 CUDA 运行时和框架。nvidia-container-toolkit 负责把宿主机的驱动和 GPU 设备挂进容器。它和驱动版本有兼容关系但通常不需要和容器内 CUDA 版本完全一致。理解这条边界能避免你在容器里重复装驱动也能避免把宿主机搞乱。1.2 什么场景该选哪种安装方式Linux 下装 NVIDIA 驱动常见路线就三条发行版仓库安装、NVIDIA 官方 runfile 安装、容器化或云厂商预装镜像。不同路线适合不同人。对绝大多数 Ubuntu、Debian、RHEL、Rocky、AlmaLinux 用户我第一推荐发行版仓库安装尤其是 Ubuntu 的 ubuntu-drivers 或 apt 源。它最大的好处是和内核升级、DKMS 自动重建模块配合得比较好后期维护成本低。缺点是仓库里的驱动版本不一定最新可能落后官方一两个大版本。官方 runfile 适合离线机器、特定版本需求、仓库里没有对应驱动的发行版或者你需要精确控制安装选项的场景。它的优势是版本齐全、安装选项多缺点是升级内核后容易翻车需要手动重装或依赖 DKMS。如果你既想用 runfile 又想省心务必加 --dkms 参数并且装好 kernel headers。还有一点runfile 和 apt 驱动不要混用今天 apt 装、明天 runfile 覆盖残留文件会让你排查到怀疑人生。容器化路线适合 Kubernetes 或 Docker 集群。宿主机只装驱动业务镜像里带 CUDA、cuDNN、PyTorch。云厂商提供的 GPU 镜像通常已经调好但要注意镜像里的驱动版本和宿主机内核是否匹配。如果你用 bare metal 自己装建议把驱动、容器运行时、监控组件一次性做成标准镜像或 Ansible 剧本。GPU 集群里最怕的不是装不上而是每台机器版本不一致。1.3 安装前必须确认的硬件与系统信息上手前先别急着敲安装命令把机器底细摸清楚。下面这几条命令我每次都会跑记录到交付文档里lspci -nn | grep -i nvidia uname -r cat /etc/os-release gcc --version ldd --version mokutil --sb-state free -h df -hlspci 用来确认系统是否识别到 NVIDIA 显卡以及显卡的 PCI ID。如果这里都没有先检查 BIOS 里是否禁用了 PCIe 插槽、Above 4G Decoding、Resizable BAR 等选项。uname -r 是当前内核版本装 kernel headers 和 DKMS 时必须严格对应。cat /etc/os-release 决定你用 apt 还是 dnf也决定软件源地址。gcc 和 glibc 版本在 runfile 编译内核模块时很关键版本不匹配会直接编译失败。mokutil --sb-state 用来查看 Secure Boot 状态。如果显示 enabled驱动内核模块必须签名否则加载会被内核拒绝。Ubuntu 的 apt 驱动通常会自动处理 DKMS 签名但首次安装会弹出一个 MOK 密码设置界面重启后还要进 MOK Manager 完成注册。很多人远程重启后 nvidia-smi 报错就是因为这一步没做。还有一个细节如果服务器是多卡机器记下 GPU 数量、NVLink 拓扑、PCIe 插槽位置。后面排查“某张卡掉线”时这些信息比盲目重启有用得多。2. 安装前的系统准备把坑提前填平2.1 更新系统与安装编译工具链不管你用 apt 还是 dnf安装前先更新软件源并装编译工具链。NVIDIA 驱动包含内核模块内核模块需要针对当前运行内核编译。发行版仓库安装虽然会帮你拉依赖但很多最小化安装的系统没有 make、gcc、dkms、kernel headers装到一半才报错很浪费时间。Ubuntu 系可以这样准备sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r) sudo apt install -y software-properties-common pciutilsRHEL、Rocky、AlmaLinux 系用sudo dnf install -y gcc make dkms kernel-devel-$(uname -r) kernel-headers-$(uname -r) sudo dnf install -y pciutils elfutils-libelf-devel这里有个经验kernel-devel 和 kernel-headers 的版本必须和 uname -r 完全一致。如果你刚执行过系统更新内核可能已经升级但当前运行内核还是旧版本这时直接装驱动会针对新内核编译重启后才发现旧模块不能加载。稳妥做法是更新后先重启一次确认进入新内核再装驱动。远程服务器重启前记得确认带外管理可用或者至少有回滚方案。工具链装好后可以顺手检查 /usr/src 下有没有内核头文件目录dkms status 是否为空。如果系统启用了 UEFI Secure Boot还要提前决定是走 MOK 签名还是关掉 Secure Boot。生产服务器通常不建议随意关 Secure Boot但这也取决于公司安全策略。个人实验机可以关省掉签名步骤。2.2 禁用nouveau并处理内核模块Linux 内核自带一个开源 NVIDIA 显卡驱动 nouveau。它和 NVIDIA 官方驱动冲突不禁用的话官方驱动模块可能加载失败nvidia-smi 也会报通信错误。很多教程只让你 blacklist nouveau但实际还要更新 initramfs否则重启后开机会重新加载。Ubuntu/Debian 做法sudo tee /etc/modprobe.d/blacklist-nouveau.conf /dev/null EOF blacklist nouveau options nouveau modeset0 EOF sudo update-initramfs -uRHEL 系做法echo -e blacklist nouveau\noptions nouveau modeset0 | sudo tee /etc/modprobe.d/blacklist-nouveau.conf sudo dracut --force对于使用 GRUB 的系统还可以在内核启动参数里加 nouveau.modeset0 rd.driver.blacklistnouveau。RHEL 系可以用 grubby 统一更新sudo grubby --update-kernelALL --argsnouveau.modeset0 rd.driver.blacklistnouveau改完后重启再用 lsmod | grep nouveau 确认没有输出。如果仍然有 nouveau检查是否有多个 blacklist 文件冲突或者显卡被 framebuffer 占用。服务器无头环境一般不需要图形界面禁用 nouveau 不会影响 SSH。但如果这台机器同时要接显示器禁用后可能分辨率异常这属于正常现象装完 NVIDIA 驱动后会恢复。2.3 Secure Boot与DKMS的取舍Secure Boot 是我见过导致驱动安装失败最多的问题之一。开启后内核只加载签名的模块NVIDIA 驱动、DKMS 自动编译出来的 nvidia.ko 如果没有签名加载时会报 “Key was rejected by service” 或 “module verification failed”。Ubuntu 下用 apt 装 nvidia-driver 时DKMS 会尝试用 MOK 签名安装过程中会问你要不要设置 Secure Boot 密码。设置后重启屏幕会出现蓝色 MOK Manager选择 Enroll MOK输入密码再继续启动。远程机器看不到这个界面就需要 IPMI 或 KVM 带外操作。如果你不想折腾签名可以在 BIOS 里关闭 Secure Boot。但很多企业安全基线不允许关闭。折中方案是使用发行版仓库驱动让它自动走 DKMS 签名流程或者手动给模块签名。检查是否启用mokutil --sb-state如果是 enabled再看模块是否已签名modinfo nvidia | grep -i sigDKMS 的好处是内核升级后自动重建驱动模块。装驱动时务必确认 dkms status 里有 nvidia 条目。如果只用了 runfile 且没加 --dkms内核一升级nvidia-smi 就可能直接失效。我的习惯是只要系统支持 DKMS就优先用 DKMS如果 runfile 安装也一定加 --dkms。2.4 远程服务器操作风险与备份策略远程装驱动有风险因为禁用 nouveau、卸载旧驱动、重启这些操作都可能让 SSH 断掉。我吃过一次亏在 SSH 里直接卸载驱动网络没断但图形服务崩了重启后 Secure Boot 拦截模块机器再也连不上最后只能走带外。所以现在只要涉及驱动变更我都会先做三件事第一用 tmux 或 screen 开一个持久会话避免 SSH 断线导致命令中断第二确认 IPMI、iDRAC、iLO 或云控制台可用第三记录当前驱动版本、内核版本、模块状态必要时能回滚。tmux new -s gpu-driver如果机器上有正在跑的训练任务先确认任务可以中断或者安排在维护窗口。驱动安装通常会卸载旧模块、停止图形服务正在使用 GPU 的进程会报错或挂起。对于生产 GPU 集群建议先在一台同型号机器上验证再滚动升级。还可以用系统快照或云盘快照做回滚点。别小看这一步驱动升级失败时最快恢复业务的方式往往不是现场修而是回滚到可用快照。3. Ubuntu/Debian系保姆级安装流程3.1 使用apt仓库安装推荐Ubuntu 服务器安装 NVIDIA 驱动最省心的方式是用 ubuntu-drivers 或 apt。先更新并查看推荐驱动sudo apt update ubuntu-drivers devices输出里会列出显卡型号和可安装驱动通常带 recommended 标记的就是适合当前硬件的版本。可以直接自动安装sudo ubuntu-drivers autoinstall也可以指定版本例如sudo apt install -y nvidia-driver-535如果仓库里没有你想要的新驱动可以添加官方 graphics-drivers PPAsudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ubuntu-drivers devices然后安装推荐版本。安装过程中如果遇到 Secure Boot 密码提示设置一个记得住的密码重启后进 MOK Manager 完成注册。装完重启sudo reboot重启后登录运行nvidia-smi如果能看到 GPU 列表、驱动版本、显存占用说明驱动安装成功。此时不需要额外运行 nvidia-xconfig服务器无头环境更不需要。nvidia-xconfig 会生成 Xorg 配置有时反而导致图形界面问题。只有本地图形工作站需要调分辨率或多屏时才考虑使用它。3.2 使用官方.run文件安装离线/特定版本有些内网机器不能访问 apt 源或者业务必须锁定某个驱动版本这时用 NVIDIA 官方 runfile。先从官方驱动下载页获取对应版本例如 NVIDIA-Linux-x86_64-550.xx.run。上传到服务器后chmod x NVIDIA-Linux-x86_64-*.run sudo systemctl isolate multi-user.target sudo ./NVIDIA-Linux-x86_64-*.run --dkms --no-opengl-files --no-x-check --no-nouveau-check参数解释一下--dkms 让驱动注册到 DKMS内核升级后自动重建--no-opengl-files 适合无头计算服务器避免覆盖系统 OpenGL 库--no-x-check 和 --no-nouveau-check 用于非图形环境跳过检查。如果你的机器需要图形渲染、游戏或桌面显示不要加 --no-opengl-files。首次安装不建议直接用 --silent因为安装器会提示是否注册签名、是否安装 32 位兼容库静默模式容易漏选项。安装完成后重启再检查 nvidia-smi。如果 runfile 安装过程中提示 “Unable to find the kernel source tree”说明 kernel headers 没装好回到准备步骤安装 linux-headers-$(uname -r)。如果提示 gcc 版本不匹配检查 /var/log/nvidia-installer.log里面会写清楚编译失败原因。runfile 的日志非常详细排查时优先看它。3.3 验证驱动与nvidia-smi排错驱动装完后验证要分层次做。第一层看内核模块是否加载lsmod | grep nvidia cat /proc/driver/nvidia/version第二层看设备节点和 nvidia-smils -l /dev/nvidia* nvidia-smi第三层看多卡和拓扑nvidia-smi -L nvidia-smi topo -m如果 nvidia-smi 报 “NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver”先别急着重装。依次检查nouveau 是否还在、nvidia 模块是否加载、驱动和内核是否匹配、Secure Boot 是否拦截、DKMS 是否编译成功。常用命令lsmod | grep -i nouveau lsmod | grep -i nvidia dmesg | grep -i nvidia | tail -50 dkms status mokutil --sb-state如果模块没加载尝试手动加载sudo modprobe nvidia如果报 “Module nvidia not found”说明模块没编译或没安装。如果报签名错误回到 Secure Boot 部分处理。如果 modprobe 成功但 nvidia-smi 还失败检查 /dev/nvidiactl、/dev/nvidia0 是否创建权限是否正确。服务器上通常需要 root 或 video 组权限。3.4 多卡与GPU集群批量安装思路单机装完只是开始GPU 集群最怕版本漂移。我的做法是先定义一套标准组合操作系统版本、内核版本、NVIDIA 驱动版本、CUDA 版本、容器运行时版本、监控组件版本。然后用 Ansible 或内部脚本批量推送。流程一般是先禁用 nouveau、安装 kernel headers、安装驱动、重启、验证 nvidia-smi、注册到监控、标记机器可用。不要一次性全量重启按机架或按批次滚动每批留出验证时间。批量安装时驱动仓库建议用内部镜像避免每台机器都去外网拉包。对于 runfile可以提前放到内网文件服务器用校验和确认文件完整。多卡机器还要注意 GPU 拓扑和 NUMA 绑定nvidia-smi topo -m 能看出 GPU 之间是 NVLink 还是 PCIe以及 GPU 到网卡的亲和性。训练任务性能不达标时有时不是驱动问题而是任务进程跨了 NUMA 节点。驱动只负责让卡可用拓扑优化要靠上层调度和绑定策略。4. RHEL/CentOS/Rocky/AlmaLinux系安装要点4.1 准备ELRepo与依赖RHEL 系安装 NVIDIA 驱动常用 ELRepo 仓库。先装 EPEL 和 ELReposudo dnf install -y epel-release sudo dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm具体 elrepo-release 包版本按你的系统大版本替换。然后安装编译依赖sudo dnf install -y gcc make dkms kernel-devel-$(uname -r) kernel-headers-$(uname -r)如果是计算节点安装sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cudaakmod-nvidia 会在内核升级后自动构建模块比 kmod-nvidia 更适合长期维护。xorg-x11-drv-nvidia-cuda 会带上 CUDA 相关的用户态库和 nvidia-smi。安装完成后重启。如果只想装驱动不装图形组件也可以只装 akmod-nvidia 和 nvidia-driver但不同仓库包名有差异建议先用 dnf search nvidia 确认。4.2 驱动安装与nouveau处理RHEL 系同样要禁用 nouveau。除了 modprobe.d 文件最好用 grubby 更新内核参数sudo grubby --update-kernelALL --argsnouveau.modeset0 rd.driver.blacklistnouveau echo -e blacklist nouveau\noptions nouveau modeset0 | sudo tee /etc/modprobe.d/blacklist-nouveau.conf sudo dracut --force sudo reboot重启后检查lsmod | grep nouveau lsmod | grep nvidia nvidia-smi如果 dnf 安装时提示 “nothing provides kernel-devel”说明当前运行内核和仓库内核版本不一致。先 sudo dnf update 并重启再装驱动。RHEL 系对内核版本管理比较严格尤其是启用了内核锁定或第三方安全模块时加载未签名模块可能被拒绝。遇到这种情况查看 dmesg 中的 tainted 或 module verification 信息再决定签名还是调整安全策略。4.3 内核升级后的驱动重建RHEL 系用 akmod 或 DKMS 后内核升级一般会自动重建但不是每次都能成功。升级内核后建议执行sudo dkms status sudo akmods --force sudo dracut --force如果 nvidia-smi 又报通信错误先看当前内核是否和模块匹配uname -r modinfo nvidia | grep filename模块路径里通常包含内核版本。如果路径是旧内核说明新内核模块没构建。查看 /var/lib/dkms/nvidia/*/build/make.log 或 journalctl -k找到编译错误。最常见原因是 kernel-devel 没装、gcc 版本变化、Secure Boot 签名失败。生产环境建议使用长期支持内核并配合维护窗口升级而不是让机器自动更新内核。5. 驱动装完后CUDA、PyTorch、PaddleOCR、FFmpeg怎么接上5.1 CUDA Toolkit与驱动版本匹配驱动正常后如果你要编译自定义 CUDA 程序或者某些框架要求系统级 CUDA Toolkit可以安装 CUDA Toolkit。Ubuntu 下可以用 NVIDIA 官方仓库wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt install -y cuda-toolkit-12-4安装后配置环境变量echo export PATH/usr/local/cuda-12.4/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc nvcc -V注意驱动版本必须大于等于 CUDA Toolkit 要求的最低驱动版本。比如较新的 CUDA 12.x 对驱动有最低要求版本不够时 nvcc 能装但运行会报 “CUDA driver version is insufficient”。最稳妥的方式是查 NVIDIA 官方兼容表或者直接用 nvidia-smi 显示的 CUDA Version 作为上限参考。不要只看 Toolkit 版本驱动和 Toolkit 是两层。5.2 PyTorch GPU验证PyTorch 现在推荐用官方 pip 源安装选择合适的 CUDA 版本。例如python3 -m pip install --upgrade pip pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121安装后验证python3 - PY import torch print(torch:, torch.__version__) print(cuda available:, torch.cuda.is_available()) print(device count:, torch.cuda.device_count()) if torch.cuda.is_available(): print(device name:, torch.cuda.get_device_name(0)) PY如果 cuda available 是 False先看 torch.version.cuda再看 nvidia-smi。常见原因有装成了 CPU 版 PyTorch、驱动版本太低、CUDA 运行时和驱动不匹配、容器里没挂 GPU。不要急着重装驱动先确认 PyTorch 是不是 GPU 版本。pip 安装时如果 index-url 写错很容易拉成 CPU 包。也可以在 Python 里打印 torch.backends.cudnn.version()确认 cuDNN 是否可用。5.3 PaddleOCR GPU版安装要点PaddleOCR 的 GPU 版依赖 PaddlePaddle GPU而 PaddlePaddle GPU 对 CUDA、cuDNN 版本要求比较具体。安装前先到 PaddlePaddle 官网确认当前版本对应的 CUDA 版本再用官方命令安装。例如 CUDA 11.8 环境可能使用python3 -m pip install paddlepaddle-gpu2.6.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/然后安装 PaddleOCRpython3 -m pip install paddleocr验证python3 -c import paddle; paddle.utils.run_check()如果提示 “no CUDA runtime is found” 或 “libcudart.so not found”说明 CUDA 运行时路径没配好或者 Paddle 版本和 CUDA 不匹配。PaddleOCR 在 GPU 上跑推理时还要注意 cuDNN 版本。有些版本要求 cuDNN 8.x如果系统里没有可以通过 conda 或官方 deb 包安装。我的建议是不要把 PaddleOCR 的系统依赖和宿主机驱动混在一起尽量用 conda 或容器隔离宿主机只保证驱动正常。5.4 FFmpeg调用NVIDIA硬件编解码FFmpeg 调 NVIDIA 硬件编解码前提是 FFmpeg 编译时启用了 NVENC/NVDEC并且驱动正常。先检查ffmpeg -hwaccels ffmpeg -encoders | grep nvenc如果能看到 h264_nvenc、hevc_nvenc说明支持。转码示例ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -b:v 5M -c:a copy output.mp4如果提示 “Unknown encoder h264_nvenc”说明当前 ffmpeg 没有编译 NVENC。可以安装发行版带 NVENC 的包或者自行编译编译参数通常包括 --enable-nonfree --enable-cuda-nvcc --enable-libnvidia-encode。注意自行编译 FFmpeg 需要 CUDA Toolkit 和 nv-codec-headers。硬件解码也可以加 -hwaccel cuda但并非所有编码格式都支持实际生产里要按输入格式测试。硬件编码速度快但同码率下画质和 CPU 编码有差异建议根据业务调 preset 和码率。5.5 容器与GPU集群组合容器里用 GPU宿主机装好驱动后还需要 nvidia-container-toolkit。以 Docker 为例安装后配置运行时sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker测试docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi如果容器里 nvidia-smi 正常说明驱动和容器工具链打通。Kubernetes 集群还需要 NVIDIA device plugin把 GPU 作为资源暴露给调度器。GPU 集群里我倾向于宿主机驱动版本统一业务镜像自带 CUDA 和框架监控用 DCGM exporter。这样升级驱动时业务镜像不用大改只要验证兼容性即可。容器化不是银弹但能显著降低框架依赖冲突。6. 常见故障排查与避坑清单6.1 nvidia-smi报错“has failed because it couldnt communicate...”这个报错几乎每个装 NVIDIA 驱动的人都见过。完整报错通常是 “NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.” 排查顺序我固定为第一lspci 确认显卡在第二lsmod 看 nvidia 模块是否加载第三dmesg 看内核拒绝原因第四dkms status 看模块是否构建第五mokutil 看 Secure Boot第六uname -r 和 modinfo 路径是否匹配。命令组合lspci -nn | grep -i nvidia lsmod | grep -i nvidia sudo modprobe nvidia dmesg | grep -i nvidia | tail -80 dkms status mokutil --sb-state uname -r如果 modprobe 报 “Required key not available”基本就是 Secure Boot 签名问题。如果报 “Module nvidia not found”查 DKMS 日志。如果模块加载了但 nvidia-smi 还失败检查是否装了多个版本的驱动或者 /dev/nvidia* 权限异常。还有一种情况内核升级后没有重启当前内核和模块不匹配重启通常能解决。6.2 黑屏/循环登录/分辨率异常服务器无头环境一般不会遇到黑屏但本地工作站会。装完驱动后黑屏、循环登录常见原因是驱动和显卡型号不匹配、Xorg 配置残留、Wayland 与 NVIDIA 兼容问题、nouveau 未完全禁用。处理时先看日志journalctl -b -p err cat /var/log/Xorg.0.log | grep -i nvidia如果是 Xorg 配置残留可以备份并移除 /etc/X11/xorg.conf再重启图形服务。Ubuntu 上可以尝试在登录界面切换到 Xorg 会话或者检查 GDM 配置。循环登录有时和用户主目录权限有关尤其是 .Xauthority 属主变成 root。服务器上如果不需要图形界面建议直接设成 multi-user.target避免图形服务干扰sudo systemctl set-default multi-user.target6.3 驱动版本与内核、GCC、glibc不匹配runfile 安装失败最常见的原因是内核头文件缺失、GCC 版本与编译内核时不一致、glibc 版本太旧。日志在 /var/log/nvidia-installer.log。看到 “The kernel header file ... does not exist” 就装 kernel headers看到 “cc: version mismatch” 就检查 gcc --version 和 cat /proc/version。RHEL 系有时需要安装 elfutils-libelf-devel。Ubuntu 最小化安装可能没有 dkms装上即可。另一个坑是 DKMS 模块签名。Secure Boot 开启时DKMS 编译出来的模块需要签名。Ubuntu 的 nvidia-driver 包会走 MOKRHEL 系可能需要手动配置。检查 dmesg 里是否有 “Loading of unsigned module is rejected”。如果是重新配置签名或关闭 Secure Boot。注意关闭 Secure Boot 前确认安全策略允许不要在生产机器上随意操作。6.4 权限与持久化设置nvidia-smi 普通用户能不能运行取决于 /dev/nvidia* 权限。通常安装驱动后会创建 video 和 render 组把需要跑 GPU 的用户加进去sudo usermod -aG video,render $USER重新登录后生效。GPU 服务器上还建议开启持久模式避免频繁初始化sudo nvidia-smi -pm 1 sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced持久模式对多卡和容器密度高的场景有帮助。还可以用 nvidia-smi -q 查看功耗、温度、ECC、时钟。如果发现 GPU 掉卡先看 dmesg 是否有 Xid 错误。Xid 错误码能帮助定位是驱动、硬件、电源还是散热问题。不要看到掉卡就重装驱动先收集日志。6.5 常见问题速查表现象常见原因优先检查处理方向nvidia-smi 通信失败模块未加载、Secure Boot、nouveau 冲突lsmod、dmesg、mokutil修复签名、禁用 nouveau、重建 DKMS安装时找不到内核头kernel-devel 缺失或版本不匹配uname -r、/usr/src安装对应 headers重启后再装内核升级后驱动失效DKMS 未重建、akmod 失败dkms status、akmods强制重建检查编译日志容器内无 GPU未装 nvidia-container-toolkitdocker run --gpus all安装工具链重启 DockerPyTorch 不可用装了 CPU 版或驱动太旧torch.version.cuda重装 GPU 版匹配 CUDAFFmpeg 无 nvenc编译未启用 NVENCffmpeg -encoders换构建或自行编译循环登录Xorg 配置、权限、WaylandXorg 日志、.Xauthority移除 xorg.conf切 Xorg某张卡掉线Xid、电源、散热、PCIedmesg、nvidia-smi -q收集 Xid检查硬件和供电7. 实操心得我踩过的坑和稳定交付习惯7.1 版本锁定与升级窗口驱动版本不要追新尤其在生产 GPU 集群。新驱动可能修复问题也可能引入新问题。我的习惯是选择 NVIDIA 长期支持分支或发行版仓库推荐版本记录驱动、内核、CUDA、cuDNN、框架版本形成兼容矩阵。升级前先在测试机验证再滚动到生产。Ubuntu 上可以用 apt-mark hold 锁定内核和驱动包sudo apt-mark hold nvidia-driver-535 linux-image-generic linux-headers-genericRHEL 系可以用 versionlock 插件。锁定不是永远不升级而是把升级变成可控动作。每次升级前备份当前 nvidia-smi 输出、dkms status、内核版本升级后逐项对比。GPU 集群里版本不一致会导致任务莫名其妙跑不起来排查成本很高。7.2 远程操作保命技巧远程装驱动保命技巧比技术细节还重要。第一tmux 里操作第二确认带外管理第三保留一个 root 会话不要关第四提前下载好驱动和内核头文件第五记录回滚命令。如果机器已经在跑业务最好先摘除调度等任务结束后再操作。重启前用 sync 落盘避免文件系统问题。对于云主机确认控制台 VNC 可用否则 Secure Boot 的 MOK 界面根本进不去。卸载驱动也要干净。apt 安装的可以用sudo apt purge ^nvidia-.* sudo apt autoremoverunfile 安装的用sudo /usr/bin/nvidia-uninstall卸载后检查 /etc/modprobe.d 里是否还有残留配置/lib/modules/$(uname -r)/kernel/drivers/video 里是否还有旧模块。混装过的机器建议彻底清理后再装否则 nvidia-smi 可能调用到旧库。7.3 监控、温度与功耗驱动装好只是可用长期稳定还要看监控。常用命令nvidia-smi nvidia-smi dmon -s pucvmet nvidia-smi -q -d TEMPERATURE,POWER,CLOCKnvtop 适合交互查看DCGM 适合集群监控。GPU 温度过高会降频功耗墙和散热策略会影响训练吞吐。服务器 GPU 的风扇策略通常由 BMC 控制不要随意用 nvidia-settings 调风扇。如果发现 GPU 利用率不高但显存占满可能是数据加载瓶颈如果 CPU、GPU、内存都不高但任务卡住检查是否在等 I/O 或锁。驱动层能提供 Xid、ECC、Retired Pages 等信息定期采集有助提前发现硬件问题。7.4 给新手的三条路线建议如果你只是个人实验机Ubuntu ubuntu-drivers autoinstall 最省心遇到 Secure Boot 就按提示注册 MOK。如果你在内网离线环境用官方 runfile --dkms提前准备好 kernel headers 和 gcc装完立刻记录版本。如果你维护 GPU 集群宿主机统一驱动版本业务跑容器用 nvidia-container-toolkit 和 DCGM所有变更走 Ansible 和分批滚动。三条路线不要混着走混装是大多数玄学问题的源头。我现在给新机器装驱动通常先把 lspci、uname、os-release、Secure Boot 状态查一遍扔进 tmux再决定用 apt 还是 runfile。装完不只看 nvidia-smi还会跑一次 PyTorch 的 cuda.is_available再跑一个容器 nvidia-smi三层都通了才交给业务。这套流程不花哨但能少熬很多夜。
返回列表