ARTICLE DETAIL

资讯详情

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

Ubuntu下CUDA 12.0与cuDNN安装配置完整指南

Ubuntu下CUDA 12.0与cuDNN安装配置完整指南 1. 为什么CUDA 12.0的安装值得单独写一篇如果你最近配过深度学习环境大概率经历过这样的场景显卡驱动装好了nvidia-smi也能正常输出结果一跑 PyTorch 就报CUDA driver version is insufficient for CUDA runtime version或者libcudnn.so.8: cannot open shared object file。这类报错十有八九不是显卡坏了而是 CUDA Toolkit 和 cuDNN 的版本没对齐。CUDA 12.0 是一个比较特殊的分水岭版本。它把很多底层的东西改了比如默认的编译器要求、驱动最低版本、以及 cuDNN 从 8.x 开始的重构。网上大量教程还停留在 CUDA 10.2 / 11.x 时代直接照抄很容易踩坑。这篇内容就是把我自己在 Ubuntu 上反复装 CUDA 12.0 cuDNN 的完整过程整理出来包括版本怎么选、驱动怎么对、环境变量怎么写、装完怎么验证以及那些教程里不会告诉你的坑。适合谁看刚拿到新机器要配深度学习环境的同学、需要在同一台机器上管理多个 CUDA 版本的开发者、以及被nvcc和nvidia-smi版本不一致折磨过的人。下面所有操作我都实测过命令可以直接抄。2. 装之前必须搞清楚的版本对应关系2.1 CUDA 12.0 对驱动的最低要求很多人装 CUDA 失败第一步就错在没看驱动版本。CUDA Toolkit 每个大版本都有一个最低驱动要求低于这个版本装上了也跑不起来。CUDA 12.0 要求 Linux 下的驱动版本不低于525.60.13。你可以先用一条命令确认nvidia-smi输出右上角会显示Driver Version: 5xx.xx。如果低于 525别急着装 CUDA先把驱动升级了。这里有个反直觉的点驱动是向下兼容的但 CUDA Toolkit 不是向上兼容的。也就是说高版本驱动可以跑低版本 CUDA但低版本驱动跑不了高版本 CUDA。所以驱动尽量装新一点能省掉很多麻烦。2.2 CUDA 12.0 和 cuDNN 的匹配表cuDNN 是 NVIDIA 的深度神经网络加速库它必须和 CUDA 版本严格对应。cuDNN 8.x 系列是配合 CUDA 11.x 和 12.x 的但具体小版本有讲究。下面是我整理的一张对照表覆盖了 CUDA 12.0 常用的几个 cuDNN 版本CUDA 版本推荐 cuDNN 版本适用框架举例CUDA 12.0cuDNN 8.7.x / 8.8.xPyTorch 2.0、TensorFlow 2.12CUDA 12.1cuDNN 8.9.xPyTorch 2.1CUDA 12.2cuDNN 8.9.x较新框架CUDA 11.8cuDNN 8.6.x / 8.7.xPyTorch 1.13、2.0选 cuDNN 的时候优先看你要用的深度学习框架官方推荐哪个版本而不是盲目追新。比如 PyTorch 官网的安装命令里会写cu121或cu118那个就是它编译时用的 CUDA 版本你本地环境最好对齐。2.3 一个容易被忽略的细节nvcc和nvidia-smi显示的版本为什么不一样这是新手最常问的问题。nvidia-smi显示的是驱动支持的最高 CUDA 版本而nvcc --version显示的是你实际安装的 CUDA Toolkit 版本。两者不一致是正常的只要 Toolkit 版本不高于驱动支持的上限就行。举个例子驱动显示CUDA Version: 12.4你装的是 CUDA 12.0nvcc显示 12.0这完全没问题。但如果驱动显示 11.7你装 CUDA 12.0那就跑不起来。3. Ubuntu 下安装 CUDA 12.0 的完整流程3.1 先确认系统版本和显卡型号我用的环境是 Ubuntu 20.04 和 22.04两个都测过。先确认几件事# 查看系统版本 lsb_release -a # 查看显卡型号 lspci | grep -i nvidia # 确认驱动已装 nvidia-smi如果nvidia-smi报command not found说明驱动没装。Ubuntu 下装驱动最省事的方式是用系统自带的sudo ubuntu-drivers autoinstall装完重启再跑nvidia-smi确认。注意不要用 NVIDIA 官网的 .run 文件装驱动除非你有特殊需求因为 .run 文件容易和系统的包管理冲突后面装 CUDA 时各种依赖问题会让你怀疑人生。3.2 用 runfile 还是 deb 包我选 runfile 的理由CUDA 12.0 官方提供两种安装方式deb 包和 runfile。两种我都用过最后长期用的是 runfile原因有三个第一deb 包会自动帮你装驱动有时候会把你已经装好的驱动覆盖掉导致版本混乱。第二runfile 安装时可以取消勾选驱动安装只装 Toolkit控制更精细。第三runfile 卸载干净sudo /usr/local/cuda-12.0/bin/cuda-uninstaller一条命令搞定deb 包卸载要处理一堆依赖。当然 deb 包也有优势就是省事适合不想折腾的人。下面我以 runfile 为主讲deb 方式在最后附上命令。3.3 下载和安装 CUDA 12.0 runfile先去 NVIDIA 的 CUDA Toolkit 归档页面找到 12.0 的版本。选 Linux - x86_64 - Ubuntu - 20.04 - runfile (local)。下载下来的文件名类似cuda_12.0.0_525.60.13_linux.run。下载完成后先装编译依赖sudo apt-get update sudo apt-get install -y gcc g make然后执行安装。关键点来了安装过程中会问你是否安装驱动如果你已经装好了驱动一定要选no否则它会尝试装一个 525 版本的驱动可能和你现有的冲突。sudo sh cuda_12.0.0_525.60.13_linux.run安装过程中的选项Do you accept the EULA? - accept Install NVIDIA Accelerated Graphics Driver? - no # 已装驱动就选no Install the CUDA 12.0 Toolkit? - yes Enter Toolkit Location - 直接回车默认 /usr/local/cuda-12.0 Install CUDA Samples? - no # 用不到省空间装完之后/usr/local/下会多出一个cuda-12.0目录同时有一个软链接cuda指向它。3.4 环境变量配置PATH 和 LD_LIBRARY_PATH 都要写这一步是重灾区。很多人装完 CUDA 后nvcc --version报找不到命令就是环境变量没配。打开你的 shell 配置文件。如果是 bashvim ~/.bashrc在文件末尾加上export PATH/usr/local/cuda-12.0/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.0/lib64:$LD_LIBRARY_PATH如果你用的是 zsh改~/.zshrc内容一样。改完执行source ~/.bashrc然后验证nvcc --version正常应该输出Cuda compilation tools, release 12.0, V12.0.xx。注意LD_LIBRARY_PATH一定要加否则后面跑程序时会报找不到libcudart.so。这个坑我踩过不止一次尤其是用 conda 环境的时候conda 会覆盖这个变量需要额外处理。3.5 多版本 CUDA 共存的软链接管理法如果你机器上已经有 CUDA 11.8现在又要装 12.0不要慌两者可以共存。安装时把 Toolkit Location 改成/usr/local/cuda-12.0不要覆盖原来的。切换版本靠改软链接# 查看当前软链接指向 ls -l /usr/local/cuda # 切换到 12.0 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-12.0 /usr/local/cuda然后重新source ~/.bashrc。这样环境变量里写的是/usr/local/cuda切换软链接就等于切换版本非常方便。我一般会在.bashrc里写两个 alias 来快速切换alias cuda12sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-12.0 /usr/local/cuda alias cuda11sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda4. cuDNN 的安装与验证4.1 下载 cuDNN 需要注册账号这件事cuDNN 的下载页面需要登录 NVIDIA 开发者账号这是很多人卡住的地方。注册是免费的用邮箱就行。登录后选择对应 CUDA 12.0 的 cuDNN 版本下载 Linux x86_64 的 tar 包文件名类似cudnn-linux-x86_64-8.8.0.121_cuda12-archive.tar.xz。如果你不想注册也可以从 conda 装 cuDNN命令是conda install cudnn8.8但这种方式装的 cuDNN 只在 conda 环境里生效系统级的 CUDA 用不了。我建议还是手动装一份系统级的稳妥。4.2 手动拷贝文件的正确姿势下载完 tar 包后解压tar -xvf cudnn-linux-x86_64-8.8.0.121_cuda12-archive.tar.xz解压出来是一个cudnn-*-archive目录里面有include和lib两个文件夹。接下来把文件拷到 CUDA 目录# 拷贝头文件 sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.0/include # 拷贝库文件 sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.0/lib64 # 赋予读权限 sudo chmod ar /usr/local/cuda-12.0/include/cudnn*.h sudo chmod ar /usr/local/cuda-12.0/lib64/libcudnn*注意cp -P这个参数它保留符号链接。cuDNN 的 lib 目录里有很多.so和.so.8这样的软链接不加-P会把软链接变成实体文件导致后面链接出错。4.3 验证 cuDNN 是否装好验证 cuDNN 最直接的方法是看版本号cat /usr/local/cuda-12.0/include/cudnn_version.h | grep CUDNN_MAJOR -A 2正常输出类似#define CUDNN_MAJOR 8 #define CUDNN_MINOR 8 #define CUDNN_PATCHLEVEL 0这说明 cuDNN 8.8.0 装好了。另一个方法是编译一个小的测试程序但比较麻烦一般看版本号就够了。提示如果你之前装过旧版 cuDNN拷贝前最好先删掉/usr/local/cuda-12.0/include/cudnn*.h和lib64/libcudnn*避免新旧文件混在一起导致版本混乱。5. 装完之后那些让人抓狂的报错怎么解5.1libcudnn.so.8: cannot open shared object file这个报错几乎每个人都遇到过。原因通常是LD_LIBRARY_PATH没包含 cuDNN 的库路径或者包含了但顺序不对。先确认库文件在不在ls /usr/local/cuda-12.0/lib64/libcudnn.so.8如果文件在那就是环境变量问题。检查echo $LD_LIBRARY_PATH确保输出里有/usr/local/cuda-12.0/lib64。如果没有回到 3.4 节重新配。如果有了还报错可能是 conda 环境覆盖了可以在 Python 里临时加import os os.environ[LD_LIBRARY_PATH] /usr/local/cuda-12.0/lib64: os.environ.get(LD_LIBRARY_PATH, )但这是治标不治本根本解法是在激活 conda 环境后重新 export 一次。5.2CUDA driver version is insufficient的排查链路这个报错说明驱动版本低于 CUDA Toolkit 要求。排查步骤nvidia-smi看驱动版本和它支持的 CUDA 上限nvcc --version看你装的 Toolkit 版本如果 Toolkit 版本高于驱动支持的上限要么升级驱动要么降级 Toolkit升级驱动在 Ubuntu 下sudo apt-get install nvidia-driver-525 sudo reboot装完重启再确认。5.3 conda 环境里 CUDA 版本被覆盖的问题用 conda 装 PyTorch 时conda 会自动装一个cudatoolkit这个和系统级的 CUDA 是两回事。cudatoolkit只提供运行时库不包含nvcc编译器。如果你在 conda 环境里跑nvcc --version发现版本不对那是正常的因为 conda 的cudatoolkit不影响系统nvcc。但有个坑conda 的cudatoolkit版本如果和系统 CUDA 差太多编译自定义算子时会出问题。解决办法是让 conda 的cudatoolkit版本和系统 CUDA 对齐比如系统装 12.0conda 里也装cudatoolkit12.0。6. 几个我踩过的坑和对应经验6.1 不要在安装 CUDA 时勾选驱动前面提过这里再强调一次。runfile 安装时如果选了安装驱动它会装一个 525 版本的驱动可能和你系统里已有的驱动冲突导致重启后进不了图形界面。我有个同事就这么干过最后只能进 recovery 模式卸载重装。所以驱动和 Toolkit 分开装驱动用系统包管理Toolkit 用 runfile。6.2 环境变量写在.bashrc还是.profile如果你用图形界面登录.bashrc可能不会自动加载因为图形终端默认不读它。稳妥的做法是写在~/.profile或者~/.bash_profile里。但如果你主要用 SSH 或者终端.bashrc就够了。我一般两个都写省得纠结。6.3 装完记得重启一次虽然 CUDA 装完不强制重启但驱动相关的改动需要重启才生效。尤其是你升级了驱动之后不重启的话nvidia-smi可能显示的还是旧版本。装完 CUDA 和 cuDNN重启一次然后跑个nvidia-smi和nvcc --version双重确认心里踏实。6.4 用 Docker 的话可以跳过这些如果你用 Docker 跑深度学习其实不需要在宿主机装 CUDA Toolkit只需要装驱动然后拉 NVIDIA 的 CUDA 镜像就行。镜像里已经配好了 CUDA 和 cuDNN。命令是docker run --gpus all -it nvidia/cuda:12.0.0-cudnn8-devel-ubuntu20.04这种方式最干净环境隔离不会污染宿主机。但前提是宿主机驱动版本要够并且装了nvidia-container-toolkit。7. 附deb 方式安装 CUDA 12.0 的命令如果你还是想用 deb 包流程如下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.0.0/local_installers/cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2004-12-0-local_12.0.0-525.60.13-1_amd64.deb sudo cp /var/cuda-repo-ubuntu2004-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda注意最后一步apt-get install cuda会连带装驱动如果你不想动驱动改成sudo apt-get install cuda-toolkit-12-0。装完同样要配环境变量和 runfile 方式一样。我个人在实际操作中的体会是CUDA 环境这东西装一次记一次笔记因为版本更新太快隔半年再装可能就忘了当初怎么配的。把版本对应表、环境变量、验证命令这三样记牢基本能应付 90% 的场景。剩下的 10%多半是驱动和框架版本打架那就回到版本对应表重新对一遍问题总能定位到。
返回列表