Ubuntu20.04深度学习环境搭建:CUDA11.8、cuDNN8.7与TensorRT8.5.3实战指南
1. 环境准备:为什么选择Ubuntu 20.04与CUDA 11.8这套组合?
如果你正准备踏入深度学习或者高性能计算的世界,那么搭建一个稳定、高效的GPU开发环境就是你的第一道门槛。我见过太多新手朋友,兴冲冲地买来一块RTX显卡,结果在环境配置上就卡了好几天,热情都被消磨殆尽了。今天,我就以自己踩过无数次坑的经验,带你手把手在Ubuntu 20.04上,把CUDA 11.8、cuDNN 8.7和TensorRT 8.5.3这套黄金组合给稳稳地装好。
首先,我们来聊聊为什么是Ubuntu 20.04和CUDA 11.8。Ubuntu 20.04 LTS是一个长期支持版本,这意味着它有长达五年的官方维护,系统稳定,社区支持丰富,遇到问题很容易找到解决方案。而CUDA 11.8,在我看来,是目前一个非常“甜点”的版本。它既不是太老,导致很多新框架特性不支持;也不是太新,避免了前沿版本可能存在的各种兼容性“坑”。更重要的是,目前主流的深度学习框架,比如PyTorch和TensorFlow,对CUDA 11.8的支持都非常成熟和友好。你去看PyTorch官网,最新的稳定版本通常都明确支持CUDA 11.8。TensorFlow 2.14.0版本也完美匹配CUDA 11.8和cuDNN 8.7。这意味着你安装完这套环境后,可以无缝地使用绝大多数主流的AI库和工具链,不用再为版本冲突而头疼。
在开始动手之前,我强烈建议你先做一次系统更新。打开你的终端,输入以下命令,这能确保你的系统软件包是最新的,减少后续安装过程中因依赖问题导致的失败。
sudo apt update && sudo apt upgrade -y
另外,检查一下你的显卡驱动是否已经安装。虽然我们后续安装CUDA时可以选择不安装驱动,但提前确认一下总没坏处。运行 nvidia-smi 命令,如果能看到你的GPU信息、驱动版本和CUDA版本(这里显示的是驱动支持的最高CUDA版本,并非已安装的),那就说明驱动基础是好的。如果提示命令未找到,那也没关系,我们后面会一并处理。记住,一个干净、有序的起点,是成功搭建环境的一半。
2. 搞定NVIDIA显卡驱动:为GPU计算铺平道路
驱动是GPU工作的基础。在Ubuntu上,安装NVIDIA驱动有几种方法:通过系统自带的“软件和更新”附加驱动、使用ubuntu-drivers工具、或者从NVIDIA官网下载.run文件手动安装。我个人更推荐使用APT仓库安装,因为这样管理起来更方便,未来更新也容易。
首先,我们需要确保系统没有残留的旧版NVIDIA驱动,避免冲突。执行下面的命令进行清理:
sudo apt remove --purge nvidia-* libnvidia-*
sudo apt autoremove -y
sudo reboot
重启回来后,我们需要先处理一个叫nouveau的家伙。它是Linux系统自带的开源NVIDIA驱动,但会和官方的闭源驱动冲突,所以必须禁用。创建一个配置文件来屏蔽它:
sudo bash -c "echo -e 'blacklist nouveau\noptions nouveau modeset=0' > /etc/modprobe.d/blacklist-nouveau.conf"
然后更新内核初始化文件并重启:
sudo update-initramfs -u
sudo reboot
再次重启后,可以验证nouveau是否已被禁用:运行 lsmod | grep nouveau,如果没有输出任何内容,就表示成功了。
接下来,添加NVIDIA的官方驱动PPA仓库并安装驱动。这里有个小技巧,我们可以先让系统推荐一个合适的驱动版本:
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices
ubuntu-drivers devices 命令会列出所有可用的驱动版本,并推荐一个(通常后面会标有“recommended”)。以我写这篇文章时的环境为例,它可能会推荐 nvidia-driver-535。这个535驱动版本最高支持CUDA 12.2,完全兼容我们即将安装的CUDA 11.8。所以,我们就安装它:
sudo apt install nvidia-driver-535
安装完成后,再次重启系统。这是非常关键的一步,不重启的话新驱动不会生效。重启后,再次运行 nvidia-smi,你应该能看到一个漂亮的表格,显示了你的GPU型号、驱动版本(比如535.216.01)以及一个CUDA版本号(例如12.2)。这个CUDA版本号是此驱动支持的最高运行时版本,我们接下来要安装的CUDA 11.8是包含在这个支持范围内的,所以不用担心。
注意:如果你在这里遇到任何问题,比如
nvidia-smi报错或者屏幕分辨率异常,请回头检查nouveau是否真的被禁用了,或者尝试安装不同版本的驱动(比如nvidia-driver-470)。有时候,最新的驱动不一定和你的显卡或系统内核最匹配。
3. 安装CUDA 11.8工具包:解锁GPU的并行计算能力
驱动搞定后,我们就可以安装CUDA工具包了。这里我强烈建议使用runfile(本地)安装方式,而不是通过apt安装nvidia-cuda-toolkit。因为APT仓库里的版本往往不是最新的,而且runfile方式安装更干净,可以自定义安装路径和组件,尤其是能让我们选择不安装自带的显卡驱动,避免覆盖我们刚刚精心装好的驱动。
首先,前往NVIDIA官网的CUDA Toolkit Archive页面,找到CUDA 11.8.0。选择Linux -> x86_64 -> Ubuntu -> 20.04 -> runfile (local)。你会得到一个下载链接。我们直接在终端里用wget下载:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
下载完成后,给这个文件添加执行权限,然后以管理员身份运行安装程序:
chmod +x cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
这时会弹出一个基于字符界面的安装向导。你需要仔细阅读并做出选择:
- 首先输入
accept同意许可协议。 - 接下来会问你是否安装NVIDIA Accelerated Graphics Driver。这里一定要选
n(No)! 因为我们已经在上一节安装好了驱动,重复安装可能导致冲突。 - 问你是否安装CUDA 11.8 Toolkit,当然选
y。 - 工具箱安装位置,直接按回车使用默认路径
/usr/local/cuda-11.8就好。 - 是否创建符号链接
/usr/local/cuda指向这个版本,建议选y。这样以后切换CUDA版本会方便很多。 - 剩下的选项,比如安装Samples,可以根据需要选择,一般选
y也没问题。
安装过程需要几分钟。完成后,我们需要将CUDA添加到系统环境变量中,这样终端才能找到nvcc等命令。编辑你的 ~/.bashrc 文件(如果你用的是zsh,就编辑 ~/.zshrc):
vim ~/.bashrc
在文件末尾添加以下几行:
export CUDA_HOME=/usr/local/cuda-11.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
保存退出后,让配置立即生效:
source ~/.bashrc
现在,让我们验证CUDA是否安装成功。打开一个新终端,或者确保当前终端已经重新加载了配置,然后运行:
nvcc --version
如果看到类似下面的输出,显示版本是11.8,那么恭喜你,CUDA安装成功了!
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
你也可以运行自带的样例来测试编译和运行,例如进入 NVIDIA_CUDA-11.8_Samples 目录(安装时如果选择了安装Samples,它会在你的家目录下),找一个简单的例子如 1_Utilities/deviceQuery 进去执行 make,然后运行 ./deviceQuery,它会详细列出你的GPU信息和CUDA能力。
4. 安装cuDNN 8.7:为深度神经网络装上加速引擎
如果说CUDA是GPU的通用计算语言,那么cuDNN就是专门为深度神经网络定制的加速库。它提供了高度优化的例程,用于卷积、池化、归一化等核心操作,能让你的模型训练和推理速度提升数倍甚至数十倍。cuDNN的安装相对简单,本质上是将一些头文件和库文件复制到CUDA的安装目录中。
首先,你需要访问NVIDIA的cuDNN归档页面。注意,下载cuDNN需要注册一个免费的NVIDIA开发者账号。登录后,找到 “Download cuDNN v8.7.0 (November 28th, 2022), for CUDA 11.x” 这一项。在下面选择 Local Installer for Linux x86_64 (Tar)。这个是一个压缩包,下载下来。
假设你下载的文件名是 cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz。我们通过以下步骤安装:
# 解压下载的归档文件
tar -xvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz
# 进入解压后的目录
cd cudnn-linux-x86_64-8.7.0.84_cuda11-archive
# 复制头文件
sudo cp include/cudnn*.h /usr/local/cuda-11.8/include/
# 复制库文件
sudo cp lib/libcudnn* /usr/local/cuda-11.8/lib64/
# 设置文件权限
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
安装完成后,如何验证呢?最直接的方法是查看版本头文件:
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
如果安装成功,你会看到类似这样的输出,清楚地标明主版本、次版本和补丁版本:
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 7
#define CUDNN_PATCHLEVEL 0
另一种更“实战”的验证方式,是等我们安装好PyTorch后,在Python中检查:
import torch
print(torch.backends.cudnn.version()) # 应该输出 8700(对应8.7.0)
cuDNN本身不提供可执行文件,它是以库的形式被深度学习框架调用的。所以只要文件复制到了正确的位置,并且框架在运行时能够链接到它们,就算成功了。这里复制到的 /usr/local/cuda-11.8 目录,正是我们之前设置 LD_LIBRARY_PATH 环境变量包含的路径,确保了系统能够找到它们。
5. 安装TensorRT 8.5.3:实现推理性能的极致优化
TensorRT是NVIDIA推出的高性能深度学习推理优化器和运行时库。它能将训练好的模型(如PyTorch、TensorFlow导出的ONNX模型)进行优化,包括层融合、精度校准(INT8)、内核自动调优等,最终生成一个在特定GPU上运行效率极高的“引擎”。对于模型部署来说,TensorRT往往是提升吞吐量、降低延迟的终极武器。
我们需要安装与CUDA 11.8和cuDNN 8.7兼容的TensorRT版本。根据官方文档,TensorRT 8.5.3 GA Update 2 是一个同时支持CUDA 11.8和cuDNN 8.6/8.7的稳定版本。我们去NVIDIA TensorRT下载页面,找到 “TensorRT 8.5 GA Update 2 for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7 and 11.8 TAR Package” 并下载。
假设下载的文件名为 TensorRT-8.5.3.1.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz。注意,文件名里是cudnn8.6,但实际它和我们的cuDNN 8.7是兼容的,可以正常工作。安装步骤如下:
# 1. 解压TensorRT包,这实际上就是“安装”过程,因为它是一个预编译好的库
tar -zxvf TensorRT-8.5.3.1.Linux.x86_64-gnu.cuda-11.8.cudnn8.6.tar.gz
# 2. 为了方便,我们将解压后的目录重命名并移动到合适的位置(比如/opt)
sudo mv TensorRT-8.5.3.1 /opt/
# 3. 将TensorRT的库路径添加到系统环境变量
echo 'export TRT_HOME=/opt/TensorRT-8.5.3.1' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$TRT_HOME/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 4. 安装TensorRT的Python wheel包(根据你的Python版本选择)
cd /opt/TensorRT-8.5.3.1/python
# 例如,我的Python是3.8,就安装cp38对应的文件
sudo pip3 install tensorrt-8.5.3.1-cp38-none-linux_x86_64.whl
# 5. (可选)安装附带的graphsurgeon和onnx_graphsurgeon等工具包,用于模型转换
cd /opt/TensorRT-8.5.3.1/graphsurgeon
sudo pip3 install graphsurgeon-0.4.6-py2.py3-none-any.whl
cd /opt/TensorRT-8.5.3.1/onnx_graphsurgeon
sudo pip3 install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl
验证TensorRT安装是否成功,有多种方法。最直接的是检查Python包:
import tensorrt
print(tensorrt.__version__) # 应该输出 8.5.3.1
也可以运行TensorRT自带的样例程序。例如,我们可以测试一个简单的样例:
cd /opt/TensorRT-8.5.3.1/samples/sampleOnnxMNIST
make -j$(nproc)
cd ../../bin/
./sample_onnx_mnist
如果程序能成功运行并输出推理结果,说明TensorRT的安装和基本功能都是正常的。TensorRT的强大之处在于它复杂的优化流程,对于生产部署,你通常需要编写代码来加载你的模型,让TensorRT进行优化(构建引擎),然后序列化保存这个引擎,最后在推理时加载运行。这个过程虽然有些繁琐,但带来的性能提升是实实在在的。
6. 终极验证:用PyTorch和TensorFlow检验你的GPU环境
所有的组件都安装完毕后,现在是验收成果的时候了。我们将通过安装主流的深度学习框架,并运行测试代码,来确保整个GPU计算栈从上到下都是通畅的。这就像给新组装好的电脑跑个分一样,让人安心。
首先,我们来安装PyTorch。访问PyTorch官网,使用它的安装命令生成器,选择稳定版、Linux、pip、Python和CUDA 11.8。你会得到类似下面这样的命令:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
接着安装TensorFlow。对于CUDA 11.8和cuDNN 8.7,TensorFlow 2.14.0是一个完美的匹配:
pip3 install tensorflow==2.14.0
安装完成后,我们创建一个Python测试脚本 test_gpu.py,把能测的都测一遍:
import torch
import tensorflow as tf
print("="*50)
print("PyTorch 测试")
print("="*50)
print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 是否可用: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"当前设备索引: {torch.cuda.current_device()}")
print(f"GPU 数量: {torch.cuda.device_count()}")
print(f"GPU 名称: {torch.cuda.get_device_name(0)}")
# 执行一个简单的GPU计算
a = torch.rand(1000, 1000).cuda()
b = torch.rand(1000, 1000).cuda()
c = torch.mm(a, b)
print(f"矩阵乘法测试完成,结果形状: {c.shape}")
print(f"cuDNN 版本: {torch.backends.cudnn.version()}")
print("\n" + "="*50)
print("TensorFlow 测试")
print("="*50)
print(f"TensorFlow 版本: {tf.__version__}")
gpus = tf.config.list_physical_devices('GPU')
print(f"可用的物理GPU设备: {gpus}")
if gpus:
try:
# 启用内存自增长,避免一下子占满所有显存
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
print("GPU 内存自增长已启用")
except RuntimeError as e:
print(e)
# 测试GPU计算
with tf.device('/GPU:0'):
a_tf = tf.random.normal((1000, 1000))
b_tf = tf.random.normal((1000, 1000))
c_tf = tf.matmul(a_tf, b_tf)
print(f"TensorFlow GPU矩阵乘法测试完成,结果形状: {c_tf.shape}")
print("\n" + "="*50)
print("TensorRT 测试")
print("="*50)
try:
import tensorrt as trt
print(f"TensorRT 版本: {trt.__version__}")
print(f"TensorRT 已成功导入")
except ImportError as e:
print(f"导入TensorRT失败: {e}")
在终端运行这个脚本:python3 test_gpu.py。你期待看到的理想输出是:PyTorch和TensorFlow都报告CUDA可用,能正确识别出你的GPU型号,并且能成功在GPU上执行计算。TensorRT模块也能被正常导入。同时,你可以打开另一个终端窗口,运行 nvidia-smi -l 1 来实时监控GPU的使用情况。当你运行测试脚本时,应该能看到一个Python进程占用了部分GPU显存和计算资源。
如果一切顺利,那么你的Ubuntu 20.04深度学习环境就已经宣告搭建成功!这个环境具备了从底层驱动(NVIDIA Driver)、计算平台(CUDA)、神经网络加速库(cuDNN)到高级推理优化器(TensorRT)以及主流框架(PyTorch, TensorFlow)的完整能力。你可以用它来跑通大多数开源深度学习项目,开始你的模型训练和部署之旅了。
7. 避坑指南与常见问题排查
即使按照步骤操作,也难免会遇到一些意外情况。这里我总结了一些自己和其他开发者常遇到的“坑”,以及解决办法,希望能帮你快速排雷。
问题一:运行 nvidia-smi 正常,但 torch.cuda.is_available() 返回 False。
这是最常见的问题之一。首先,请确保你的PyTorch是通过CUDA 11.8的渠道安装的,而不是CPU版本。可以用 pip list | grep torch 查看,版本号后面应该带有 +cu118 字样。其次,检查Python环境是否一致。如果你使用了conda等虚拟环境,确保你是在正确的环境中安装和运行代码。最根本的检查方法是查看PyTorch构建时链接的CUDA版本:
import torch
print(torch.version.cuda) # 应该输出 '11.8'
如果这里输出是 None 或者别的版本,说明PyTorch安装不对。卸载后重新用正确的pip命令安装。
问题二:运行TensorFlow代码时出现 Could not load dynamic library 'libcudnn.so.8' 等错误。
这明确指向cuDNN安装问题。首先,确认文件是否真的复制到了正确位置:检查 /usr/local/cuda-11.8/lib64/ 目录下是否存在 libcudnn.so.8 等文件。其次,检查环境变量 LD_LIBRARY_PATH 是否包含了 /usr/local/cuda-11.8/lib64。你可以通过 echo $LD_LIBRARY_PATH 查看。如果环境变量设置正确但问题依旧,可以尝试手动创建符号链接,或者直接将cuDNN库路径添加到系统库配置中:
sudo bash -c "echo '/usr/local/cuda-11.8/lib64' > /etc/ld.so.conf.d/cuda-11.8.conf"
sudo ldconfig
问题三:安装CUDA时卡在“安装驱动”环节,或者安装后系统无法进入图形界面。
这通常是因为CUDA安装程序自带的驱动与你的系统或显卡不兼容,覆盖了你原有的稳定驱动。再次强调,安装CUDA时一定要选择不安装驱动! 如果已经发生,可以尝试在系统启动时进入恢复模式或文本模式,卸载有问题的驱动,然后重新安装之前稳定的驱动版本。
问题四:TensorRT的Python包导入失败,提示找不到 _tensorrt.so 等文件。
这几乎总是因为 LD_LIBRARY_PATH 环境变量没有包含TensorRT的lib目录。请严格按照第5节的步骤,将 /opt/TensorRT-8.5.3.1/lib 添加到 LD_LIBRARY_PATH,并执行 source ~/.bashrc。另外,确保你安装的TensorRT Python wheel包与你的Python版本(如cp38)匹配。
问题五:多版本CUDA管理。
未来你可能需要安装不同版本的CUDA来适配不同的项目。我们的安装方式已经为此做好了准备。我们安装CUDA 11.8到独立目录 /usr/local/cuda-11.8,并通过 /usr/local/cuda 这个符号链接来指向“当前使用的版本”。如果你想切换版本,只需要删除这个符号链接,然后重新创建指向另一个版本(比如cuda-12.1)的链接即可。同时,在 ~/.bashrc 中修改 CUDA_HOME 的环境变量指向新版本路径,并 source ~/.bashrc。这样,你就能在不同的项目间灵活切换CUDA环境了。
环境搭建是个细致活,耐心和按部就班是关键。每完成一步都做个验证,这样一旦出错,你就能很快定位到问题发生的环节。希望这份详细的指南能让你少走弯路,一次成功地把这个强大的深度学习环境搭建起来。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)