尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu 20.04深度学习环境搭建:CUDA、cuDNN、TensorRT完整部署指南

Ubuntu 20.04深度学习环境搭建:CUDA、cuDNN、TensorRT完整部署指南 1. 项目概述与核心痛点最近在给一台新机器部署深度学习开发环境从裸机到能跑起一个YOLO模型整个过程踩的坑比我预想的要多得多。核心任务很明确在Ubuntu 20.04 LTS系统上完整安装NVIDIA的CUDA、cuDNN和TensorRT为后续的模型训练和推理部署铺平道路。这听起来像是AI开发者的“标准操作流程”但实际操作中从系统安装的引导分区到驱动、CUDA版本的选择再到TensorRT与Python环境的兼容性每一步都可能遇到意想不到的阻碍。我选择Ubuntu 20.04主要是考虑到其长期支持LTS带来的稳定性以及其与主流深度学习框架和库之间经过充分验证的兼容性这对于一个需要长期运行、避免频繁折腾的生产或开发环境至关重要。然而这个“稳定”的选择在安装初期就给了我一个下马威。无论是使用U盘安装时遇到的引导问题还是在安装NVIDIA驱动时与系统自带nouveau驱动的冲突都让我重新审视“开箱即用”这个词在Linux世界的含义。更不用说后续CUDA、cuDNN、TensorRT这一套组合拳版本之间的严格依赖关系就像一套精密的锁具一步错可能导致步步错最终出现各种诡异的编译错误或运行时崩溃。这篇文章就是把我这一路趟过的雷、填过的坑以及最终验证可行的解决方案系统地梳理出来。目标不是提供一个“万能脚本”而是让你理解每个步骤背后的逻辑知道为什么这么做以及当问题出现时该如何思考和排查。2. 系统安装从U盘到桌面的第一个门槛很多人觉得操作系统安装是小事一桩但对于Ubuntu 20.04尤其是在一些较新的硬件上直接从官网下载镜像制作启动盘安装可能会遇到第一个“拦路虎”引导问题。2.1 制作启动盘与引导模式的选择我使用的是Rufus在Windows下来制作启动U盘。这里有一个关键选择分区类型和目标系统类型。如果你的机器是比较新的UEFI主板那么必须选择“GPT”分区方案用于UEFI。如果选择了旧的MBR方案很可能在安装时找不到引导设备或者安装后无法启动。Rufus通常会智能识别但手动确认一下更稳妥。另一个细节是镜像写入方式选择“DD镜像模式”还是“ISO镜像模式”。通常如果遇到问题可以尝试换一种模式重新制作启动盘。我个人的经验是对于大多数现代机器“ISO镜像模式”兼容性更好。注意在BIOS/UEFI设置中需要关闭“安全启动”Secure Boot。虽然Ubuntu 20.04支持安全启动但后续安装NVIDIA私有驱动时可能会因为签名问题导致驱动无法加载为了减少麻烦建议先关闭。2.2 安装过程中的分区“陷阱”安装类型选择“清除整个磁盘并安装Ubuntu”是最省心的但对于有双系统需求或想手动控制分区的情况就需要小心了。一个经典的坑是EFI系统分区ESP。在UEFI模式下这个分区是必须的用于存放引导加载器。它的建议大小是512MB到1GB文件系统格式必须是FAT32。我遇到过因为ESP分区空间不足比如只有100MB在系统更新内核后导致引导失败的情况。所以即使你手动分区也请给ESP分配至少512MB空间。另一个常见问题是挂载点/根目录的空间分配。如果你打算在这台机器上进行深度学习开发动辄几十GB的模型数据集和Python环境是很常见的。千万不要只分给根目录30-50GB否则用不了多久就会面临磁盘空间告急的窘境。我的建议是如果是一块单独的硬盘给Ubuntu可以这样规划EFI系统分区1GBFAT32。交换空间swap物理内存大小的1到2倍例如32GB或64GB。对于深度学习大内存模型训练时足够的交换空间可以防止因内存不足OOM导致的进程突然被杀掉。根目录/100-200GBext4。用于安装系统和软件。家目录/home剩余所有空间ext4。你的代码、数据集、模型、个人配置都在这里这是最需要大空间的地方。2.3 安装后首次启动与基础配置安装完成重启后如果一切顺利你会进入登录界面。但有时你会遇到黑屏或卡在某个Logo界面。这很可能是因为集成显卡和独立显卡的显示输出问题。一个临时的解决办法是在GRUB引导菜单开机时按Shift或Esc键进入处按e键编辑启动参数在linux开头的那一行找到quiet splash在其后面添加nomodeset。然后按F10启动。这样会禁用内核级显卡模式设置通常可以让你进入系统。进入系统后我们要做的第一件事就是安装正确的显卡驱动这才是根本解决之道。进入系统后建议立即更新软件源并升级现有软件包这能修复一些初始安装的已知问题。打开终端执行sudo apt update sudo apt upgrade -y同时安装一些后续肯定会用到的编译工具和基础库sudo apt install -y build-essential cmake git vim wget curlbuild-essential包含了gcc,g,make等是编译任何软件的基础。3. NVIDIA驱动安装告别开源nouveau驱动这是搭建CUDA环境的第一步也是最容易出问题的一步。Ubuntu默认使用开源的nouveau驱动来驱动NVIDIA显卡但它性能低下且与官方的NVIDIA私有驱动冲突。我们必须先禁用nouveau再安装官方驱动。3.1 彻底禁用nouveau驱动打开黑名单配置文件sudo vim /etc/modprobe.d/blacklist-nouveau.conf如果不会用vim可以用sudo gedit或其他编辑器。在文件中添加以下两行blacklist nouveau options nouveau modeset0保存文件后更新initramfs初始内存文件系统sudo update-initramfs -u重启电脑。重启后验证nouveau是否已被禁用。执行lsmod | grep nouveau如果没有任何输出说明禁用成功。如果还有输出请检查上述步骤并确认重启已生效。3.2 选择合适的驱动安装方式安装NVIDIA驱动主要有三种方法各有利弊方法一通过Ubuntu附加驱动GUI最简单但版本可能旧在“软件和更新” - “附加驱动”选项卡中系统会扫描可用的NVIDIA驱动。选择一个带有“专有”和“已测试”标签的版本点击应用更改。这种方法最省心适合不想折腾的用户。缺点是驱动版本通常不是最新的可能无法完美支持你显卡的所有特性或最新的CUDA版本。方法二使用apt从官方仓库安装推荐Ubuntu的官方仓库包含了较新的NVIDIA驱动。首先添加显卡驱动PPA仓库这里以ppa:graphics-drivers/ppa为例它通常有较新的驱动sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update然后查找可用的驱动版本apt search nvidia-driver你会看到一系列如nvidia-driver-550、nvidia-driver-535等包。你需要根据你计划安装的CUDA版本来选择驱动版本。NVIDIA官网有一个“CUDA Toolkit与驱动版本对应关系”的表格。例如CUDA 12.x通常需要驱动版本525以上。选定后比如nvidia-driver-550执行安装sudo apt install -y nvidia-driver-550安装完成后必须重启。方法三从NVIDIA官网下载.run文件安装最灵活但最复杂前往NVIDIA官网下载对应显卡和系统版本的驱动安装包一个.run文件。这种方法可以安装绝对最新的驱动但需要完全在命令行界面如按CtrlAltF3进入tty3下操作且需要提前关闭图形界面sudo systemctl stop gdm或lightdm安装过程中还可能涉及与现有驱动、DKMS动态内核模块支持的交互对新手不友好。除非有特定需求否则不建议新手使用。实操心得我强烈推荐方法二。它在易用性和版本新旧之间取得了很好的平衡。通过PPA安装的驱动在后续系统内核更新时会自动通过DKMS重新编译驱动模块省去了手动维护的麻烦。而方法三的.run安装方式每次内核升级后都可能需要重新安装驱动。3.3 验证驱动安装成功重启后打开终端执行以下命令验证nvidia-smi这是最重要的命令。它会显示你的GPU信息、驱动版本、CUDA版本这里显示的是驱动支持的最高CUDA版本并非已安装的CUDA Toolkit版本。如果这个命令能正常运行并输出显卡信息恭喜你驱动安装成功了。prime-select query如果你使用的是笔记本双显卡NVIDIA Intel集成显卡这个命令可以查看当前正在使用的显卡。输出nvidia表示正在使用独立显卡。4. CUDA Toolkit安装核心计算平台的搭建CUDA Toolkit是NVIDIA提供的用于GPU加速计算的软件开发平台。这里最容易混淆的概念是nvidia-smi显示的CUDA版本是驱动支持的CUDA最高版本而我们接下来要安装的CUDA Toolkit是具体的开发工具包版本。前者必须大于等于后者。4.1 版本选择与下载首先去NVIDIA官网查看CUDA Toolkit的版本矩阵确定与你的深度学习框架如TensorFlow, PyTorch兼容的版本。例如PyTorch 2.0 对CUDA 11.7和11.8支持较好而一些更新的特性可能需要CUDA 12.x。确定好CUDA版本后再回头确认你的驱动是否支持它参考nvidia-smi输出。假设我们选择CUDA 11.8。访问NVIDIA CUDA Toolkit Archive页面找到CUDA 11.8.0的下载链接。选择目标平台Linux - x86_64 - Ubuntu - 20.04 - runfile (local)。你会得到一个类似cuda_11.8.0_520.61.05_linux.run的文件。使用wget命令下载它。注意为什么不选择网络安装network或deb安装runfile安装方式更为纯净和灵活。它允许你选择不安装驱动我们之前已经装好了只安装CUDA Toolkit避免驱动冲突。这也是官方文档推荐的方式。4.2 使用runfile安装CUDA给下载的runfile文件添加执行权限chmod x cuda_11.8.0_520.61.05_linux.run运行安装程序并加上--override标志以确保安装顺利sudo ./cuda_11.8.0_520.61.05_linux.run --override--override参数在某些情况下可以覆盖一些校验错误非常有用。进入安装界面后有一处需要特别小心首先会显示一份许可协议按空格键翻页输入accept同意。接下来是关键步骤安装选项。你会看到类似以下的列表[ ] Driver [*] CUDA Toolkit 11.8 [ ] CUDA Samples 11.8 [ ] CUDA Documentation 11.8务必用方向键将Driver前面的[X]取消掉变成[ ]因为我们已经在第三步安装了驱动这里再安装一次很可能导致冲突甚至系统无法启动。确保只选中CUDA Toolkit通常也包含必要的库和工具。继续安装过程选择安装路径默认是/usr/local/cuda-11.8保持默认即可。安装完成后会提示你配置环境变量。4.3 配置环境变量安装程序不会自动帮你设置环境变量需要手动添加。编辑你的shell配置文件通常是~/.bashrc如果你用zsh则是~/.zshrcvim ~/.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}} export CUDA_HOME/usr/local/cuda-11.8保存后使配置立即生效source ~/.bashrc4.4 验证CUDA安装检查CUDA编译器nvcc版本这应该与你安装的Toolkit版本一致nvcc --version如果显示command not found请检查环境变量PATH是否设置正确。编译并运行CUDA Samples中的设备查询示例这是最可靠的验证方式cd /usr/local/cuda-11.8/samples/1_Utilities/deviceQuery sudo make ./deviceQuery如果最后输出Result PASS说明CUDA安装和配置完全成功GPU可以被正常识别和访问。5. cuDNN安装深度神经网络加速库cuDNN是NVIDIA深度神经网络加速库针对卷积、池化等层进行了高度优化。它不是一个独立的运行时而是需要与CUDA配合使用的库文件。5.1 下载与版本匹配cuDNN的版本必须与已安装的CUDA版本严格匹配。前往NVIDIA cuDNN官网需要注册账号在下载页面选择与你CUDA版本对应的cuDNN。例如对于CUDA 11.x你可以选择cuDNN 8.x版本。下载时选择“Local Installer for Linux x86_64 (Tar)”这种压缩包格式管理起来最方便。假设你下载的文件是cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz。5.2 安装cuDNN实为文件拷贝cuDNN的安装其实就是将头文件、库文件拷贝到CUDA的安装目录中。解压下载的压缩包tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz进入解压后的目录拷贝文件到CUDA目录。请务必使用sudo并注意命令结尾的.和*cd cudnn-linux-x86_64-8.9.7.29_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 ar /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*5.3 验证cuDNN安装验证cuDNN没有像CUDA那样直接的可执行文件但可以通过检查库文件版本或使用一个简单的Python脚本来验证。检查库文件版本方法可能随版本变化cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2如果文件不存在可以尝试查找cudnn.h。这个命令会输出cuDNN的主版本、次版本和补丁版本号。更可靠的验证是使用Python假设你已安装Python和TensorFlow/PyTorchimport tensorflow as tf print(tf.config.list_physical_devices(GPU)) # 或者 import torch print(torch.cuda.is_available()) print(torch.backends.cudnn.version())如果torch.backends.cudnn.version()能正确打印出版本号如8907对应8.9.7说明cuDNN已被PyTorch正确识别。6. TensorRT安装高性能推理SDK的部署TensorRT是NVIDIA的高性能深度学习推理优化器和运行时。它可以将训练好的模型如ONNX, TensorFlow, PyTorch进行优化、校准INT8量化并部署到NVIDIA GPU上显著提升推理速度。它的安装相对复杂因为涉及多个.deb包和Python wheel包。6.1 下载与版本选择前往NVIDIA TensorRT下载页面同样需要登录。TensorRT的版本也需要与CUDA版本匹配。例如TensorRT 8.x GA 通常对应 CUDA 11.x。选择“Tar File Install Packages For Linux x86_64 and CUDA 11.x”这种tar包它包含了所有需要的组件。下载的文件类似TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz。注意其中的cuda-11.8字样这明确指明了其所需的CUDA环境。6.2 安装TensorRT核心库解压tar包到指定目录例如/optsudo tar -xzf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz -C /opt这会在/opt下生成一个TensorRT-8.6.1.6的目录。将TensorRT的库路径添加到系统库加载路径中。编辑/etc/ld.so.conf.d/tensorrt.conf文件可能需要新建sudo vim /etc/ld.so.conf.d/tensorrt.conf在文件中添加一行/opt/TensorRT-8.6.1.6/lib保存后运行sudo ldconfig更新动态链接库缓存。为了方便使用将TensorRT的路径也添加到你的bashrc中export LD_LIBRARY_PATH/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH export TENSORRT_PATH/opt/TensorRT-8.6.1.6同样执行source ~/.bashrc使其生效。6.3 安装Python Wheel包TensorRT提供了Python API需要通过pip安装对应的wheel包。进入解压目录下的python文件夹根据你的Python版本和系统选择对应的wheel文件。例如对于Python 3.8cd /opt/TensorRT-8.6.1.6/python pip install tensorrt-8.6.1-cp38-none-linux_x86_64.whl如果你使用虚拟环境如conda或venv请确保在对应的环境中执行此命令。此外如果需要用到ONNX GraphSurgeon或ONNX Runtime的TensorRT支持还需要安装graphsurgeon和onnx_graphsurgeon的wheel包在graphsurgeon和onnx_graphsurgeon子目录下pip install graphsurgeon-0.4.6-py2.py3-none-any.whl pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl6.4 验证TensorRT安装在Python中验证import tensorrt as trt print(trt.__version__)如果能成功打印出版本号如8.6.1说明Python API安装成功。运行一个示例程序。TensorRT解压包中带有丰富的samples。例如进入samples/sampleMNIST目录按照README编译并运行可以测试最基本的TensorRT工作流是否通畅。cd /opt/TensorRT-8.6.1.6/samples/sampleMNIST make ./sample_mnist如果程序能成功运行并输出推理结果说明TensorRT的C运行时环境也配置正确。7. 环境集成与框架配置至此NVIDIA的三大件驱动、CUDA、cuDNN和推理优化器TensorRT都已安装完毕。但要让深度学习框架如PyTorch, TensorFlow真正利用起它们还需要正确的框架安装。7.1 PyTorch安装与CUDA匹配访问PyTorch官网使用其提供的安装命令生成器。关键点在于选择与你的CUDA版本匹配的PyTorch版本。例如你安装了CUDA 11.8那么就应该选择CUDA 11.8对应的安装命令。对于pip安装命令可能类似于pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118注意这里的cu118就代表CUDA 11.8。安装完成后在Python中验证import torch print(torch.__version__) # 查看PyTorch版本 print(torch.cuda.is_available()) # 应为True print(torch.cuda.get_device_name(0)) # 显示你的GPU型号 print(torch.backends.cudnn.version()) # 显示cuDNN版本如果torch.cuda.is_available()返回True并且能正确识别GPU和cuDNN那么PyTorch的GPU环境就配置成功了。7.2 TensorFlow 2.x安装TensorFlow对CUDA和cuDNN的版本要求更为严格。你需要查阅TensorFlow官网的“Tested build configurations”页面找到与你TF版本匹配的CUDA和cuDNN版本。例如TF 2.13可能要求CUDA 11.8和cuDNN 8.6。安装命令通常很简单pip install tensorflow但为了确保安装支持GPU的版本可以使用pip install tensorflow[and-cuda]或者直接安装tensorflow-gpu旧版方式新版已合并。验证方式import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices(GPU))如果GPU列表不为空则成功。7.3 虚拟环境管理的重要性强烈建议使用conda或venv来管理Python环境。深度学习项目依赖复杂不同项目可能要求不同版本的框架甚至CUDA。使用虚拟环境可以完美隔离这些依赖。例如使用conda创建一个新环境并安装PyTorchconda create -n my_torch_env python3.8 conda activate my_torch_env # 然后在此环境中安装上述的PyTorch这样你可以在另一个环境中安装TensorFlow或其他版本的PyTorch而互不干扰。8. 常见问题排查与解决方案实录即使按照步骤操作也难免会遇到问题。下面是我在多次安装中遇到的典型问题及其解决方法。8.1 驱动安装失败或启动黑屏症状安装NVIDIA驱动后重启系统黑屏无法进入图形界面。原因最常见的是驱动版本与内核版本不兼容或者与nouveau驱动冲突未彻底解决。解决方案重启进入恢复模式或高级选项选择“root”进入命令行。彻底卸载现有NVIDIA驱动sudo apt purge *nvidia* sudo apt autoremove重新安装驱动但尝试一个更旧的、可能更稳定的版本如从550退回到535。如果仍不行在GRUB引导时添加nomodeset参数进入系统然后尝试使用Ubuntu附加驱动中的版本。8.2nvidia-smi命令找不到或报错症状command not found: nvidia-smi或NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver。原因驱动未正确安装或加载。解决方案检查驱动是否安装dpkg -l | grep nvidia-driver。检查内核模块是否加载lsmod | grep nvidia。如果没有输出尝试手动加载sudo modprobe nvidia。如果报错查看内核日志dmesg | grep nvidia通常会有更详细的错误信息。可能是安全启动Secure Boot阻止了未签名的驱动加载。进入BIOS/UEFI设置关闭安全启动或者为驱动创建密钥并签名过程较复杂。8.3 CUDA版本混乱与nvcc不匹配症状nvidia-smi显示的CUDA版本如12.4与nvcc --version显示的如11.8不一致。或者nvcc命令找不到。原因nvidia-smi显示的是驱动支持的最高CUDA版本nvcc显示的是你实际安装的CUDA Toolkit版本。只要Toolkit版本不高于驱动支持的版本即可。nvcc找不到是PATH环境变量未设置正确。解决方案版本不一致是正常现象无需处理只要Toolkit版本 驱动支持版本即可。对于nvcc找不到检查~/.bashrc中的PATH是否包含了/usr/local/cuda-11.8/bin并确认已source ~/.bashrc。可以使用which nvcc查看命令路径。8.4 PyTorch/TensorFlow找不到GPU症状torch.cuda.is_available()返回False或TensorFlow不显示GPU设备。原因PyTorch/TensorFlow的CUDA版本与系统安装的CUDA Toolkit版本不匹配。虚拟环境中未安装GPU版本的框架例如用pip默认安装了CPU版本。环境变量LD_LIBRARY_PATH未正确设置导致框架找不到CUDA/cuDNN库。解决方案用conda list | grep cudatoolkit或pip show torch检查框架内置的CUDA版本。必须与系统nvcc版本兼容。使用框架官网提供的、明确指定CUDA版本的安装命令重新安装。确保LD_LIBRARY_PATH包含了CUDA和cuDNN的库路径。可以在Python中临时测试import os; os.environ[‘LD_LIBRARY_PATH‘] ‘/usr/local/cuda-11.8/lib64:‘ os.environ.get(‘LD_LIBRARY_PATH‘, ‘‘)然后再import torch/tensorflow看是否生效。8.5 编译TensorRT示例时找不到库症状在编译TensorRT的samples时报错找不到libnvinfer.so,libnvonnxparser.so等。原因系统未找到TensorRT的库文件。解决方案确认已正确执行sudo ldconfig并更新了LD_LIBRARY_PATH。检查/etc/ld.so.conf.d/目录下是否有tensorrt.conf文件且内容指向正确的TensorRTlib目录。可以手动在编译命令中指定库路径例如g ... -L/opt/TensorRT-8.6.1.6/lib -lnvinfer ...。8.6 磁盘空间不足症状安装过程中或后续使用中报“No space left on device”。原因根目录/分区空间分配过小。解决方案使用df -h命令查看各分区使用情况。如果/home空间充足可以将一些大型目录如/usr/local/cuda-11.8本身不推荐移动但可以将其下的doc、samples等非必要目录软链接到/home下迁移过去。长期解决方案是重新规划分区。对于新装系统务必给根目录分配足够空间建议100GB以上。对于已安装的系统可以使用GParted等工具在Live USB环境下调整分区大小但此操作有风险务必先备份重要数据。整个环境搭建过程本质上是一个解决依赖和兼容性问题的过程。我的核心建议是记录每一个步骤和选择的版本。当出现问题回溯时清晰的记录能帮你快速定位。对于生产环境考虑使用Docker容器来封装整个开发环境将复杂的本地依赖问题转化为镜像构建问题可以极大提高环境的一致性和可复现性。
返回列表