行业资讯
📅 2026/9/7 4:40:54
Ubuntu深度学习环境搭建:NVIDIA驱动到TensorRT全流程指南
新到一台双系统工作站折腾到半夜总算把 Ubuntu 22.04 上的 NVIDIA Driver、CUDA Toolkit、cuDNN、PyTorch、TensorRT 这条生产链全部跑通。事后回头看最耗时间的不是安装本身而是搞清它们之间的版本对应关系。很多人一上来就去官网复制 PyTorch 安装命令结果torch.cuda.is_available()一直返回 False或者程序跑着跑着报一个no kernel image is available的错误一脸懵。这篇文章把我这次完整的 Ubuntu 深度学习环境搭建过程记录下来覆盖从显卡驱动开始一直到 TensorRT 推理加速的完整链路。适合两类人看第一次配环境的新手以及配了几次还是被版本问题搞晕的老手。我会把每一步的操作命令、选型思路、踩坑点都摊开讲清楚你照着做基本不会翻车。1. 动手之前先想清楚版本对应关系1.1 版本矩阵整条链路的真正核心在 Ubuntu 上配深度学习环境最难的不是敲命令而是搞明白这一堆软件到底谁依赖谁。我先把它们之间的逻辑关系理一下系统底层是显卡驱动 (NVIDIA Driver)驱动决定了硬件能被怎么调用它不但管显示输出也管 CUDA 运行时往上一层是CUDA Toolkit它是一个编译运行时环境提供了nvcc编译器和一堆 CUDA 库cuDNN是基于 CUDA 的神经网络加速库主要给深度学习框架用再往上是PyTorch它自带一份 CUDA runtime所以只要驱动的版本足够新PyTorch 就能通过它调用 GPU最上层是TensorRT它是 NVIDIA 的推理优化引擎通常在做上线部署、追求极致推理性能时才需要引入。这五者之间不是各自独立的而是有一张严格的版本对应表。比如驱动版本决定了它最多支持到哪个 CUDA 版本如果驱动的版本太老而你装的 PyTorch 是 cu124 的 wheel那么运行时就可能报错。同理TensorRT 10.x 只支持特定范围的 CUDA 版本用错了就只能重装。所以我的建议永远是先定版本矩阵再下载安装不要装了发现不行再回头改。组件推荐版本说明Ubuntu22.04 LTS内核 5.15/6.x兼容性很好社区资料最多NVIDIA Driver550.x支持 CUDA 12.4这个版本的驱动很成熟CUDA Toolkit12.4.1PyTorch 官方有对应 wheel生态覆盖广cuDNN9.1.x对应 CUDA 12.x下载时注意版本号PyTorch2.4.x官方提供 cu124 的安装源TensorRT10.3.x支持 CUDA 12.0-12.4和上面组合正好匹配上面只是我这次选的组合。不同阶段你有不同的选择空间本质原则是驱动版本 CUDA Toolkit 版本 PyTorch/CUDA 运行时版本TensorRT 则必须看官方兼容表。1.2 为什么我不建议“装最新版”每次谈到版本选择总有人问为什么不直接装最新的驱动、最新的 CUDA 12.6、最新的 PyTorch最新当然可以但你要承受的是生态配套没跟上的风险。比如 PyTorch 发布后要过一段时间才会有对应 cu126 的 wheelTensorRT 对最新 CUDA 的支持往往也要滞后几个月。在开发环境里我宁愿选一个经过大家反复验证的“稳定组合”而不是为了追新去当小白鼠。还有一个思路上的误区很多人觉得只要装了 CUDAPyTorch 就会自动用上 GPU。其实不对。PyTorch 的 pip 安装包会自带它需要的 CUDA 运行库所以你只要确保两个条件驱动装好且 PyTorch 的 wheel 版本与驱动支持的最高 CUDA 版本兼容。换句话说CUDA Toolkit对torch.cuda.is_available()不是必须的它更多是给编译扩展模块、跑 TensorRT 这类工具准备的。理解这一点你后面排查问题时就能少走很多弯路。2. 从零搭建NVIDIA 驱动安装实操2.1 动手前先确认硬件驱动的安装必须和硬件匹配所以在开始之前第一步永远是确认你的显卡型号和当前图形环境状态。执行下面两条命令lspci | grep -i nvidia ubuntu-drivers devices第一条命令能看到 NVIDIA 显卡的设备信息第二条命令会列出系统推荐的驱动版本。比如输出里会告诉你driver: nvidia-driver-560 - third-party free recommended这基本就是最省事的安装方式。如果nvidia-smi已经能正常输出说明驱动已经可用你不需要重装。如果没有输出继续往下走。还有一点如果你的机器是双显卡比如笔记本的 Intel 核显 NVIDIA 独显这时候优先确认 BIOS 里的显示模式一般选 Discrete 或 Optimus 都行但新一代 notebook 用户建议直接在 BIOS 里切独显直连能省掉不少麻烦。2.2 三种驱动安装方式我推荐哪种Ubuntu 下装 NVIDIA 驱动有三种主流方式我分别说一下适用场景。第一种是用系统仓库装最简单sudo apt update sudo apt install nvidia-driver-550装完重启nvidia-smi就能看到输出。这种方式的好处是 Ubuntu 仓库已经把驱动和内核模块的依赖关系处理好了基本不会出现“重启后驱动消失”的问题。缺点是版本可能比官网旧一点但稳定性反而是最高。第二种是从官网下载.run文件手动安装。这个适合那些需要特定版本驱动、或者想自定义安装选项的人。流程稍复杂而且如果你在图形界面环境下直接跑.run文件极容易引发后续循环登录的问题。我的经验是要么在纯净命令行模式下装要么干脆不用它。第三种是用 Ubuntu 的自动安装命令sudo ubuntu-drivers autoinstall它会自动检测硬件并安装推荐驱动非常省心特别适合新手。我这次用的是能定制版本号的nvidia-driver-550因为它和后面 CUDA 12.4、TensorRT 10.3 的兼容性最好。2.3 安装后的验证与回滚驱动装完后重启终端里输入nvidia-smi如果看到类似下面的信息说明驱动已经正常工作----------------------------------------------------------------------------- | NVIDIA-SMI 550.78 Driver Version: 550.78 CUDA Version: 12.4 | -----------------------------------------------------------------------------注意这里显示的CUDA Version: 12.4它表示这个驱动能够支持最高 CUDA 12.4而不是说已经装了 CUDA Toolkit。万一驱动装坏了比如开机进入循环登录不要慌。按Ctrl Alt F3进入纯命令行 tty然后卸载驱动sudo apt-get remove --purge nvidia-* sudo apt autoremove如果你是用.run装的就用sudo /usr/bin/nvidia-uninstall卸载后重启回到桌面环境再换一种方式重新安装。这个回滚流程我几乎每次都会讲因为驱动装失败是这整套环境里最折磨人的环节。3. CUDA Toolkit 与 cuDNN 的安装3.1 CUDA Toolkit 的多版本管理思想很多深度学习项目对 CUDA 版本有要求比如有的代码在 CUDA 11.8 下编译过有的要用 12.x你想在同一个系统里共存多个版本。我不建议直接把/usr/local/cuda这个软链接指向某个固定版本而是建议用update-alternatives来管理。首先在安装完不同版本的 CUDA 之后你会看到/usr/local/cuda-11.8、/usr/local/cuda-12.4这些目录。把它们注册到系统里sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.8 118 sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.4 124以后想切换版本时执行sudo update-alternatives --config cuda选好版本后/usr/local/cuda这个软链接就会自动指向你选择的版本环境变量也不用反复改。这种方式非常实用尤其是你手头有多个项目、不同框架对 CUDA 版本要求不一样的时候。如果你的需求单纯到只需要一个版本那直接装好后在.bashrc里写死路径即可也没必要上update-alternatives。3.2 CUDA 12.4 的安装过程到 NVIDIA 官网的 CUDA Toolkit 下载页面选择Linux - x86_64 - Ubuntu - 22.04 - runfile (local)。为什么我建议用 runfile 而不是 deb 包因为 runfile 安装时可以选择不装驱动只装 toolkit而 deb 包安装方式容易把驱动也一起带进来可能覆盖你刚才装好的驱动造成版本混乱。下载好文件后执行sudo sh cuda_12.4.1_550.54.15_linux.run --toolkit --silent --override我加了这个--toolkit参数意思是只装 Toolkit 部分跳过 Driver。--silent是静默安装不需要交互--override是跳过编译器版本检查因为新版 GCC 可能不在它认的范围内。装完之后把环境变量写进~/.bashrcexport PATH/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH然后在终端里验证source ~/.bashrc nvcc -V如果看到类似Cuda compilation tools, release 12.4, V12.4.131的输出CUDA 就算装好了。这里注意nvcc -V显示的版本是 Toolkit 的版本它和nvidia-smi顶部的CUDA Version不是一回事很多人把这两个搞混后面我会专门讲。3.3 cuDNN 安装的两种姿势cuDNN 是 NVIDIA 专门为深度学习优化的加速库PyTorch 在编译时会链到它。安装 cuDNN 需要先到 NVIDIA 官网注册开发者账号下载时注意选择和 CUDA 12.x 对应的版本。最省事的方式是先下载 deb 包然后sudo dpkg -i cudnn-local-repo-ubuntu2204-9.1.1_1.0-1_amd64.deb这个 deb 安装完以后系统里会多出一个本地仓库你需要按照它的提示导入 gpg key然后sudo apt update再安装具体包。命令大概长这样sudo cp /var/cudnn-local-repo-ubuntu2204-9.1.1/cudnn-local-*-keyring.gpg /usr/share/keyrings/ sudo apt update sudo apt install libcudnn9-dev-cuda-12如果不想用 deb 包折腾 key 的问题也可以下载 tar 包直接解压覆盖到 CUDA 目录tar -xvf cudnn-linux-x86_64-9.1.1_cuda12-archive.tar.xz cd cudnn-linux-x86_64-9.1.1_cuda12-archive sudo cp -P lib/* /usr/local/cuda/lib64/ sudo cp -P include/* /usr/local/cuda/include/tar 包的优点是简单直接而且能看到文件被复制到了哪里适合排查问题。缺点是升级和卸载时没那么干净但一般也不会频繁换 cuDNN。4. PyTorch 环境的安装与验证4.1 用 conda 还是 pip我的习惯PyTorch 官方提供了 conda 和 pip 两种安装方式。我个人更推荐用 pip原因很简单PyTorch 官方把 CUDA 相关的依赖都打进了 wheel 包你不需要单独再装一个 CUDA Toolkit 进去。而 conda 装的话可能还会牵扯到 cudatoolkit 版本的匹配问题多一个变量就多一个坑。不过 conda 本身还是建议装一个它可以方便地管理 Python 虚拟环境。我习惯先把 conda 装好然后创建一个干净的虚拟环境在里面用 pip 装 PyTorchconda create -n torch python3.10 -y conda activate torch pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124如果你不用 conda直接用 Python 自带的 venv 也可以python3 -m venv torch-env source torch-env/bin/activate pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124关键在这个--index-url参数它指定了 PyTorch 官方提供的 CUDA 版本下载源。cu124表示这个 wheel 包是给 CUDA 12.4 用的。你可以在 PyTorch 官网首页选择对应的系统和 CUDA 版本它会自动生成这条命令。如果你的网络环境访问官方源很慢可以加上-i https://mirrors.aliyun.com/pytorch-wheels/cu124/之类的国内源或者先下载 wheel 文件再本地安装。这里要提醒一句不要混用源更不要从某度随便下第三方打包的 wheel版本对不上直接意味着后面的程序跑不起来。4.2 验证 PyTorch 是否真的用上了 GPU这是整个环境搭建里最有仪式感的一步。在终端里敲python -c import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出类似下面这样说明 PyTorch 已经能正常调用 GPU 了2.4.1cu124 12.4 True NVIDIA GeForce RTX 4090这里很多人会卡在torch.cuda.is_available()返回False。这时不要急着重装 PyTorch先逐项排查nvidia-smi有没有输出如果没有驱动没装好驱动支持的 CUDA 版本是不是 PyTorch 需要的 CUDA 版本你的显卡算力是不是太老导致新版本 PyTorch 不再支持。要是验证没问题我再建议你在 GPU 上做个简单矩阵乘法测试确保不是“假识别”python -c import torch x torch.rand(10000, 10000, devicecuda) y torch.rand(10000, 10000, devicecuda) print(torch.matmul(x, y).sum().item()) 能跑出结果说明显存能被正常申请、计算内核能正常加载。这一步虽然简单但能排除不少隐藏问题。4.3 虚拟环境、Anaconda 和系统 Python 的混乱场景很多人到了这一步开始蒙圈因为 Ubuntu 系统自带 PythonAnaconda 里又有 Pythonpip装完包之后却发现导入失败。问题多半是环境没激活或者 pip 对应的是另一个 Python。我给你一个最低成本的规避方法永远先激活虚拟环境再操作。再补充一个经验在 conda 虚拟环境里用 pip 安装 PyTorch不要用sudo pip install。一旦加了 sudo包就可能被装到系统 Python 目录里导致虚拟环境里的 torch 还是旧版本。这个问题我见过太多人踩包括当时带我入门的师兄也踩过。5. TensorRT 安装与集成5.1 TensorRT 版本和 CUDA 匹配关系TensorRT 是 NVIDIA 的推理引擎它的作用是把训练好的模型优化成能在 GPU 上高效运行的 engine。它跟 PyTorch 没有直接依赖但你如果要部署模型通常需要把 PyTorch 模型导出为 ONNX再用 TensorRT 转换或者直接用torch_tensorrt这个插件在 PyTorch 里做加速。TensorRT 每个大版本支持的 CUDA 范围不一样。以 TensorRT 10.3 为例它官方支持 CUDA 12.0 到 12.4。如果你的 CUDA Toolkit 是 12.6那就得查一查对应版本的 TensorRT 是否支持或者干脆换用 TensorRT 10.7 之类的版本。安装前多花两分钟查一下官方兼容矩阵比什么都靠谱。我这次选用 TensorRT 10.3因为它和 CUDA 12.4 完美对应且安装包自带 Python wheel省去不少编译时间。5.2 tar 包安装 TensorRT 的完整流程TensorRT 的下载页面提供 tar 包和 deb 包两种形式。我更喜欢 tar 包因为解压即用环境变量可控。下载时文件名大概长这样TensorRT-10.3.0.26.Linux.x86_64-gnu.cuda-12.4.tar.gz注意系统架构和 CUDA 版本别选错。解压到某个固定目录比如/opt/tensorrtsudo mkdir -p /opt/tensorrt sudo tar -xzvf TensorRT-10.3.0.26.Linux.x86_64-gnu.cuda-12.4.tar.gz -C /opt/tensorrt然后在~/.bashrc里加环境变量export TRT_RELEASE/opt/tensorrt/TensorRT-10.3.0.26 export LD_LIBRARY_PATH$TRT_RELEASE/lib:$LD_LIBRARY_PATH export PATH$TRT_RELEASE/bin:$PATH这里有一点需要注意lib路径一定要加进LD_LIBRARY_PATH否则后面import tensorrt会报找不到共享库的错误。接下来安装 Python 包。进入 TensorRT 解压目录下的python文件夹你会看到类似tensorrt-10.3.0-cp310-none-linux_x86_64.whl的文件注意cp310表示它对应 Python 3.10。激活你的虚拟环境后cd /opt/tensorrt/TensorRT-10.3.0.26/python pip install tensorrt-10.3.0-cp310-none-linux_x86_64.whl如果还需要 ONNX 解析功能把同目录下onnx_graphsurgeon和trt_onnx_parser也一并装上pip install onnx_graphsurgeon-*.whl pip install trt_onnx_parser-*.whl最后验证python -c import tensorrt as trt; print(trt.__version__)能正常输出版本号TensorRT 就装好了。同时你也可以用自带的命令行工具trtexec做基准测试先试试解压目录下的trtexec能否运行trtexec --help5.3 把 PyTorch 模型转到 TensorRT 的路径TensorRT 本身不消费 PyTorch 的模型文件你需要先通过 ONNX 做一次中间转换。我的习惯是在虚拟环境里先把 PyTorch 模型导出为 ONNXimport torch import torchvision.models as models model models.resnet18(pretrainedTrue).eval().cuda() dummy_input torch.randn(1, 3, 224, 224, devicecuda) torch.onnx.export(model, dummy_input, resnet18.onnx, input_names[input], output_names[output], opset_version17)然后用 TensorRT 自带的trtexec转化为 engine 文件trtexec --onnxresnet18.onnx --saveEngineresnet18.engine --fp16这里--fp16表示启用半精度推理对性能提升非常明显。如果你的业务还需要更紧密的 PyTorch 集成可以考虑torch_tensorrt它是英伟达推出的 PyTorch 前端插件可以直接在 PyTorch 里做 TensorRT 推理而不需要经历 ONNX 文件这个中间过程。不过第一次部署的话我还是建议先用trtexec跑通流程再研究深度集成。6. 常见问题排查与避坑指南6.1CUDA error: no kernel image is available for execution on the device这个报错太经典了几乎每个深度学习环境问题集合里都会出现。它的意思是当前 PyTorch 编译时针对的 CUDA 架构和你实际显卡的 Compute Capability 不匹配或者驱动支持的最高 CUDA 版本低于 PyTorch 所需。最常见的情况是显卡比较新但驱动装的是老版本比如你是 RTX 40 系显卡却还在用 470 时代的驱动或者显卡比较老而 PyTorch 已经用了 cu121 的 wheel老卡压根不在编译范围里。排查思路很简单nvidia-smi看驱动支持的最高 CUDA 版本是多少。如果低于 PyTorch wheel 的版本直接升级驱动。如果驱动版本足够但报错依旧再检查显卡算力比如 GTX 10 系以上的卡一般都能跑 cu124再老的卡建议降低 PyTorch 版本或者换成 CPU 版。6.2 驱动版本和 CUDA Toolkit 版本不一致是不是有问题这个问题几乎每周都会有人问。nvidia-smi顶部显示的CUDA Version是驱动能支持的最高 CUDA 版本而nvcc -V显示的是你当前安装的 CUDA Toolkit 版本。两者不一致很正常比如驱动支持 12.4Toolkit 是 11.8完全没问题。原则只有一个驱动的上限要 Toolkit 的版本。我见过一个反面案例有人把 CUDA Toolkit 装到了 12.6但驱动只到 525然后编译第三方 CUDA 扩展时各种报错。这就是典型的驱动版本没跟上。6.3 装完驱动后黑屏或循环登录这个坑在官网跑.run安装时最容易出现因为 nouveau 开源驱动和 NVIDIA 闭源驱动冲突。解决方法是安装前先把 nouveau 禁用掉。创建一个内核模块黑名单文件sudo nano /etc/modprobe.d/blacklist-nouveau.conf内容写入blacklist nouveau options nouveau modeset0然后更新内核sudo update-initramfs -u重启后再装 NVIDIA 驱动一般就不会再黑屏了。如果不幸已经黑屏或循环登录按Ctrl Alt F3进入命令行先把驱动卸载掉再按上面的步骤重新走一遍。6.4 在 WSL2 里安装 CUDA 的特殊处理很多人现在用 Windows WSL2 做深度学习这套流程在 WSL2 里有一点重要区别不要在 WSL2 里装 Linux 版 NVIDIA 驱动只需要在 Windows 侧装好驱动WSL2 里会自动透传 GPU。你可以在 WSL2 终端里直接跑nvidia-smi验证。CUDA Toolkit 的安装也有现成命令直接添加 NVIDIA 的 apt 源即可wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/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 cuda-toolkit-12-4装完后nvcc -V能出来就行。PyTorch 的安装方式和正常 Ubuntu 没区别。唯一要提醒的是WSL2 里的显存访问效率相比裸机有一点损耗但对大多数训练任务影响不大。6.5 重启后 nvidia-smi 消失这是 Ubuntu 更新内核后很常见的问题。NVIDIA 驱动模块是编译进内核的如果内核版本变了模块可能失效。如果你在安装驱动时勾选了 DKMS它会自动为每个新内核重新编译模块基本不会出问题。如果没勾选就需要重装驱动。重新安装驱动的命令其实就一行sudo apt install --reinstall nvidia-driver-550装完重启nvidia-smi就会回来。所以我现在装驱动只要条件允许都会选 DKMS 方式。6.6 ImportError: libcudart.so.12: cannot open shared object file这个错误通常发生在你直接用 PyTorch 的 pip wheel 装完环境之后再手动编译某些 CUDA 扩展时。因为系统里可能没有 CUDA Toolkit或者LD_LIBRARY_PATH没指对。解决办法看情况如果只是跑 PyTorch 模型多半是因为你装错了 PyTorch 版本换成对应 cu 版本即可如果是编译扩展缺库就把 CUDA 的lib64路径加到LD_LIBRARY_PATH或者用 conda 装一个配套的cudatoolkit版本具体版本号以报错里缺失的库名为准。我个人在实际操作中还会把工具链顺序记成一张口诀“先定版本矩阵再装驱动然后 toolkit最后框架和推理引擎”。每次换新机器都按这个节奏走基本不会再被版本问题折磨。最后再分享一个小技巧把这套环境的所有安装命令和版本号整理成一个 shell 脚本放进项目仓库里下次在新机器上配环境时直接执行半自动脚本剩下的人工干预就只有下载文件时选择对应版本以及在最后跑一下验证脚本。这个习惯帮我节省了大量重复劳动强烈推荐你也试试。