news 2026/9/29 5:10:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 couldn't communicate with the NVIDIA driver”,那说明驱动还没装好,或者内核模块有问题。

另外还要看一下系统架构,现在绝大多数机器是 x86_64:

uname -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 modeset=0' >> /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 NVIDIA's 32-bit compatibility libraries?” 选 No,除非你确需运行 32 位程序。
  • “Would you like to register the kernel module sources with DKMS?” 选 Yes,这样内核更新后驱动模块可以自动重新编译。
  • “Install NVIDIA's OpenGL files?” 选 Yes。
  • “Run nvidia-xconfig?” 选 No,等重启后再用 nvidia-smi 验证。

装完后重启:

sudo reboot

2.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 版本的正确顺序是:

  1. 先看深度学习框架支持什么 CUDA。比如 PyTorch 官方安装命令会写清楚支持 CUDA 11.8、12.1、12.4 等版本。
  2. 再看驱动支持的最高 CUDA 版本,在 nvidia-smi 输出顶部的 “CUDA Version” 里能看到。
  3. 取两者的交集。

以我的经验,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 目录。但系统还不会自动找到它,需要配置环境变量。

编辑 ~/.bashrc:

echo '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.105

3.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)

编译时间比较长,建议只编译特定项目的命令更实用。比如单独编译 deviceQuery:

cd 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.xz:

tar -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 a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

-P 参数很关键,它保留符号链接。cuDNN 的库文件有很多软链接链式关系,如果不用 -P,直接 cp 会丢失软链接结构,后面程序链接时就会出问题。

更新动态链接库缓存:

sudo ldconfig

4.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 这些上层应用,心里会踏实很多。环境这块稳定压倒一切,折腾完了就安心做技术研究,别再频繁换版本了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 5:10:03

C语言短路求值:安全编程的底层控制流机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 5:10:02

Excel单行转独立文件:VBA批量导出xlsx实战方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 5:09:54

STM32 FreeRTOS实战:CAN通信、Flash存储与PI控制封装总结

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 5:08:23

Django线上教育平台大数据分析:从系统开发到业务洞察的毕设实战指南

每年到这个时候,总有一批人被“毕设题目”折磨得寝食难安,尤其是计算机类的同学。你打开导师给的选题列表,一眼扫过去,“基于XX框架的XX管理系统”占了大半,看多了脑子都是木的。但今天想聊的这个题目不太一样——基于…

作者头像 李华
网站建设 2026/9/29 5:08:15

Paperclip协议:轻量级AI Agent互操作标准解析

1. “Paperclip”不是回形针:它正在悄悄改写AI Agent的开发范式最近在几个技术社区里频繁刷到“paperclip”这个词,尤其和Node.js、React、OpenClaw这些词绑在一起出现。刚看到时我也愣了一下——这不就是办公室抽屉里那个银色小金属片?怎么突…

作者头像 李华
网站建设 2026/9/29 5:08:05

Jev 实战:10 分钟让 Coding Agent 学会自主决策

1. 为什么 Coding Agent 需要“自己拿主意”的能力1.1 从“工具调用”到“自主决策”的认知转变用 Claude Code 和 Codex 写代码的人,大概都经历过这样一个阶段:一开始觉得它们很神奇,能自动补全、能解释代码、能生成函数。但用久了就会发现一…

作者头像 李华

关于博客

这是一个专注于编程技术分享的极简博客,旨在为开发者提供高质量的技术文章和教程。

订阅更新

输入您的邮箱,获取最新文章更新。

© 2025 极简编程博客. 保留所有权利.