ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04 + RTX 4090 深度学习环境配置:驱动、CUDA 11.6 与 cuDNN 实战

Ubuntu 20.04 + RTX 4090 深度学习环境配置:驱动、CUDA 11.6 与 cuDNN 实战 几周前我把一台旧机器翻出来装 RTX 4090打算拿 Ubuntu 20.04 当主力深度学习平台结果光装 Nvidia 显卡驱动就重装了一次系统。折腾完之后我把整个流程重新捋了一遍发现这套“Ubuntu 20.04 RTX 4090 CUDA 11.6.0 cuDNN 8.5”组合的坑其实非常固定大多数问题都集中在驱动安装方式和 CUDA 版本认知上。这篇文章就是给自己留个档也希望能帮到同行的朋友。如果你手里也攥着 RTX 4090准备在 Ubuntu 20.04 上跑深度学习但还没下定决心的话可以先看完这篇再动手。整篇不会只给你一堆命令重点会放在“为什么这么做”和“出了问题怎么排查”上毕竟环境配置这件事一次性成功的概率真的不高后面调试才是常态。1. 装之前先把账算明白1.1 为什么是 Ubuntu 20.04 RTX 4090先说结论Ubuntu 20.04 RTX 4090 是目前投入产出比比较高的深度学习开发组合但并不是开箱即用。有人会问为什么不用 Ubuntu 22.04这个问题的答案其实跟内核和编译器有关。RTX 4090 属于 NVIDIA Ada Lovelace 架构一些较新的驱动特性在 Ubuntu 22.04 上确实能被更快支持但 20.04 的稳定性和生态兼容性在深度学习圈子里依然是主流。老一点的代码、模块、CUDA 版本依赖在 20.04 上踩坑概率明显更低。很多课题组和生产环境至今还在用 20.04就是因为它“稳”。如果你不是非要用最新的 Linux 内核特性20.04 完全够用。但 20.04 有一个尴尬点系统自带的 gcc 是 9.x而 CUDA 11.6.0 对这个版本支持得很平滑。如果你装了 22.04 自带的 gcc 11.x编译 CUDA 或 PyTorch 源码时反而容易报错。这是一件很反直觉的事看起来越新的系统深度学习环境配置难度反而会升高。再说 RTX 4090。它用的是 Ada 架构计算能力代号是 sm_89。这意味着旧版 CUDA 工具链不一定认识它。很多人在这一步会踩到“驱动装了但 CUDA 不可用”的坑并不是因为硬件坏了而是驱动版本和 CUDA 工具包没有对齐。RTX 4090 需要的驱动至少是 515.43 之后打上的 Ada 支持不要拿 470 之类的老驱动去试那样 nvidia-smi 可能能识别显卡型号但很多 CUDA 计算任务会直接失败。1.2 硬件、UEFI 与系统盘准备在动手之前先看一眼机器状态。RTX 4090 功耗不低电源建议 850W 以上整机散热别太拉跨。主板方面不强制要求特定的品牌但建议把 BIOS 里的Secure Boot 关掉。这一步新人容易漏掉不关的话Nvidia 驱动签名加载会有很大概率失败装完驱动重启就黑屏或者循环登录。再准备一个干净的 Ubuntu 20.04.6 LTS 镜像用 Rufus 或 Ventoy 做启动盘。系统盘建议至少留 100GB如果你还要装 CUDA、cuDNN、PyTorch 以及各种数据集200GB 会更从容。训练数据多的人最好单独挂一块数据盘系统盘只放环境和代码不然哪天跑个数据集把 inode 占满你连 apt 都运行不了。系统装完以后第一时间更新软件源和固件sudo apt update sudo apt upgrade -y别急着装驱动先把基础编译工具链打好sudo apt install build-essential dkms linux-headers-$(uname -r) -ydkms这一个小东西我单独说一下。如果你以后升级内核Nvidia 驱动模块需要重新编译dkms 能自动处理这步避免升级完内核显卡驱动失效。没有 dkms 的话每次内核更新你都要手动重装驱动次数多了很容易心态爆炸。2. Nvidia 显卡驱动装出问题的概率远比你想象中高2.1 三种安装方式怎么选Ubuntu 下装 Nvidia 驱动主流有三条路命令行直接sudo apt install nvidia-driver-版本号从 Nvidia 官网下载.run安装包手动安装用ubuntu-drivers工具自动推荐安装我实测下来最省心的方式是第三种先跑一次ubuntu-drivers devices它会列出你的显卡推荐安装的驱动版本一般会显示一个带recommended的驱动比如nvidia-driver-525或nvidia-driver-535。直接执行sudo apt install nvidia-driver-525这条路的好处是驱动已经适配过当前系统内核而且在 DKMS 的配合下内核更新之后不会掉驱动。如果你非要手动下载官方驱动装也可以但要在安装参数里加--no-opengl-files否则很容易把桌面搞挂。RTX 4090 的话我建议装 515 以上版本525 或 530 都行。但不是越新越好。驱动太新个别老版本 CUDA 反而可能报警提示驱动与 CUDA 版本不兼容驱动太老又不认识 RTX 4090。如果让我选我会优先 525 系列搭配 CUDA 11.6 时实测很稳定。2.2 卸载旧驱动与禁用 nouveau这一步是灵魂所在。Ubuntu 默认显卡驱动是开源的nouveau。它的性能很差而且会跟 Nvidia 闭源驱动抢设备。如果你在装 Nvidia 驱动之前不把 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然后更新 initramfssudo update-initramfs -u如果你之前已经装过 Nvidia 驱动最好先卸载干净sudo apt purge nvidia-* libnvidia-* -y sudo apt autoremove -y之后再装新驱动出错的概率会小很多。我见过太多人直接覆盖安装老驱动最后系统里残留了一堆不同版本的 Nvidia 库文件nvidia-smi 显示出的驱动版本和实际加载的模块不一致那种状态是最难排的。注意禁用 nouveau 之后如果重启发现分辨率变低或者桌面进不去这是正常现象因为你还没装 Nvidia 驱动。此时可以直接到 tty 命令行CtrlAltF3登录把驱动装上再重启。2.3 黑屏、循环登录的现场处理驱动装完重启卡黑屏或循环登录几乎每个人都遇过。这里给一个经验判断如果每次启动都在登录界面转圈后又回到登录界面先别急着重装系统大概率是驱动模块加载失败。落地方案是在登录界面按 CtrlAltF3 进入命令行先看看/var/log/Xorg.0.log重点找EE开头的错误行。如果显示类似 “failed to load module nvidia”说明系统没有正确加载新驱动。常见的处理手段sudo dkms status查看驱动模块有没有成功编译。如果模块状态是 fail先检查内核头文件是否装了sudo apt install linux-headers-$(uname -r)然后重新构建sudo dkms autoinstall再把 nvidia 模块主动加载进内核sudo modprobe nvidia如果仍然不行就启用系统自带的 “recovery mode”进去之后把驱动彻底 purge 再重装。黑屏问题最忌的就是“反复装同一个驱动不做任何清理”换个思路试试 clean install 反而更快。3. CUDA 11.6.0版本、驱动协议与安装3.1 为什么 CUDA 是“运行时”而不是普通APP很多人对 CUDA 有一个误解以为nvidia-smi里右上角显示 CUDA 11.6 就说明 CUDA 装好了。这句话需要拆成两半看。nvidia-smi输出的 CUDA 版本其实只是当前驱动“支持的最高 CUDA 运行版本”不代表系统里真的装了对应版本的 CUDA Toolkit。驱动是硬件和 CUDA 运行库之间的翻译官而 CUDA Toolkit 是开发、编译、运行 CUDA 程序时用的一整套工具。两者要分开装也要配合好。CUDA 版本的选型核心参考是驱动的最低版本要求。对于 CUDA 11.6.0官方要求驱动不低于 510.39.06但 RTX 4090 你至少得用 515.43 以上的驱动才被支持。所以“驱动 515.65 CUDA 11.6.0”这套搭配是成立的并且经过了大量老哥验证。如果你驱动装的是 525同样兼容 CUDA 11.6简单说就是驱动可以向下兼容旧版本 CUDA 工具包。但这里必须打个预防针NVIDIA 官方在 CUDA 11.6 发布时还没有正式为 Ada Lovelacesm_89做编译器优化。拿 11.6 编译器直接编译包含 sm_89 架构的代码部分插件会不认。实际操作中PyTorch 和 TensorFlow 的预编译版本有没有对应支持才是最关键的。比如 PyTorch 官方在 cu116 轮子里并没有单独给 RTX 40 系列做适配但很多人在 4090 CUDA 11.6 下跑 PyTorch 也能正常用只是有些场景性能不是最优状态。如果你非要完全稳妥后续可以考虑升级到 CUDA 11.8 或 12.x但如果你因为项目原因必须锁定 11.6相信我够用。3.2 runfile 安装与路径配置CUDA 11.6.0 的下载文件是cuda_11.6.0_510.39.06_linux.run。我推荐用 runfile 安装而不是 deb 包原因有两点一是 runfile 不依赖 apt 源可控性更强二是 deb 包会在不知不觉中又关联一堆包跟 apt 管理的既有版本产生冲突。下载完后先给执行权限chmod x cuda_11.6.0_510.39.06_linux.run然后执行sudo sh cuda_11.6.0_510.39.06_linux.run注意安装过程会先显示一个协议文本按 q 跳过。接着进入组件选择界面此时不要选安装驱动因为驱动我们已经用 apt 装好了再装容易冲突。只需要保留 CUDA Toolkit 和 Samples 即可。安装完成之后它默认安装在/usr/local/cuda-11.6并且会建立一个/usr/local/cuda软链接指向它。接下来就是把路径写进环境变量。这一步不写你敲nvcc绝对会提示 command not found。经典的写法是export PATH/usr/local/cuda-11.6/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH为了让重启之后依然生效最好追加到~/.bashrcecho export PATH/usr/local/cuda-11.6/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc3.3 nvcc 验证与常见假象装完 CUDA 之后验证命令是nvcc -V如果看到类似Cuda compilation tools, release 11.6, V11.6.124的输出说明工具链路径配好了。另一个验证方式ls /usr/local/cuda/bin/nvcc同时确认一下软链接ls -l /usr/local/cuda如果安装过程中软链接没有建立这种情况偶尔发生手动补一条sudo ln -s /usr/local/cuda-11.6 /usr/local/cuda这里我特别强调一下nvcc -V显示的是 CUDA 编译器版本nvidia-smi显示的是驱动支持的 CUDA 版本两者可以不一致。只要编译器路径正确、运行时能找到对应的libcudart.so.11.*程序就能正常编译和运行。很多人在验证时只跑nvidia-smi根本没验证编译工具链最后编译一个带 CUDA 的 C 文件才发现 nvcc 不存在白白浪费半天时间。4. cuDNN 8.5最容易被忽略的配置4.1 tar 包与 deb 包的区别cuDNN 的全称是 CUDA Deep Neural Network library它是深度学习框架底层加速的关键没有它PyTorch 和 TensorFlow 跑起来会慢得多甚至有些算子直接不可用。cuDNN 的下载页面需要登录 NVIDIA 账号下载时注意选择“cuDNN v8.5.0 for CUDA 11.x”这个版本因为拿到 v12 的包放到 CUDA 11.6 下会直接报 GLIBC 或符号错误。下载文件有两种格式.deb安装包Debian 系原生格式.tar.xz压缩包社区里更常用如果你用 deb 包安装apt 会帮你去重和安装依赖但正因为太省事多个 CUDA 版本共存时容易把 cuDNN 装进错误的位置。tar 包的好处是文件拷贝到哪、软链接怎么建你自己完全掌控。对于做深度学习训练的人来说我推荐 tar 包思路更清楚。4.2 文件复制、软链接与权限下载得到类似cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz的文件。解压后你会发现里面有include和lib两个目录。先解压tar -xf cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz然后进入目录把头文件复制进 CUDA 的 include 目录cd cudnn-linux-x86_64-8.5.0.96_cuda11-archive sudo cp include/cudnn*.h /usr/local/cuda/include/再复制动态库sudo cp lib/libcudnn* /usr/local/cuda/lib64/加执行权限sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*之后要配置动态库搜索路径。新建一个文件sudo bash -c echo /usr/local/cuda/lib64 /etc/ld.so.conf.d/cuda.conf执行sudo ldconfig为什么这步容易漏如果你只是复制文件但没有ldconfig系统运行时会找不到libcudnn.so.8典型的报错是ImportError: libcudnn.so.8: cannot open shared object file遇到这个错误的人十有八九就是没刷新动态链接库缓存。4.3 如何确认 cuDNN 真正生效验证 cuDNN 版本最直接的是查看版本头文件cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2看到主版本是 8副版本是 5说明安装正确。如果你想更严格一点可以用官方 sample 里的mnistCUDNN编译测试。先进入 CUDA Samples 目录cd /usr/local/cuda/samples/4_CUDA_Libraries/cudnnSample在 Makefile 里如果找不到库直接用 nvcc 编译nvcc -o mnistCUDNN mnistCUDNN.cpp -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudnn -lopenblas这个测试程序会实际跑一遍卷积、池化、全连接等操作通过网络下载 MNIST 数据集如果没配代理这步也可能受网络影响。跑通之后输出里会显示Test passed!这说明 cuDNN 已经能在运行时正确加载并能被 CUDA 调用。5. 深度学习框架适配不是装完驱动就算完5.1 PyTorch 与 CUDA 11.6 的搭配驱动、CUDA、cuDNN 都装好只能说你有了一个“可以跑 CUDA 程序的系统”。真正的深度学习环境还要装框架。PyTorch 这边如果你要使用 CUDA 11.6 对应的预编译版本用官方给出的命令pip install torch1.13.1cu116 torchvision0.14.1cu116 torchaudio0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116或者简单粗暴一点指定 cu116 源pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu116安装完成后验证 GPU 是否可用python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果你看到True和NVIDIA GeForce RTX 4090说明 PyTorch 成功识别了显卡。不过这里我多说一句RTX 4090 的 sm_89 架构在部分旧版本 PyTorch 轮子里没有针对性优化运行时有时会打出 warning。如果你遇到性能异常或者干脆torch.cuda.is_available()返回 False别怀疑显卡先确认是不是 PyTorch 版本太旧。此时最简单的解法是把torch换成对方针对 cu117 或 cu118 构建的版本即便你的 CUDA 是 11.6只要驱动版本发发慈悲向下兼容也是常有的事。5.2 TensorFlow 在 Ada 架构上的策略TensorFlow 的情况比 PyTorch 更微妙。从 TensorFlow 2.11 开始官方 Linux 版实际上已经绑定了自己的 CUDA 和 cuDNN 运行时不再依赖系统里单独安装的 CUDA。所以如果你只用 TensorFlow理论上系统 CUDA 装不装都影响不大。但 TensorFlow 官方预编译版本对 Ada 架构的适配也要看版本。TensorFlow 2.10 及以下版本GPU 支持主要覆盖到 Ampere sm_80/sm_86在 RTX 4090 上跑会出现一个Could not identify NUMA node之类的警告严重的直接报 “no kernel image is available for execution on the device”。网上最常见的建议是装 TensorFlow 2.12 以上配合 NVIDIA 官方 NGC 容器或者tensorflow的 pip 包使用。如果你倾向于自己编译 TensorFlow那就是另一个深坑了Bazel 版本、CUDA 版本、cuDNN 版本全部要匹配。我建议普通用户别铤而走险直接进容器docker pull tensorflow/tensorflow:2.13.0-gpu容器化之后宿主机只要有 Nvidia 驱动和 nvidia-container-toolkit 就行CUDA/cuDNN 都在镜像里省心不少。6. 常见问题排查实录这套环境配置过程中我整理了下面几个高频问题全部亲手踩过或帮同事排查过现象原因解法安装驱动后黑屏没禁用 nouveau 或驱动没加载CtrlAltF3 进终端sudo modprobe nvidia重新配置驱动登录界面死循环dkms 编译失败或驱动残留dkms status删掉旧的 nvidia 包重新安装nvidia-smi 显示 “NVIDIA-SMI has failed”驱动模块与用户态工具版本不匹配彻底清理驱动重启后重新安装编译报gcc: error: unrecognized command-line optiongcc 版本过高安装 gcc-9 并设置export CCgcc-9torch.cuda.is_available()返回 FalsePyTorch 版本不支持 Ada 架构安装 cu117/cu118 构建的 PyTorch运行时报libcudnn.so.8: cannot open shared object file没刷新动态库缓存检查/etc/ld.so.conf.d/cuda.conf并执行sudo ldconfig驱动装完nvidia-smi 显示显存为 0内核模块加载异常查看 dmesg有一个经常被忽略的“排查神器”是nvidia-bug-report.sh。跑到出问题的机器上执行sudo nvidia-bug-report.sh它会一次性收集 dmesg、Xorg 日志、驱动模块信息、库文件依赖等很多问题看这个压缩包比反复重启省时间尤其是远程排查别人的机器时先让他把报告传过来再说。7. 性能验证与稳定性调优心得7.1 跑一个像样的 Benchmark环境配置是否真的合格不能只看版本号我建议跑一个真实负载。OpenCV 的图像缩放、mini-batch 推理、模型训练都能暴露问题。最简单的方式是用 PyTorch 自带的一个小卷积网络跑一遍 MNIST 或者 CIFAR-10。我实际用一张 4090 跑了一段 ResNet-18 的 CIFAR-10 训练batch size 256精度 FP32在 CUDA 11.6 cuDNN 8.5 下每 epoch 大概 3~4 秒GPU 利用率能稳定在 90% 以上。如果你的机器跑类似任务时 GPU 利用率一直在 30% 附近徘徊先别急着怀疑驱动看看是不是数据集读取的 CPU 线程不够把num_workers调大一点通常能立竿见影。7.2 日常使用中的几个习惯建议第一个建议是开启持久化模式可以减少频繁的 GPU 工作状态切换带来的延迟sudo nvidia-persistenced --persistence-mode第二个建议是用nvidia-smi dmon和nvidia-smi pmon实时看设备的利用率和进程状态watch -n 1 nvidia-smi第三个建议是别滥用/usr/local/cuda这个软链接。如果你以后要装 CUDA 11.8 或者 12.x我建议保留多个版本目录用软链接统一切换而不是一股脑删掉旧版本。很多项目的 C 扩展是在编译期就把 CUDA 路径写死的你今天把 11.6 删了明天别人代码编译就崩了。环境这种东西多留几条后路多留几个能用的入口永远比追求“纯净”更实用。7.3 是否值得升级到 CUDA 11.8 或 12.xRTX 4090 在今天的深度学习环境里配合 CUDA 11.8、12.1 都有不错的表现。如果你还在犹豫要不要继续用 11.6我给一个判断标准如果你的项目依赖 GPU 算子不多比如只是跑跑 PyTorch、TensorFlow 的预训练模型推理那 11.6 完全没问题但如果你要自己写 CUDA 扩展、用到比较新的 cuDNN 特性或者编译带 sm_89 优化算子的源码建议尽早迁到 11.8 或 12.x。同时要确认一件事驱动版本要能向下兼容旧 CUDA你装的新驱动不会限制你只能用新版 CUDA。所以就算你决定迁到新版也没必要把 11.6 的库删干净软链接切来切去就够了。最后再说点实在的这套环境我从无到有搭下来的时间大概花了一个周末。前两次重启都黑屏后来发现是 nouveau 没禁干净第三次干脆把所有 Nvidia 相关包 purge 干净再从 apt 用 dkms 装驱动才真正稳定下来。中间也试过从官网直接跑 .run 驱动但因为桌面环境 OpenGL 冲突又黑过一次所以我现在更偏向 apt dkms 这条路线虽然不是最“新潮”但在 Ubuntu 20.04 上最不容易出幺蛾子。如果让我重新再配一次我会把更多的验证时间放在“复现”上而不是只看版本号。版本号对不上不是最关键的问题跑不起来才是。现在的做法是驱动稳定后先拿 PyTorch 跑一个几分钟的训练脚本确认 loss 真的在下降再进 CUDA 和 cuDNN 的细节验证。每一步都验证到再往后走效率最高。如果你也在折腾同一套组合不要慌大概率问题都出在驱动层级的匹配上。按这个顺序走下来半天之内应该能进到训练环节。等你在nvidia-smi里看到 GPU-Util 一栏跳动起来的时候前面所有折腾都是值的。
返回列表