ARTICLE DETAIL

资讯详情

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

Ubuntu 22.04深度学习环境配置:Nvidia驱动、CUDA与cuDNN安装实战

Ubuntu 22.04深度学习环境配置:Nvidia驱动、CUDA与cuDNN安装实战 刚装完 Ubuntu 22.04第一件事往往不是折腾桌面美化而是把 Nvidia 驱动、CUDA 和 cuDNN 这套深度学习环境三件套搞定。无论是跑 PyTorch、TensorFlow还是想在 Ubuntu 22.04 下复现 BEVfusion、跑 Carla 0.9.15 这样的自动驾驶仿真驱动和 CUDA 这一层只要没配对后面就是一连串让人摸不着头脑的报错。这篇文章我把从零安装、版本匹配到问题排查的完整经验写出来。系统环境是 Ubuntu 22.04 LTS显卡以常见的 RTX 30/40 系列为例内容覆盖在线和离线两种装驱动的方式、CUDA 多版本共存、cuDNN 的 tar 包安装以及那些非常容易踩的坑——比如 .run 文件报 gzip 解压错误、驱动装完重启黑屏、Secure Boot 拦截、cuda samples 找不到等等。适合刚接触 Linux 的初学者也给已经折腾过一轮但还没完全理顺的朋友一个可以直接照抄的方案。1. 装之前先把驱动、CUDA、cuDNN 的关系理清楚这三样东西经常被混在一起说但它们的定位完全不同理解清楚之后再去装你就知道自己到底在装什么也不会再被网上各种互相矛盾的教程带偏。1.1 三层结构硬件、计算平台、加速库我习惯用三层结构来理解这套东西Nvidia 驱动负责操作系统和 GPU 硬件之间的通信。没有它系统连显示器都驱动不起来更不用说 GPU 计算。CUDA 是一个并行计算平台提供 CUDA 工具包和运行时库深度学习框架PyTorch、TensorFlow需要依靠它来调用 GPU 的并行计算能力。cuDNN 是 Nvidia 专门针对深度神经网络做了优化的加速库跑卷积、池化、循环神经网络这些算子时cuDNN 能比纯 CUDA 实现快不少。打个比方驱动是公路CUDA 是交规和驾照cuDNN 是跑在这条路上的专用赛车。没有公路赛车跑不了没有交规赛车不知道往哪开没有专用赛车普通车也能跑但比赛就吃亏。很多人电脑里其实已经装了驱动但直接跳到 CUDA 和 cuDNN结果发现框架能装上一跑就报 “CUDA driver version is insufficient”问题往往就出在没搞清楚这三层之间的兼容关系。1.2 三种安装方式到底该怎么选驱动和 CUDA 的安装方式在网上主要有三种用 apt 装、用 runfile 装、用 deb 包装。我自己在 Ubuntu 22.04 上折腾过很多次最终稳定使用的组合是驱动优先用 apt 装或者显卡驱动 .run 离线安装CUDA用 runfile 安装方便多版本共存cuDNN用 tar 包手动解压安装下表是我的选型理由供参考组件推荐方式优势不适合的场景驱动apt 或 .run 离线安装稳定apt 能自动匹配内核模块需要精确控制驱动小版本时CUDA Toolkitrunfile可以多版本共存卸载干净需要全自动无人值守时cuDNNtar 包解压不污染系统升级方便习惯 dpkg 管理所有包的人为什么驱动不推荐用 CUDA 自带的 .run 一起装因为 CUDA runfile 默认会尝试装驱动如果你的驱动版本比它自带的版本新容易把系统级驱动搞乱。所以我一直坚持驱动归驱动CUDA 归 CUDA分开装出了问题也容易排查。1.3 先查显卡型号和系统环境再动手装之前先确认两件事显卡型号和系统版本。查看显卡型号lspci | grep -i nvidia查看系统版本lsb_release -a查看是否已经装了驱动nvidia-smi如果 nvidia-smi 能正常输出显卡信息说明驱动已经就绪。如果提示 “NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver”那说明驱动还没装好或者内核模块有问题。另外还要看一下系统架构现在绝大多数机器是 x86_64uname -m这些信息决定你下载的驱动和 CUDA 包是哪一版别一上来就复制别人的命令硬件和系统环境不同很多步骤是有差异的。2. Nvidia 驱动安装在线和离线两条路都走一遍驱动装法的核心争议在于要不要装最新版我的观点很明确——装稳定版别追新。Nvidia 驱动历史版本很多但 Ubuntu 22.04 下真正经历过大量用户验证的版本就那么几个追新版本反而容易踩到一些早期 bug比如某些版本在特定内核上会编译失败。2.1 禁用 nouveau这步漏了后面全是泪Ubuntu 默认带了一个开源的 Nvidia 驱动 nouveau如果不禁用它装 Nvidia 官方驱动时会出现模块冲突表现就是安装到一半直接失败或者装完之后进不了桌面。创建黑名单文件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这时建议重启一次重启后验证 nouveau 是否真的被禁用了lsmod | grep nouveau没有任何输出说明禁用成功。如果还有输出多半是 blacklist 文件没生效检查一下文件内容和权限。2.2 在线安装apt 安装驱动Ubuntu 22.04 的 apt 源里已经有 nvidia-driver 相关包最简单的方式是直接装系统推荐的版本sudo apt update sudo ubuntu-drivers devices这个命令会列出当前机器上推荐的驱动版本一般会显示 “driver: nvidia-driver-550 - third-party - recommended” 这样的信息。安装推荐的版本sudo apt install nvidia-driver-550装完之后重启sudo reboot重启后执行 nvidia-smi看到类似下面这样的输出就说明驱动 OK 了--------------------------------------------------------------------------------------- | NVIDIA-SMI 550.107.02 Driver Version: 550.107.02 CUDA Version: 12.4 | ---------------------------------------------------------------------------------------这里有个关键点nvidia-smi 输出的 CUDA Version 不是当前已经安装的 CUDA 版本而是当前驱动最高支持的 CUDA 版本。比如驱动 550.107.02 支持的最高 CUDA 是 12.4意味着你不能在这个驱动上运行需要 CUDA 13 的框架。2.3 离线安装.run 文件安装很多人的 Ubuntu 机器根本没有外网或者网络很差这时候就需要离线安装驱动。这个方法我在实际中用过很多次特别注意容易踩坑的几个点。先在另一台有网络的机器上从 Nvidia 官方驱动下载页面下载对应显卡型号、对应系统版本的驱动 .run 文件用 U 盘拷贝到目标机器。驱动下载页面会根据显卡型号自动筛选合适版本但要注意选择 Linux 64-bit 版本。拷贝到 Ubuntu 机器后进入纯命令行终端。这一步很关键很多人装 .run 驱动时直接开着一个图形终端然后安装失败原因就是图形界面还在占用 GPU。按 Ctrl Alt F3 进入 tty 终端登录后用 root 权限执行sudo systemctl stop gdm3如果你用的是 lightdm就执行sudo systemctl stop lightdm停止显示管理器后建议先卸载旧的驱动如果有sudo apt remove --purge nvidia-*然后给驱动文件加执行权限chmod x NVIDIA-Linux-x86_64-550.107.02.run sudo ./NVIDIA-Linux-x86_64-550.107.02.run安装过程中会出现几个交互式问题“Install NVIDIAs 32-bit compatibility libraries?” 选 No除非你确需运行 32 位程序。“Would you like to register the kernel module sources with DKMS?” 选 Yes这样内核更新后驱动模块可以自动重新编译。“Install NVIDIAs OpenGL files?” 选 Yes。“Run nvidia-xconfig?” 选 No等重启后再用 nvidia-smi 验证。装完后重启sudo reboot2.4 离线安装重启后黑屏是怎么回事这个绝对是离线安装驱动最典型的问题也是网上咨询量最大的坑之一。现象是驱动装完重启屏幕直接黑掉或者卡在某个地方进不了桌面。我排查过很多次大部分原因就两类nouveau 没有禁用成功导致驱动模块加载冲突。没有安装 DKMS 或者内核头文件缺失导致 Nvidia 内核模块没有编译成功。针对内核头文件的问题安装前先确保系统有对应的内核头文件sudo apt install linux-headers-$(uname -r)如果已经黑屏进不去了重启后按住 Shift 进入 GRUB 菜单选 “Advanced options for Ubuntu”进 recovery mode然后选择 “root shell”在里面执行sudo prime-select on-demand sudo apt install --reinstall nvidia-driver-550或者直接禁用掉 nouveau 后再装一次。如果黑屏问题还解决不了就回到 tty 里把驱动卸载掉先让系统恢复正常sudo nvidia-uninstall sudo apt remove --purge nvidia-* sudo reboot这虽然不优雅但能保证系统先恢复正常再慢慢排查。3. CUDA 安装runfile 方式与多版本共存驱动搞定之后CUDA 的安装就顺理成章了。但这里有个重要的认知CUDA 并不是只能装一个它是可以多版本共存的这才是 runfile 安装最大的优势。3.1 确定你需要哪个 CUDA 版本别盲目装最新的很多初学者上来就装最新的 CUDA 13.x结果发现 PyTorch 还不支持又去折腾降版本非常浪费时间。确定 CUDA 版本的正确顺序是先看深度学习框架支持什么 CUDA。比如 PyTorch 官方安装命令会写清楚支持 CUDA 11.8、12.1、12.4 等版本。再看驱动支持的最高 CUDA 版本在 nvidia-smi 输出顶部的 “CUDA Version” 里能看到。取两者的交集。以我的经验Ubuntu 22.04 下做深度学习目前最稳妥的是 CUDA 11.8 或者 CUDA 12.1。如果你跑的是 Carla 0.9.15 这类仿真环境尤其是基于 UE4 的老一点的 CUDA 版本往往兼容性更好。查看当前驱动支持的最大 CUDA 版本nvidia-smi驱动装的 550.107.02支持 CUDA 12.4那我装 CUDA 12.1 就完全没压力。3.2 下载 CUDA runfile 安装Nvidia 官方 CUDA Toolkit 下载页面里选择 Linux → x86_64 → Ubuntu → 22.04 → runfile(local)会得到类似下面的下载命令wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run我还是要强调一下下载完了最好先校验一下文件完整性。热门词里有个很典型的报错cuda .run gzip: stdin: invalid compressed>md5sum cuda_12.1.0_530.30.02_linux.run计算出来的值去和官方提供的 MD5 hash 比对不一致就重新下载。3.3 runfile 安装的交互式选项怎么选执行安装sudo sh cuda_12.1.0_530.30.02_linux.run第一次执行时你会看到一个带复选框的协议界面一直按空格键往下翻然后输入 accept 接受协议。这时候会弹出组件选择界面关键来了我们必须取消勾选 Driver因为驱动已经装好了。只保留 CUDA Toolkit 和 CUDA Symbols其他的比如 CUDA Demo Suite、CUDA Documentation 可选但 Demo Suite 里有 samples建议勾上。如果你直接一路回车它默认会把 Driver 也装上这个新装的驱动版本可能和你现有版本冲突导致 nvidia-smi 失灵。安装完成后CUDA 会被装到 /usr/local/cuda-12.1 目录。但系统还不会自动找到它需要配置环境变量。编辑 ~/.bashrcecho export PATH/usr/local/cuda-12.1/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc验证nvcc -V输出类似nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NVIDIA Corporation Built on ... Cuda compilation tools, release 12.1, V12.1.1053.4 多版本 CUDA 共存与切换我之前说过 runfile 最大的优势就是多版本共存。实际操作方法也很简单每次安装不同版本的 CUDA指定不同的安装目录。比如再装一个 CUDA 11.8它默认会装到 /usr/local/cuda-11.8。切换版本只需要改环境变量里的路径让 /usr/local/cuda 软链接指向对应版本目录。创建软链接的方式sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda然后把 ~/.bashrc 里的环境变量改用 /usr/local/cuda 这个通用路径而不是具体版本路径。这样以后切换版本只需要改软链接echo export PATH/usr/local/cuda/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc比如跑某个项目需要 CUDA 11.8而另一个项目需要 12.1我就不用重装系统只需要切一下软链接然后重新 source 一下 bashrc再在新终端里跑 nvcc -V 确认版本即可。3.5 cuda samples 找不到和单独编译CUDA runfile 安装后samples 默认会在用户主目录下生成一个 NVIDIA_CUDA-12.1_Samples 目录。如果安装时没有勾选 Demo Suite或者安装完找不到 samples可以用 CUDA 自带的脚本生成/usr/local/cuda-12.1/bin/cuda-install-samples-12.1.sh ~然后进入对应的 samples 目录编译cd ~/NVIDIA_CUDA-12.1_Samples make -j$(nproc)编译时间比较长建议只编译特定项目的命令更实用。比如单独编译 deviceQuerycd 1_Utilities/deviceQuery make ./deviceQuery看到 Result PASS 说明 CUDA 环境正常。这个命令是验证 CUDA 是否可用的金标准比任何第三方脚本都靠谱。4. cuDNN 安装tar 包解压方式一步到位cuDNN 的安装比 CUDA 简单得多本质上就是拷贝库文件到 CUDA 的目录里没有那么多玄学。4.1 下载 cuDNN 要注意版本匹配去 Nvidia cuDNN 官网下载需要先注册/登录 Nvidia 账号。下载时选择一个关键点必须和你的 CUDA 版本匹配。比如你装了 CUDA 12.1就应该下载 “cuDNN for CUDA 12.x” 的版本系统选择 Ubuntu22.04。推荐选择 Local Installer for Linux x86_64 (Tar)也就是 tar 包方式不要用 deb 包。tar 包的好处是安装和卸载都干净只是解压拷贝不会向系统注册一堆东西。4.2 解压和拷贝相关文件假设下载的文件是 cudnn-linux-x86_64-9.x.x.x_cuda12-archive.tar.xztar -xvf cudnn-linux-x86_64-9.x.x.x_cuda12-archive.tar.xz cd cudnn-linux-x86_64-9.x.x.x_cuda12-archive然后把头文件、库文件分别拷贝到 CUDA 对应目录sudo cp -P include/cudnn*.h /usr/local/cuda/include/ sudo cp -P lib/libcudnn* /usr/local/cuda/lib64/ sudo chmod ar /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*-P 参数很关键它保留符号链接。cuDNN 的库文件有很多软链接链式关系如果不用 -P直接 cp 会丢失软链接结构后面程序链接时就会出问题。更新动态链接库缓存sudo ldconfig4.3 验证 cuDNN 是否安装成功先看版本号cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2或者看单个版本号grep CUDNN_MAJOR -r /usr/local/cuda/include/cudnn_version.h常见的输出格式类似#define CUDNN_MAJOR 9 #define CUDNN_MINOR 1 #define CUDNN_PATCHLEVEL 0看到能输出版本宏说明头文件已经就位。再看库文件是否被系统正确加载ldconfig -p | grep cudnn如果有 libcudnn.so、libcudnn_ops.so 等相关输出说明动态链接库已经注册成功。更严谨的验证方法是编译 cudnn 自带的 sample。在 cuDNN 解压目录里一般会带一个 samples 子目录里面有 MNIST 示例。进入该目录执行 make 编译然后跑测试程序输出 “Test passed” 基本就稳了。4.4 conda 和系统 CUDA 的关系经常有人会问我用 conda 装了 cudatoolkit是不是就不用装系统 CUDA 了这个问题很有意思也是很多初学者绕不过去的弯。答案分两种情况如果只是用 PyTorch 或 TensorFlow它们其实自带或可以指定 CUDA 运行时这时 conda 里的 cudatoolkit 足够系统不装 CUDA Toolkit 也完全能跑。但如果要编译 CUDA 扩展比如一些第三方算子或者需要用 nvcc 编译 C/C 代码那系统级 CUDA Toolkit 就必须有。所以我的经验是系统级 CUDA 无论如何都装一份用 conda 里虚拟环境跑框架时就让它用自己的 cudatoolkit两者不冲突。真正跑项目时PyTorch 调用的是它自己链接的那个 CUDA runtime而不是系统环境里的这点要心中有数。5. 常见问题与排查技巧实录最后把这一两年里被问得最多的几个问题整理成速查表基本都是我实际踩过坑之后总结出来的处理办法。问题现象根本原因解决办法cuda_*.run 报 gzip: stdin: invalid compressed>sudo /usr/local/cuda-12.1/bin/cuda-uninstaller或者手动删除目录sudo rm -rf /usr/local/cuda-12.1 sudo rm -rf /usr/local/cuda卸载驱动sudo nvidia-uninstall想要彻底清掉 apt 装的驱动残留sudo apt remove --purge nvidia-* sudo apt autoremove然后记得把 ~/.bashrc 里的 PATH 和 LD_LIBRARY_PATH 里关于 cuda 的配置清掉重新登录 shell 就行了。写在最后整套流程走下来耗时其实不长真正花时间的是排查各种“看似无解”的报错。我自己在 Ubuntu 22.04 上第一次装 CUDA 时就因为 .run 下载不完整反复失败后来养成了一律先校验 md5sum 的习惯从此这类问题基本断绝。另外一个小建议装完这套环境后不要急着跑大项目先跑一下 deviceQuery 和 cudnn 的官方示例确认底子是好的。如果这一步都通过再回过头去装 PyTorch、Carla、BEVfusion 这些上层应用心里会踏实很多。环境这块稳定压倒一切折腾完了就安心做技术研究别再频繁换版本了。
返回列表