尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Tesla V100s 驱动安装避坑指南:Ubuntu 22.04 + CUDA 12.2 + cuDNN 8.9.7

Tesla V100s 驱动安装避坑指南:Ubuntu 22.04 + CUDA 12.2 + cuDNN 8.9.7 1. 为什么 Tesla V100s 的驱动安装值得单独写一篇避坑指南Tesla V100s 这张卡在二手市场和实验室存量设备里保有量不小32GB HBM2 显存、4096 个 CUDA 核心放到今天跑中等规模的深度学习训练和推理依然能打。但它和普通 GeForce 显卡不一样属于数据中心级计算卡没有视频输出接口驱动安装逻辑和消费级显卡有本质区别。很多人第一次拿到 V100s习惯性照着 GeForce 的教程走结果卡在nvidia-smi报错、内核模块加载失败、CUDA 版本和驱动版本对不上这些坑里一折腾就是一整天。这篇内容面向的是手里有 Tesla V100s、系统是 Ubuntu 22.04、需要把驱动加 CUDA 12.2 加 cuDNN 8.9.7 这套组合跑通的人。不管你是刚接手实验室服务器的新手还是想给旧机器重装环境的工程师这套流程都能直接抄。核心思路是先把驱动版本和 CUDA 版本的对应关系锁死再用官方 runfile 方式安装驱动最后装 CUDA 和 cuDNN全程避开 apt 自动升级带来的版本漂移问题。我前后在四台不同批次的 V100s 机器上装过这套环境踩过的坑包括内核头文件缺失导致 DKMS 编译失败、Secure Boot 拦截未签名模块、CUDA 装完后nvcc找不到、cuDNN 版本和 CUDA 小版本不匹配导致 PyTorch 报错。下面把这些经验按安装顺序拆开讲每一步都说明为什么这么做以及不这么做会出什么问题。2. 安装前的版本锁定与硬件确认2.1 先搞清楚 V100s 到底需要哪个驱动版本Tesla V100s 基于 Volta 架构计算能力 7.0。这个架构对驱动版本有最低要求但更重要的是 CUDA 12.2 对驱动版本有明确的下限。CUDA 12.2 要求 Linux 驱动版本不低于 535.54.03而 V100s 在 535 系列驱动上是支持的。我实测下来535.104.05 和 535.129.03 这两个版本在 V100s 上最稳再往上的 545、550 系列虽然也能装但部分老框架会有兼容性告警。这里有个关键点不要盲目追新驱动。数据中心卡和消费卡不同新驱动往往优先适配新架构对 Volta 的优化反而可能回退。我建议锁定 535.129.03这个版本同时满足 CUDA 12.2 的要求又对 V100s 有完整支持。版本对应关系可以这样记组件推荐版本最低要求说明NVIDIA 驱动535.129.03535.54.03满足 CUDA 12.2 下限CUDA Toolkit12.212.2与 cuDNN 8.9.7 匹配cuDNN8.9.78.9.x对应 CUDA 12.x系统Ubuntu 22.0422.04内核 5.15 系列2.2 确认显卡被系统正确识别装驱动之前先用lspci确认系统能看到这张卡。这一步很多人跳过结果驱动装完了发现卡根本没被识别白忙一场。lspci | grep -i nvidia正常输出应该类似3D controller: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB]。如果这里什么都没有说明卡没插好或者 BIOS 里 PCIe 槽被禁用了先解决硬件层面问题别急着装驱动。接着确认系统版本和内核版本lsb_release -a uname -rUbuntu 22.04 默认内核是 5.15这个内核和 535 驱动配合没问题。如果你升级过内核到 6.x需要确认驱动是否支持535.129.03 对 6.2 内核是支持的但 6.5 以上就可能有编译问题。2.3 处理 Secure Boot 这个隐形杀手这是 V100s 驱动安装里最容易被忽略的坑。如果主板开了 Secure BootNVIDIA 的内核模块没有签名加载时会被直接拦截表现就是驱动装完了但nvidia-smi报Unable to load the kernel module nvidia.ko。检查 Secure Boot 状态mokutil --sb-state如果输出SecureBoot enabled有两个选择一是进 BIOS 关掉 Secure Boot二是给模块签名。实验室服务器我一般直接关 Secure Boot省事。如果是共享环境不方便改 BIOS那就走签名流程但那个流程比较绕需要生成密钥、注册 MOK、重启进界面操作这里不展开。注意关 Secure Boot 需要在 BIOS 里操作远程机器要提前确认有没有带外管理或者现场操作条件别把自己关在门外。3. 驱动安装的三种方式与选型逻辑3.1 为什么我不推荐 apt 自动安装Ubuntu 的ubuntu-drivers工具确实方便一条命令就能装驱动。但它的问题是版本不可控它会根据当前源里的版本自动选很可能给你装一个 470 或者 510 的老版本根本不满足 CUDA 12.2 的要求。而且 apt 装的驱动和后续手动装的 CUDA 容易产生文件冲突nvcc和驱动库版本对不上。我试过在 V100s 上用apt install nvidia-driver-535装完确实能用但 CUDA 12.2 的 runfile 安装时会检测到已有驱动提示版本不匹配最后还是要卸载重来。所以数据中心卡我统一走官方 runfile 方式版本完全自己控制。3.2 runfile 安装的完整流程先从 NVIDIA 官方驱动下载页拿到 535.129.03 的 runfile。文件名类似NVIDIA-Linux-x86_64-535.129.03.run。下载完先别急着执行要做几件准备工作。第一安装编译依赖。DKMS 需要内核头文件来编译模块sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r)这一步如果linux-headers-$(uname -r)找不到包说明当前内核的头文件源里没有需要先sudo apt install linux-headers-generic或者换用linux-headers-$(uname -r)对应的具体版本。第二屏蔽 nouveau 开源驱动。V100s 虽然通常不加载 nouveau但保险起见还是屏蔽掉sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u第三卸载可能存在的旧驱动sudo apt purge -y nvidia-* cuda-* sudo apt autoremove -y第四重启进入文本模式。runfile 安装时不能有 X server 占用显卡sudo systemctl set-default multi-user.target sudo reboot重启后登录执行安装sudo sh NVIDIA-Linux-x86_64-535.129.03.run --dkms --silent --no-opengl-files参数说明--dkms让驱动注册到 DKMS内核升级后自动重编译--silent静默安装--no-opengl-files不装 OpenGL 文件因为 V100s 不做图形渲染装了反而可能和系统 GL 库冲突。安装完成后验证nvidia-smi正常应该看到 V100s 的详细信息包括驱动版本 535.129.03、CUDA Version 12.2。如果这里报错看/var/log/nvidia-installer.log九成是内核模块编译失败原因通常是头文件缺失或者 Secure Boot 拦截。3.3 装完驱动后的收尾工作驱动装好后把默认启动目标改回图形界面sudo systemctl set-default graphical.target然后确认nvidia-persistenced服务在跑。V100s 作为计算卡建议开启持久化模式避免每次调用都重新初始化sudo systemctl enable nvidia-persistenced sudo systemctl start nvidia-persistenced持久化模式的好处是减少 GPU 初始化延迟对频繁启停的训练任务有明显帮助。可以用nvidia-smi -pm 1手动开但服务方式更规范。4. CUDA 12.2 安装与 cuDNN 8.9.7 匹配4.1 CUDA 12.2 的安装方式选择CUDA 的安装也有几种方式apt 源、runfile、conda。我推荐 runfile原因和驱动一样版本可控不污染系统包管理。apt 方式装 CUDA 会把驱动也一起装容易和已有的 535 驱动冲突。从 NVIDIA 官网下载 CUDA 12.2 的 runfile文件名类似cuda_12.2.2_535.104.05_linux.run。注意这个 runfile 里自带了 535.104.05 驱动安装时要取消勾选驱动只装 CUDA Toolkit。执行安装sudo sh cuda_12.2.2_535.104.05_linux.run进入交互界面后第一项 Driver 按空格取消勾选只保留 CUDA Toolkit 12.2。其他选项默认即可。安装路径默认是/usr/local/cuda-12.2同时会创建/usr/local/cuda软链接。安装完成后配置环境变量。编辑~/.bashrcexport PATH/usr/local/cuda-12.2/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH export CUDA_HOME/usr/local/cuda-12.2然后source ~/.bashrc验证nvcc -V应该输出 CUDA 12.2 的版本信息。如果nvcc找不到检查 PATH 是否生效或者/usr/local/cuda-12.2/bin下是否有 nvcc 文件。4.2 cuDNN 8.9.7 的正确安装姿势cuDNN 从 8.x 开始改成压缩包分发不再提供 runfile。下载对应 CUDA 12.x 的 cuDNN 8.9.7 压缩包文件名类似cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz。解压后把文件复制到 CUDA 目录tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz cd cudnn-linux-x86_64-8.9.7.29_cuda12-archive sudo cp include/cudnn*.h /usr/local/cuda-12.2/include/ sudo cp lib/libcudnn* /usr/local/cuda-12.2/lib64/ sudo chmod ar /usr/local/cuda-12.2/include/cudnn*.h sudo chmod ar /usr/local/cuda-12.2/lib64/libcudnn*验证 cuDNN 版本cat /usr/local/cuda-12.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2应该看到 8.9.7 的版本号。这里有个常见坑cuDNN 的压缩包分 cuda11 和 cuda12 两个版本下错了会导致 PyTorch 加载时符号找不到。一定要确认文件名里带cuda12。4.3 版本匹配的底层逻辑为什么 CUDA 12.2 要配 cuDNN 8.9.7而不是随便一个 8.9.x因为 cuDNN 的小版本之间虽然 API 兼容但内部实现有差异某些版本对特定 CUDA 小版本有硬依赖。8.9.7 是官方明确标注支持 CUDA 12.2 的版本用其他 8.9.x 可能能跑但遇到诡异报错时排查成本很高。同理PyTorch 的版本也要和 CUDA 12.2 匹配。装 PyTorch 时用官方对应 CUDA 12.1 的包即可12.1 和 12.2 在 PyTorch 层面是兼容的pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121装完验证import torch print(torch.cuda.is_available()) print(torch.version.cuda) print(torch.backends.cudnn.version())三个输出分别是 True、12.2 或 12.1、8907就说明整条链路通了。5. 常见报错与排查速查表5.1 驱动层面的典型问题报错信息根本原因解决方法Unable to load the kernel module nvidia.koSecure Boot 拦截或头文件缺失关 Secure Boot 或装 linux-headersnvidia-smi: command not foundPATH 未配置或驱动未装成功检查 /usr/bin/nvidia-smi 是否存在No devices were found驱动版本不匹配或卡未识别用 lspci 确认硬件重装对应驱动Driver/library version mismatch内核模块和用户态库版本不一致重启或重装驱动Driver/library version mismatch这个报错特别常见通常是因为内核升级后 DKMS 没来得及重编译或者手动装过多个版本驱动。解决办法是sudo dkms status看模块状态然后sudo dkms autoinstall重编译再重启。5.2 CUDA 和 cuDNN 层面的坑nvcc: command not found基本就是环境变量没配好检查~/.bashrc里的 PATH 有没有/usr/local/cuda-12.2/bin。注意不要配成/usr/local/cuda/bin然后软链接指向了别的版本。PyTorch 报undefined symbol: cudnnGetVersion这类错误是 cuDNN 版本和 PyTorch 编译时用的版本不匹配。PyTorch cu121 的包对应 cuDNN 8.9如果你系统里装的是 8.7 或者 9.x就会出这个问题。解决方法是卸载现有 cuDNN重装 8.9.7。还有一个隐蔽的坑LD_LIBRARY_PATH里如果有多个 CUDA 路径加载顺序不对会导致用了旧版本的库。用ldd检查 PyTorch 实际链接的库ldd $(python -c import torch; print(torch._C.__file__)) | grep cudnn输出应该指向/usr/local/cuda-12.2/lib64/libcudnn.so.8。5.3 实操心得与避坑建议第一条心得装驱动前一定先apt update apt upgrade把系统更到最新但升级完要重启再装驱动。我有一次没重启就装结果内核模块编译用的是旧内核头文件装完直接起不来。第二条V100s 没有显示输出装完驱动后如果nvidia-smi正常但程序跑不起来检查是不是被其他进程占用了显存。用nvidia-smi看进程列表或者fuser -v /dev/nvidia*查占用。第三条如果机器有多张 V100s装完驱动后确认所有卡都被识别。nvidia-smi -L会列出所有 GPU少一张就检查 PCIe 插槽和供电。第四条CUDA 装完后不要随便apt upgradeUbuntu 的源里可能有 cuda 相关的包升级时会覆盖手动装的版本。可以sudo apt-mark hold把 nvidia 和 cuda 相关包锁住。6. 环境验证与性能确认6.1 完整链路验证脚本装完所有组件后跑一个完整的验证脚本确认驱动、CUDA、cuDNN、PyTorch 四层都正常import torch import torch.nn as nn # 基础检查 print(CUDA available:, torch.cuda.is_available()) print(CUDA version:, torch.version.cuda) print(cuDNN version:, torch.backends.cudnn.version()) print(GPU count:, torch.cuda.device_count()) print(GPU name:, torch.cuda.get_device_name(0)) # 实际跑一个矩阵乘法 a torch.randn(4096, 4096).cuda() b torch.randn(4096, 4096).cuda() c torch.matmul(a, b) print(Matmul result shape:, c.shape) print(Matmul device:, c.device) # 跑一个卷积确认 cuDNN 工作 conv nn.Conv2d(3, 64, kernel_size3, padding1).cuda() x torch.randn(8, 3, 224, 224).cuda() y conv(x) print(Conv output shape:, y.shape)如果这些都能正常输出说明环境完全可用。矩阵乘法和卷积分别验证了 CUDA 核心和 cuDNN 加速库。6.2 性能基线参考V100s 的 FP32 算力约 16.4 TFLOPSFP16 约 32.8 TFLOPS。跑一个简单的基准测试确认性能没有异常下降import torch import time a torch.randn(8192, 8192).cuda() b torch.randn(8192, 8192).cuda() # 预热 for _ in range(5): torch.matmul(a, b) torch.cuda.synchronize() # 计时 start time.time() for _ in range(50): torch.matmul(a, b) torch.cuda.synchronize() elapsed time.time() - start flops 2 * 8192**3 * 50 / elapsed print(fFP32 TFLOPS: {flops / 1e12:.2f})正常应该在 14 到 16 TFLOPS 之间。如果明显偏低检查是不是跑在 PCIe 降速模式或者 GPU 温度过高触发了降频。用nvidia-smi -q -d PERFORMANCE看当前性能状态。6.3 长期维护建议环境装好后建议做几件事保证长期稳定。第一把驱动和 CUDA 版本记录到文档里包括下载链接和安装命令下次重装直接照抄。第二用nvidia-smi -q定期检查 ECC 错误计数V100s 支持 ECC 显存如果错误计数增长说明显存可能有问题。第三训练任务用CUDA_VISIBLE_DEVICES指定卡避免多卡环境下的资源争抢。我个人在实际维护中的体会是这套环境最怕的不是装的时候出错而是装好后被系统自动更新破坏。所以装完第一件事就是锁版本apt-mark hold把 nvidia-driver、cuda、libcudnn 相关包全部锁住然后关掉 unattended-upgrades 对内核的自动升级。内核一动DKMS 就要重编译重编译失败就是驱动丢失这个循环我见过太多次了。最后分享一个小技巧如果nvidia-smi突然报错但驱动明明没动过先别急着重装试试sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia然后sudo modprobe nvidia很多时候只是模块加载顺序乱了重新加载就好。这个操作比重装驱动快得多也不影响现有环境。
返回列表