ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 20.04通过Deb包安装CUDA 12.x与cuDNN:避坑指南与最佳实践

Ubuntu 20.04通过Deb包安装CUDA 12.x与cuDNN:避坑指南与最佳实践 1. 项目缘起为什么选择Deb包安装CUDA在深度学习或者高性能计算领域NVIDIA的CUDA和cuDNN是绕不开的两座大山。很多刚入门的朋友包括一些有一定经验的开发者在Ubuntu这类Linux系统上配置环境时常常会一头扎进NVIDIA官网然后被各种.run安装器、网络安装包、版本依赖搞得晕头转向。尤其是当你按照某些教程使用.run文件安装CUDA时一个不小心就可能把系统自带的Nouveau驱动给冲了或者导致图形界面崩溃只能对着黑屏的命令行发呆。我自己就踩过这个坑。有一次为了赶项目进度在Ubuntu 20.04上直接用.run文件装CUDA 11结果安装程序“贴心”地帮我覆盖了系统驱动重启之后直接进了tty命令行图形界面消失得无影无踪。那次折腾了大半天才恢复过来。后来我发现对于Ubuntu这类基于Debian的系统使用官方提供的.deb包来安装CUDA才是更稳妥、更“系统友好”的方式。简单来说.deb包安装就像是通过系统的“应用商店”来安装软件。它会将CUDA的库、头文件、工具链等以符合Debian/Ubuntu软件包管理规范的方式部署到系统中并且能很好地处理与其他系统组件的依赖关系。而.run文件更像是一个“绿色安装包”它会把所有东西打包塞进你指定的目录通常是/usr/local/cuda-xx.x但有时会过于“霸道”容易引发冲突。所以这篇内容就是来分享如何在Ubuntu 20.04 LTS上通过.deb包这种更优雅的方式来安装CUDA 12.x和对应的cuDNN。这个方法逻辑清晰步骤明确对系统侵入性小即便是刚接触Linux的“宝宝”们跟着步骤一步步来也能顺利搭建起自己的深度学习环境。我们目标是一次成功远离黑屏。2. 安装前的核心准备工作理清概念与检查环境在动手之前我们必须把几个关键概念和系统状态搞清楚。这就像盖房子前要勘测地质一样能避免很多后续的麻烦。2.1 CUDA Toolkit、驱动与cuDNN的关系很多人容易混淆这几个概念我们先来理一理NVIDIA显卡驱动这是让你的操作系统能够识别和使用NVIDIA显卡的底层软件。没有它你的显卡就是一块高级砖头。我们常说的nvidia-smi命令就是由它提供的。CUDA Toolkit这是一个由NVIDIA提供的软件开发工具包。它包含了CUDA编译器nvcc用于编译你写的CUDA C/C代码。CUDA运行时库libcudart为CUDA程序提供运行时的支持。各种工具和库如性能分析器nvprof、调试器cuda-gdb以及数学库cuBLAS、cuFFT等。cuDNN全称CUDA Deep Neural Network library。这是一个专门为深度学习优化的GPU加速库。像TensorFlow、PyTorch这些框架它们的底层卷积、池化等操作很多都是调用cuDNN来实现的。cuDNN必须和特定版本的CUDA Toolkit配套使用。它们三者的关系可以简单理解为驱动是地基CUDA Toolkit是建筑工具和材料cuDNN是针对“深度学习”这个特定装修需求的豪华工具箱。你需要先打好地基装驱动然后准备好通用工具CUDA Toolkit最后再配置专用工具箱cuDNN。注意通过.deb包安装CUDA时通常会包含一个与该CUDA版本兼容的NVIDIA驱动。这意味着我们可能不需要单独安装驱动安装过程会一并处理。这是.deb安装的一大优势。2.2 系统环境检查清单在下载任何安装包之前请务必完成以下检查确认系统架构 打开终端输入uname -m对于大多数现代电脑输出应该是x86_64即64位系统。这是下载对应安装包的前提。检查当前NVIDIA驱动如果有 输入nvidia-smi如果系统已经安装了NVIDIA驱动这个命令会显示显卡信息、驱动版本和CUDA版本。这里显示的CUDA版本是驱动所能支持的最高CUDA版本不代表你已经安装了CUDA Toolkit。记下这个驱动版本号。如果命令报错Command ‘nvidia-smi’ not found说明没有安装专有驱动可能在使用开源驱动nouveau这没关系.deb安装包会处理。卸载可能存在的旧版本CUDA非必须但建议 如果你之前通过其他方式比如.run文件安装过CUDA为了干净起见可以尝试卸载。但.deb方式管理更规范冲突概率小。如果你不确定可以跳过此步让新安装过程去覆盖或升级。 如果是用.run文件安装的可以运行sudo /usr/local/cuda-xx.x/bin/cuda-uninstaller # 将xx.x替换为你的旧版本号或者直接删除目录sudo rm -rf /usr/local/cuda # 这是一个软链接 sudo rm -rf /usr/local/cuda-xx.x # 这是具体版本目录禁用开源Nouveau驱动关键步骤 这是避免安装过程中出现冲突或失败的重要一步。Ubuntu默认使用开源的Nouveau驱动来驱动NVIDIA显卡但它与NVIDIA官方驱动不兼容。创建配置文件sudo vim /etc/modprobe.d/blacklist-nouveau.conf如果不会用vim可以用sudo gedit /etc/modprobe.d/blacklist-nouveau.conf在文件中添加以下两行内容blacklist nouveau options nouveau modeset0保存并退出编辑器。更新内核initramfssudo update-initramfs -u重启系统。重启后Nouveau驱动将被禁用。你可以通过以下命令验证是否已禁用lsmod | grep nouveau如果没有输出任何内容说明禁用成功。完成以上准备工作我们的“地基”就算勘察和清理完毕了可以开始正式“施工”。3. 实战步骤一通过Deb包安装CUDA 12.x这里我们以CUDA 12.4为例请以NVIDIA官网最新稳定版为准演示完整的安装过程。3.1 从NVIDIA官网获取正确的Deb包安装指令不要盲目搜索下载链接最可靠的方式是直接从官网获取针对你系统的安装命令。访问 NVIDIA CUDA Toolkit 官网搜索 “CUDA Toolkit Archive” 可以找到历史版本页面选择12.x的最新版例如12.4。在选择界面按如下方式勾选Operating System: LinuxArchitecture: x86_64Distribution: UbuntuVersion: 20.04Installer Type: deb (network) “deb (network)” 指的是通过网络安装的deb包它会从NVIDIA仓库下载能更好地管理依赖。这是推荐的方式。官网会生成一个安装指南其中包含类似下面的命令块。请务必复制你在官网上看到的完整命令不要直接使用我下面例子中的版本号因为版本可能会更新。wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda-repo-ubuntu2004-12-4-local_12.4.0-550.54.14-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2004-12-4-local_12.4.0-550.54.14-1_amd64.deb sudo cp /var/cuda-repo-ubuntu2004-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda-toolkit-12-43.2 逐行执行安装命令并理解其含义现在我们打开终端逐条执行从官网复制的命令并了解每一步在做什么下载并设置软件包优先级Pin文件wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600wget下载一个名为cuda-ubuntu2004.pin的文件。这个文件的作用是告诉系统的APT包管理器“当从其他仓库也有CUDA相关包时优先使用NVIDIA官方仓库的版本”。这能防止系统自动更新时被其他源覆盖。sudo mv将这个pin文件移动到/etc/apt/preferences.d/目录下使其生效。下载并安装本地仓库包wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda-repo-ubuntu2004-12-4-local_12.4.0-550.54.14-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2004-12-4-local_12.4.0-550.54.14-1_amd64.deb第一行下载一个具体的.deb包。这个包不是CUDA Toolkit本身而是一个“本地仓库包”。安装它相当于在你的系统里添加了一个NVIDIA的软件源。第二行用dpkg -i安装这个仓库包。安装后你可以在/etc/apt/sources.list.d/目录下找到新增的源列表文件。导入密钥环sudo cp /var/cuda-repo-ubuntu2004-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/这一步将仓库的GPG密钥复制到系统密钥环目录用于验证从该仓库下载软件包的完整性和真实性避免安装被篡改的包。更新软件源并安装CUDA Toolkitsudo apt-get update sudo apt-get -y install cuda-toolkit-12-4sudo apt-get update更新本地软件包索引这将获取我们刚刚添加的NVIDIA仓库中的软件包信息。sudo apt-get -y install cuda-toolkit-12-4这是核心安装命令。-y参数表示自动回答“yes”确认安装。cuda-toolkit-12-4是一个元包它会自动拉取所有CUDA 12.4 Toolkit必需的组件包括兼容版本的NVIDIA驱动、编译器、运行时库等。这个过程会持续一段时间需要下载几百MB到上GB的数据具体取决于网络速度。安装过程中可能会提示你接受驱动相关的许可协议按提示操作即可。3.3 安装完成后的环境配置安装程序结束后CUDA已经被安装到了/usr/local/cuda-12.4版本号可能不同目录下。为了方便使用我们通常需要设置环境变量。编辑用户的环境变量配置文件vim ~/.bashrc或者gedit ~/.bashrc在文件的末尾添加以下几行# CUDA Toolkit export PATH/usr/local/cuda-12.4/bin${PATH::${PATH}} export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH::${LD_LIBRARY_PATH}}第一行将CUDA的二进制工具目录如nvcc添加到系统的PATH环境变量中。这样你才能在终端任何地方直接运行nvcc等命令。第二行将CUDA的库文件目录添加到LD_LIBRARY_PATH环境变量中。这样在运行程序时系统才能找到CUDA的动态链接库如libcudart.so。提示如果你未来可能安装多个CUDA版本这里有个小技巧。你可以不直接写死路径而是创建一个软链接sudo ln -sf /usr/local/cuda-12.4 /usr/local/cuda然后在.bashrc中设置PATH和LD_LIBRARY_PATH时指向/usr/local/cuda。这样当你需要切换版本时只需更改这个软链接指向的目录即可无需修改环境变量。使环境变量立即生效source ~/.bashrc4. 实战步骤二安装与CUDA 12.x匹配的cuDNNcuDNN的安装相对独立NVIDIA将其作为一个单独的库提供。你需要注册一个免费的NVIDIA开发者账号才能下载。4.1 下载正确版本的cuDNN Deb包访问 NVIDIA cuDNN 官网搜索 “cuDNN Archive”。登录你的NVIDIA开发者账号。在存档页面找到与你的CUDA 12.x版本对应的cuDNN版本。例如CUDA 12.x 通常对应 cuDNN 8.x 或 9.x 系列。务必确认版本兼容性官网会有明确说明如“For CUDA 12.x”。选择对应的版本后进入下载页面。你需要下载三个.deb包以Ubuntu 20.04 x86_64架构为例运行时库例如libcudnn8_8.x.x.x-1cuda12.x_amd64.deb开发者库例如libcudnn8-dev_8.x.x.x-1cuda12.x_amd64.deb文档和示例例如libcudnn8-samples_8.x.x.x-1cuda12.x_amd64.deb其中8.x.x.x是具体的cuDNN版本号12.x是对应的CUDA主版本号。4.2 按顺序安装cuDNN Deb包下载完成后在终端中进入存放deb包的目录按以下顺序安装# 安装运行时库 sudo dpkg -i libcudnn8_8.x.x.x-1cuda12.x_amd64.deb # 安装开发者库包含头文件等编译深度学习框架需要 sudo dpkg -i libcudnn8-dev_8.x.x.x-1cuda12.x_amd64.deb # 安装文档和示例可选用于验证 sudo dpkg -i libcudnn8-samples_8.x.x.x-1cuda12.x_amd64.deb安装过程很快因为这些包实际上是将文件解压到系统标准路径如/usr/include/,/usr/lib/x86_64-linux-gnu/并更新系统的库缓存。4.3 验证cuDNN安装安装完cuDNN后强烈建议运行其自带的示例程序来验证是否安装成功。拷贝cuDNN示例代码到你的家目录cp -r /usr/src/cudnn_samples_v8/ ~/进入一个示例目录例如测试卷积操作的目录cd ~/cudnn_samples_v8/mnistCUDNN编译示例程序sudo make clean sudo make如果编译过程中报错找不到FreeImage.h你需要安装libfreeimage3和libfreeimage-devsudo apt-get install libfreeimage3 libfreeimage-dev然后重新执行sudo make。运行编译好的示例./mnistCUDNN如果输出结果中看到Test passed!字样恭喜你cuDNN安装成功并且可以与CUDA协同工作。5. 安装后的全面验证与问题排查环境装好了但到底成不成功我们需要一套“组合拳”来验证。5.1 基础命令验证验证驱动和CUDA驱动APInvidia-smi这个命令应该能正常输出顶部会显示驱动版本和最高支持的CUDA版本例如CUDA Version: 12.4。这证明了驱动安装正确。验证CUDA编译器nvccnvcc --version这个命令会输出nvcc的版本信息它应该与你安装的CUDA Toolkit版本如12.4一致。这证明了CUDA开发环境配置正确。验证CUDA运行时库 我们可以写一个最简单的CUDA程序来测试。创建一个文件test_cuda.cu#include stdio.h #include cuda_runtime.h int main() { int deviceCount 0; cudaError_t error_id cudaGetDeviceCount(deviceCount); if (error_id ! cudaSuccess) { printf(cudaGetDeviceCount returned %d\n- %s\n, (int)error_id, cudaGetErrorString(error_id)); return 1; } if (deviceCount 0) { printf(No CUDA-capable devices found.\n); } else { printf(Found %d CUDA Capable device(s).\n, deviceCount); for (int dev 0; dev deviceCount; dev) { cudaDeviceProp deviceProp; cudaGetDeviceProperties(deviceProp, dev); printf(\nDevice %d: \%s\\n, dev, deviceProp.name); } } return 0; }编译并运行nvcc test_cuda.cu -o test_cuda ./test_cuda如果输出显示了你显卡的型号和数量那么恭喜CUDA运行时环境完全正常。5.2 常见问题与解决方案即使按照步骤操作也可能遇到一些问题。这里列举几个常见的问题1nvidia-smi命令正常但nvcc --version报错 “command not found”。原因环境变量PATH没有设置正确或者.bashrc修改后没有source。解决检查~/.bashrc文件中的PATH设置是否正确指向了/usr/local/cuda-12.4/bin。执行source ~/.bashrc。如果还不行尝试直接指定路径运行/usr/local/cuda-12.4/bin/nvcc --version。如果可以说明环境变量路径有误。问题2运行CUDA示例程序时报错 “error while loading shared libraries: libcudart.so.12.x: cannot open shared object file”。原因环境变量LD_LIBRARY_PATH没有设置或设置错误系统找不到CUDA的运行时库。解决检查~/.bashrc中的LD_LIBRARY_PATH是否包含/usr/local/cuda-12.4/lib64。执行source ~/.bashrc。也可以临时设置export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH然后再运行程序。问题3在安装CUDA deb包过程中sudo apt-get install cuda报错提示依赖问题。原因可能是之前的NVIDIA驱动残留、系统包索引过时或其他软件源冲突。解决首先尝试修复依赖sudo apt-get install -f。更新系统sudo apt-get update sudo apt-get upgrade。如果问题依旧可以尝试彻底清除之前的NVIDIA相关包谨慎操作sudo apt-get purge *nvidia* *cuda* *cudnn* sudo apt-get autoremove重新执行从官网获取的完整安装命令序列。问题4cuDNN示例编译失败提示找不到cudnn.h或libcudnn.so。原因cuDNN的开发包libcudnn8-dev没有安装成功或者安装后头文件和库的路径不在系统默认搜索路径中。解决确认libcudnn8-dev包已正确安装dpkg -l | grep cudnn。检查头文件是否存在ls /usr/include/cudnn*或ls /usr/include/cudnn.h。检查库文件是否存在ls /usr/lib/x86_64-linux-gnu/libcudnn*。如果路径不对可能是安装到了非标准路径。可以尝试手动创建软链接或者修改示例代码的Makefile中的包含路径和链接库路径。6. 进阶配置与管理多版本CUDA与虚拟环境对于深度学习开发者经常需要在不同项目间切换CUDA版本。.deb安装方式虽然规范但默认会安装到系统路径。如何优雅地管理多个版本6.1 利用软链接实现系统级CUDA版本切换如前文提示我们可以利用/usr/local/cuda这个软链接来指向当前活跃的CUDA版本。假设你已经通过.deb方式安装了CUDA 11.8和CUDA 12.4它们分别位于/usr/local/cuda-11.8和/usr/local/cuda-12.4。当你需要切换到CUDA 12.4时执行sudo rm -f /usr/local/cuda # 删除旧软链接 sudo ln -s /usr/local/cuda-12.4 /usr/local/cuda # 创建新软链接指向12.4更新环境变量如果你的.bashrc里设置的是/usr/local/cudasource ~/.bashrc验证版本nvcc --version现在输出的应该是12.4。这种方法简单直接但属于系统级切换会影响所有用户和所有终端会话。6.2 更推荐的方式在Conda虚拟环境中管理CUDA对于Python深度学习项目更专业和推荐的做法是使用Conda虚拟环境。Conda不仅可以管理Python包还可以管理CUDA和cuDNN的版本真正做到环境隔离。安装Miniconda或Anaconda。为特定项目创建虚拟环境并指定CUDA版本# 创建一个名为 pytorch_12.4 的环境并指定python版本 conda create -n pytorch_12.4 python3.9 conda activate pytorch_12.4在虚拟环境中安装PyTorch或TensorFlow 在PyTorch官网使用Conda命令安装时会自动帮你解决对应版本的CUDA依赖。例如安装支持CUDA 12.1的PyTorchconda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia这个命令会在当前的conda环境里安装PyTorch以及与之匹配的CUDA 12.1工具包这是一个精简版的CUDA只包含运行PyTorch必需的运行时库不会影响系统全局的CUDA。此时在这个环境里import torch; torch.cuda.is_available()会返回True并且使用的是conda环境内的CUDA 12.1与你系统里安装的CUDA 12.4互不干扰。我个人在实际工作中几乎为每一个主要项目都会创建一个独立的Conda环境并在里面通过框架的安装命令来间接管理CUDA依赖。这样项目A用PyTorch 1.13 CUDA 11.7项目B用TensorFlow 2.10 CUDA 12.0可以在一台机器上完美共存切换环境即可完全不需要去动系统级的CUDA。这是目前最清晰、最安全的深度学习环境管理方案。
返回列表