
1. 项目概述一次完整的Ubuntu 20.04深度学习环境搭建实录最近为了复现一个基于YOLO的视觉项目我重新在物理机上部署了一套Ubuntu 20.04系统并完整安装了NVIDIA驱动、CUDA、cuDNN和TensorRT。整个过程看似是“标准流程”但实际操作中遇到的坑一个接一个从系统安装时的分区困惑到驱动与CUDA版本的地狱级兼容性问题再到TensorRT那令人头疼的依赖关系每一步都足以让新手抓狂。这篇文章我就以一名踩过无数坑的过来人身份把这次从零开始搭建深度学习环境的全过程、遇到的问题以及最终的解决方案毫无保留地分享出来。无论你是刚接触Linux的新手还是想从Windows或WSL2迁移到原生Linux环境进行开发的同行这篇超过5000字的详细记录都能帮你避开我踩过的那些雷顺利搭建起一个稳定、高效的开发平台。2. 系统安装从镜像选择到首次启动的完整指南2.1 Ubuntu 20.04镜像下载与启动盘制作选择Ubuntu 20.04 LTS长期支持版本作为基础系统是经过深思熟虑的。LTS版本意味着长达五年的官方支持软件生态稳定社区资料丰富对于需要长期跑模型、做实验的深度学习环境来说稳定性远高于追求新特性的非LTS版本。我直接从Ubuntu官网下载了ubuntu-20.04.6-desktop-amd64.iso这个版本。这里有个小细节官网可能会默认推荐更新的版本但20.04的下载链接依然在发布页面清晰可见。制作启动盘我推荐使用RufusWindows环境或balenaEtcher跨平台。两者都非常简单易用。以Rufus为例插入一个至少8GB的U盘在“设备”中选择它在“引导类型选择”处点击“选择”找到你下载的ISO文件。关键设置在于“分区类型”和“目标系统类型”。对于近几年较新的电脑通常是UEFI启动选择“GPT”分区方案对于老式电脑Legacy BIOS则选择“MBR”。如果你不确定可以在Windows的磁盘管理里查看你的硬盘是“GUID分区表(GPT)”还是“主启动记录(MBR)”与之保持一致即可。点击开始采用“以DD镜像模式写入”的提示如果出现等待完成即可。注意制作启动盘会清空U盘所有数据请提前备份。完成后建议在BIOS/UEFI设置中临时关闭“安全启动(Secure Boot)”虽然新版Ubuntu对其支持已改善但关闭它能避免一些潜在的驱动加载问题。2.2 安装过程中的分区方案与关键配置将制作好的启动盘插入目标电脑重启并从U盘启动进入Ubuntu安装界面。选择“试用Ubuntu”可以先体验系统并测试硬件兼容性特别是Wi-Fi和显卡但我通常直接点击“安装Ubuntu”。安装类型是第一个容易让人犹豫的地方。对于全新安装或打算只使用Ubuntu单系统的用户最简单的是选择“清除整个磁盘并安装Ubuntu”安装程序会自动处理好一切。但对我们这些经常需要双系统共存或者对分区有特定要求比如为/home单独分区以便重装系统时不丢数据的开发者来说“其他选项”是必须掌握的技能。我以一块512GB的NVMe SSD为例演示一个经典的双系统分区方案假设已有一个Windows系统EFI系统分区如果是在UEFI模式下安装这个分区必须存在且首先创建。大小建议500MB-1GB逻辑分区空间起始位置用于“EFI系统分区”。这个分区是系统启动的引导所在。交换空间(swap)在物理内存小于16GB时交换空间很有用。大小通常设置为物理内存的1-2倍。例如16GB内存可设32GB。逻辑分区空间起始位置用于“交换空间”。根分区(/): 这是系统文件和安装软件的位置。我分配了100GB。主分区空间起始位置Ext4日志文件系统挂载点“/”。家目录(/home): 存放用户个人数据、配置文件、项目代码等。我分配了剩余的所有空间约370GB。逻辑分区空间起始位置Ext4日志文件系统挂载点“/home”。分区时务必小心确认你操作的是目标硬盘而不是存有重要数据的Windows盘。在“安装启动引导器的设备”处选择之前创建的EFI系统分区对应的设备如/dev/nvme0n1p1。这个设置错误会导致系统无法启动。其他设置如键盘布局、时区选上海、用户名密码按提示设置即可。安装完成后重启记得拔掉U盘。3. 驱动与CUDA安装版本兼容性是核心命门系统装好进入桌面后第一件事不是急着装CUDA而是处理显卡驱动。这里的顺序和版本选择直接决定了后续所有步骤的成败。3.1 NVIDIA驱动安装三种方法深度对比Ubuntu 20.04自带的开源驱动nouveau无法用于CUDA计算必须替换为官方的NVIDIA驱动。安装方法主要有三种方法一通过“软件和更新”附加驱动安装最推荐新手这是最省心的方法。打开“软件和更新”应用切换到“附加驱动”标签页。系统会自动检测你的显卡型号并列出可用的专有驱动版本。你会看到一系列带有“nvidia-driver-xxx”字样的选项。这里的选择有讲究带“server”或“open”字样的通常是用于数据中心或需要更高稳定性的版本对桌面特效支持可能一般。带“-driver”的数字版本如nvidia-driver-535这是最通用的桌面版驱动。推荐(proprietary, tested)系统标记为“推荐”的版本通常是经过Ubuntu团队测试的相对稳定的版本。对于大多数消费级显卡如RTX 4060 Ti, RTX 5060 Ti等直接选择那个标记为“推荐”的版本或者选择一个较新的、数字较大的稳定版如535、545然后点击“应用更改”。系统会自动下载并安装完成后必须重启。方法二使用APT仓库安装更灵活如果你想安装特定版本或更新到最新版可以添加官方PPA。sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ubuntu-drivers devices # 查看推荐驱动版本 sudo apt install nvidia-driver-535 # 安装指定版本如535安装后同样需要重启。使用nvidia-smi命令验证如果能看到显卡信息、驱动版本和CUDA版本注意这里显示的CUDA版本是驱动支持的最高CUDA版本并非已安装的CUDA运行时版本则说明驱动安装成功。方法三从NVIDIA官网下载.run文件安装最不推荐这种方法需要关闭图形界面在命令行下操作过程繁琐且容易与系统包管理冲突导致后续升级困难。除非有极特殊需求否则请优先使用前两种方法。实操心得驱动安装后最常见的两个问题。一是登录循环即输入密码后黑屏闪退回登录界面。这通常是因为驱动版本与内核或桌面环境不兼容。可以尝试在登录界面按CtrlAltF3切换到命令行登录后卸载当前驱动sudo apt purge nvidia*然后安装一个更旧或更新的推荐版本。二是“NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver”。这通常意味着驱动未正确加载。可以尝试sudo apt install linux-headers-$(uname -r)安装当前内核的头文件然后重新安装驱动。3.2 CUDA Toolkit安装谨防版本陷阱驱动搞定后就可以安装CUDA了。首先你需要根据你的深度学习框架PyTorch, TensorFlow的要求确定需要安装的CUDA版本。例如PyTorch 2.0 官方预编译版本通常需要CUDA 11.7或11.8。前往 NVIDIA CUDA Toolkit Archive 找到对应版本。以安装CUDA 11.8为例在官网选择Linux - x86_64 - Ubuntu - 20.04 - runfile(local)。你会得到一个类似cuda_11.8.0_520.61.05_linux.run的安装命令。但是请先别直接运行它这里有一个巨大的坑这个runfile会尝试安装它自带的NVIDIA驱动可能会覆盖或破坏你刚刚装好的、工作正常的驱动。为了避免这个问题我们需要在安装命令中加入--driver参数来跳过驱动安装。wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run --toolkit --silent --override或者在运行安装程序后在出现的交互界面中通过方向键和回车键取消勾选“Driver”选项只安装“CUDA Toolkit”。安装完成后需要将CUDA添加到环境变量。编辑~/.bashrc文件nano ~/.bashrc在文件末尾添加export PATH/usr/local/cuda-11.8/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}保存退出后执行source ~/.bashrc使配置生效。最后通过nvcc -V命令验证CUDA编译器是否安装成功。注意事项强烈建议使用runfile安装方式而非deb方式。deb方式虽然简单但它会将CUDA包纳入系统APT源未来在升级系统或某些软件时可能会引发意料之外的CUDA版本变更造成环境混乱。runfile是独立的管理起来更清晰。4. cuDNN与TensorRT安装深度学习加速库的部署4.1 cuDNN安装文件复制与验证cuDNN是深度神经网络加速库以压缩包形式提供。你需要先在NVIDIA官网注册账号并下载对应CUDA 11.8版本的cuDNN例如cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz。下载后解压并复制文件到CUDA目录。这个过程其实就是几个cp命令tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/ sudo chmod ar /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*为了验证安装可以编译运行一个简单的cuDNN样例代码或者更简单地在Python中尝试导入torch并检查torch.cuda.is_available()和torch.backends.cudnn.is_available()是否都为True。4.2 TensorRT安装解决依赖地狱TensorRT的安装复杂度上了一个台阶主要是因为其复杂的依赖关系。同样从NVIDIA官网下载对应CUDA 11.8和cuDNN 8.x的TensorRT版本例如TensorRT-8.6.3.2.Linux.x86_64-gnu.cuda-11.8.tar.gz。解压后我们需要将其库文件路径添加到环境变量并将Python wheel包安装到系统中。tar -xvf TensorRT-8.6.3.2.Linux.x86_64-gnu.cuda-11.8.tar.gz cd TensorRT-8.6.3.2 # 添加库路径到环境变量 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:pwd/lib # 安装Python wheel包根据你的Python版本选择 sudo pip3 install python/tensorrt-8.6.3.2-cp38-none-linux_x86_64.whl # 安装UFF转换工具如果需要用于转换TensorFlow模型和ONNX GraphSurgeon sudo pip3 install uff/uff-0.6.9-py2.py3-none-any.whl sudo pip3 install graphsurgeon/graphsurgeon-0.4.6-py2.py3-none-any.whl为了让环境变量永久生效同样需要将export LD_LIBRARY_PATH...这行添加到你的~/.bashrc中路径替换为你的TensorRT解压目录下的lib文件夹绝对路径。安装后在Python中运行import tensorrt不报错即表示安装成功。你可以运行samples目录下的示例来进一步验证功能。踩坑实录TensorRT安装最常见的问题是Python导入时报错提示缺少libnvinfer.so.8等库。这几乎都是因为LD_LIBRARY_PATH环境变量没有正确设置或者设置后没有生效比如在IDE中。务必确认1. 路径正确2. 在需要运行TensorRT的环境终端、IDE、服务中该环境变量已被正确加载。另一个坑是版本匹配TensorRT、CUDA、cuDNN、PyTorch/TensorFlow的版本必须形成一个兼容链任何一个环节版本不匹配都可能导致无法使用。5. 配套开发环境搭建从Python到IDE深度学习环境不止是CUDA栈一个顺手的开发环境同样重要。5.1 Python环境管理Anaconda与虚拟环境系统自带的Python3.8可能不符合项目要求。我强烈推荐使用Miniconda或Anaconda来管理Python环境。它不仅能方便地创建隔离的环境避免包冲突还能轻松安装一些通过pip编译困难的科学计算包。下载Miniconda的Linux安装脚本并安装wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装完成后关闭终端重新打开或执行source ~/.bashrc你会发现命令行前多了(base)字样。创建一个针对特定项目的环境conda create -n my_project python3.8 conda activate my_project在这个激活的环境里你可以用conda install或pip install来安装项目依赖完全不影响系统Python和其他项目环境。5.2 PyCharm专业版安装与CUDA配置对于Python开发JetBrains的PyCharm Professional是神器它支持远程开发、Docker集成和强大的调试功能。你可以从官网下载.tar.gz包解压使用或者使用snap安装社区版但专业版功能更全。解压安装后从终端启动PyCharm。在项目设置中关键步骤是配置Python解释器。打开File - Settings - Project: your_project - Python Interpreter。点击齿轮图标选择Add。在弹出的窗口中选择Conda Environment-Existing environment然后导航到你创建的Conda环境下的Python解释器路径通常是~/miniconda3/envs/my_project/bin/python。配置好解释器后PyCharm会自动识别该环境下的所有已安装包。当你运行涉及CUDA的代码时PyCharm就能正确调用到我们之前安装的CUDA环境了。5.3 其他必备工具安装Gitsudo apt install git然后配置用户名和邮箱。Docker按照Docker官方文档安装方便容器化部署。Node.js可以通过nvmNode Version Manager安装方便切换版本。6. 疑难杂症排查与性能优化6.1 常见问题与解决方案速查表问题现象可能原因排查与解决步骤nvidia-smi命令报错或找不到1. 驱动未安装。2. 驱动未加载。1. 用ubuntu-drivers devices查看并安装推荐驱动。2. 重启系统。3. 检查lsmodnvcc -V命令找不到1. CUDA未安装。2. 环境变量未配置。1. 确认CUDA runfile已安装且未报错。2. 检查~/.bashrc中PATH和LD_LIBRARY_PATH配置并执行source ~/.bashrc。PyTorch中torch.cuda.is_available()返回False1. PyTorch版本与CUDA版本不匹配。2. 环境变量问题。3. 驱动/CUDA安装失败。1. 去PyTorch官网用正确的命令重装如pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118。2. 在终端中python -c “import torch; print(torch.version.cuda)”查看PyTorch识别的CUDA版本。3. 确保在同一个终端环境中激活了正确的Conda环境。导入TensorRT时提示缺少.so文件LD_LIBRARY_PATH未包含TensorRT的lib路径。1. 确认~/.bashrc中已添加TensorRT的lib路径。2. 执行source ~/.bashrc。3. 在PyCharm等IDE中可能需要在运行配置里手动添加该环境变量。系统更新后CUDA不可用系统更新可能升级了内核导致NVIDIA驱动模块与新内核不兼容。1. 重启在GRUB菜单选择进入旧内核启动。2. 为新内核重新安装NVIDIA驱动sudo apt install --reinstall nvidia-driver-535。6.2 性能验证与基准测试环境搭好后跑个简单的基准测试来验证GPU是否正常工作且性能正常。在Python中import torch import time print(f“PyTorch版本: {torch.__version__}”) print(f“CUDA是否可用: {torch.cuda.is_available()}”) print(f“CUDA版本: {torch.version.cuda}”) print(f“当前设备: {torch.cuda.get_device_name(0)}”) # 做一个简单的矩阵运算速度测试 device torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’) x torch.randn(10000, 10000).to(device) y torch.randn(10000, 10000).to(device) start time.time() z torch.matmul(x, y) torch.cuda.synchronize() # 等待CUDA操作完成 end time.time() print(f“GPU矩阵乘法耗时: {end - start:.4f} 秒”)如果GPU计算耗时远小于CPU需要在CPU上运行对比说明环境配置成功且GPU正在参与计算。6.3 系统层面的优化建议禁用Nouveau驱动可选但推荐虽然安装了NVIDIA驱动后Nouveau通常会被屏蔽但彻底禁用它可以避免潜在冲突。创建文件/etc/modprobe.d/blacklist-nouveau.conf内容为blacklist nouveau options nouveau modeset0然后更新initramfssudo update-initramfs -u重启。固定内核版本高级对于追求极致稳定的生产环境可以考虑禁止自动更新内核防止驱动不兼容。使用sudo apt-mark hold linux-image-generic linux-headers-generic。使用CUDA兼容模式如果你安装了多个CUDA版本可以使用update-alternatives命令来管理系统默认的nvcc和cuda链接方便切换。整个环境搭建过程本质上是一个版本管理和依赖链梳理的过程。最关键的教训就是在开始之前务必根据你的深度学习框架PyTorch/TensorFlow的官方文档确定好CUDA、cuDNN、TensorRT乃至Python的版本匹配矩阵然后严格按照这个矩阵从上到下驱动-CUDA-cuDNN-TensorRT-框架进行安装。记录下每一步安装的具体版本号形成你自己的环境配置文档这在未来复现问题或迁移环境时将是无价之宝。