ARTICLE DETAIL

资讯详情

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

Ubuntu 20.04深度学习环境搭建:NVIDIA驱动、CUDA与PyTorch完整指南

Ubuntu 20.04深度学习环境搭建:NVIDIA驱动、CUDA与PyTorch完整指南 1. 整体安装思路与环境确认1.1 为什么我从Ubuntu 20.04开始说起折腾深度学习的机器绕不开Ubuntu系统。Windows下跑PyTorch的体验因人而异但到了训练模型、跑ORB-SLAM这类底层依赖CUDA的项目时大多数开源代码的首选系统还是Ubuntu 20.04。这个版本占据了大量教程的默认基准环境社区反应快遇到坑基本都能搜到解决方案。你在网上看到的安装ubuntu20.04和NVIDIA驱动与CUDA Toolkit及在Anaconda添加Pytorch验证CUDA是否可用本质上就是一条完整的深度学习开发环境搭建链路。我遇到过不少人问现在已经有Ubuntu 22.04甚至24.04了为什么还要守着20.04答案很简单——生态兼容性。很多学术框架、老项目的底层库只测试到20.04比如ROS Noetic、ORB-SLAM3以及一些工业视觉SDK的官方支持就停在Ubuntu 20.04。生产环境不是追求最新是追求稳定可复现。如果你要复现论文代码跟着20.04的配置走最保险。另外一个现实问题是新手第一次接触这套环境时往往分不清NVIDIA驱动、CUDA Toolkit、Anaconda这三个东西各自干什么。我先把它们的关系说清楚NVIDIA驱动是硬件层让系统能调用显卡算力管图形显示也管通用计算。CUDA Toolkit是并行计算平台给开发者提供编译GPU代码的工具链、运行时库。PyTorch是深度学习框架编译时依赖CUDA的接口来调用GPU。驱动和CUDA并不是同一个安装包但CUDA Toolkit的安装过程中会尝试匹配某个最低驱动版本。也就是说驱动装对了CUDA才谈得上能用CUDA装对了PyTorch的GPU版本才有依附的地基。这套依赖关系如果搞反后面验证CUDA时就会显示False。1.2 我为什么推荐先系统后驱动再编程环境的顺序装整个链路顺序错了会非常痛苦。我第一次装的时候图省事先装了Anaconda和PyTorch想着后面再补驱动结果驱动安装时内核模块报错不得不回头把系统环境折腾了一整晚。正确的顺序是先装好Ubuntu 20.04系统确保能正常进桌面。再装NVIDIA驱动用nvidia-smi确认驱动和CUDA Driver API版本。然后安装CUDA Toolkit设置好环境变量用nvcc -V确认编译工具链。接着安装Anaconda创建一个独立的虚拟环境。最后在虚拟环境里安装GPU版PyTorch用官方验证代码确认CUDA可用。这样每一步的验证结果都清晰对应到某一层出问题能快速定位到是驱动问题、CUDA路径问题还是PyTorch编译版本问题。我在后面的章节里会按这个顺序逐个给你拆解。注意Ubuntu 20.04系统安装本身有个坑——如果你用的是U盘安装开机时需要在引导界面按e进入grub配置在quiet splash后面加上nomodeset否则NVIDIA显卡可能导致安装界面黑屏或卡死。这就是一个很典型的硬件兼容性问题早做准备省得来回烧U盘。2. NVIDIA驱动安装实操2.1 先查清你的显卡型号和系统推荐版本驱动安装的前提是搞清楚硬件型号。我见过有人拿着RTX 4080去装老项目的配套驱动结果新卡在老驱动上直接无法识别屏幕黑得不留一点余地。第一步永远是检测# 查看显卡型号 lspci | grep -i vga # 或者用nvidia-smi如果能显示说明已经有一个驱动 nvidia-smi在全新系统上lspci通常能输出类似NVIDIA Corporation GA104 [GeForce RTX 3070]的信息。拿到型号后再查支持的驱动版本。NVIDIA官方驱动支持页面会根据显卡代次推荐最新稳定版但如果你要跑的项目对CUDA版本有硬性要求最好先确认项目文档里的CUDA版本再反向匹配驱动版本。这里提供一个判断依据nvidia-smi右上角的CUDA版本号代表当前驱动支持的最高CUDA版本只要这个数字不低于你项目的CUDA要求驱动就算合适。另外Ubuntu自带一个驱动管理工具ubuntu-drivers它读取硬件信息后直接列出推荐驱动。我在20.04上实测命令是sudo ubuntu-drivers devices输出里会有driver : nvidia-driver-535 - third-party free recommended这种行。看到带recommended标记的版本基本可以直接用。当然nvidia-driver-535只是我当时机器上的推荐值你的显卡不同推荐版本也会不同不用强行追最新。2.2 命令行安装NVIDIA驱动的完整过程安装驱动的方式分三种官方.run文件手动安装、使用Graphics Drivers PPA、使用Ubuntu自带的ubuntu-drivers。我亲测下来最稳妥、最省心的是PPA方式加ubuntu-drivers自动安装理由有两个一是它能自动处理内核模块和依赖关系二是卸载的时候走apt更干净。先更新系统软件包sudo apt update sudo apt upgrade -y然后添加NVIDIA驱动PPA源sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update这时候再跑ubuntu-drivers devices你会发现列表比刚才更完整推荐版本也更明确。直接执行自动安装sudo ubuntu-drivers autoinstall也可以指定版本安装比如你看到推荐的是535sudo apt install nvidia-driver-535安装过程中会提示你是否禁用Nouveau开源驱动选择确认。Nouveau是Ubuntu自带的NVIDIA开源驱动功能不完整且与新驱动冲突必须禁掉。如果安装过程中没有提示可以手动编辑黑名单配置文件sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia.conf配置完成后关键一步是重新生成内核启动映像否则重启后可能还是旧状态sudo update-initramfs -u随后重启系统sudo reboot有些博主会建议在纯命令行界面去装驱动避免桌面环境占用显卡资源。实际上20.04的桌面环境和NVIDIA驱动的兼容性已经不错PPA方式直接图形界面下安装也稳定关键是别同时开太多占用GPU的窗口。2.3 驱动安装验证与常见报错对策重启进桌面后第一件事是打开终端验证驱动nvidia-smi如果出现了显卡型号、驱动版本、显存占用等信息说明驱动核心已经正常工作。同时可以跑一条OpenGL验证glxinfo | grep OpenGL renderer这个工具在mesa-utils包里没装就先用sudo apt install mesa-utils补上。我在测试中还遇到过驱动装上后nvidia-smi正常但系统设置里分辨率调不了的情况。这通常是驱动版本和内核版本不匹配导致的。解决方法是换个驱动版本比如从535换回530或545重新安装一次即可。多版本驱动的切换只建议通过apt purge nvidia-*彻底清干净后重装不要apt install nvidia-driver-535和apt install nvidia-driver-530混着装依赖关系会乱。提示如果你在安装前已经有Nouveau驱动加载到内核建议先sudo apt purge nvidia-*把可能存在的旧NVIDIA包清一遍再走上面的流程。这一步能避免百分之九十的循环登录问题。3. CUDA Toolkit安装与环境配置3.1 CUDA Toolkit版本选择和下载驱动就绪后接下来是CUDA Toolkit。这里有个核心认知要纠正驱动装好之后系统里已经有一个运行时CUDA驱动API但编译工具链nvcc还需要单独安装这就是CUDA Toolkit的意义。版本选择方面我给一个实用的建议先在项目文档里找你需要的CUDA版本比如项目写着CUDA 11.x那就不要装12.x因为框架编译时可能与新工具链不兼容。如果项目没有指定版本就安装和驱动匹配的默认最新版。在20.04上CUDA 11.8是一个很稳妥的选择大量开源项目都基于它测试。而CUDA 12.1以上的版本对驱动版本要求更高老显卡不一定支持。去NVIDIA官网的CUDA Toolkit归档页面选择Linux x86_64 Ubuntu 20.04 runfile (local)。这里我特别想强调下载时建议选runfile而不是deb包。虽然deb在线安装看起来方便但apt源里通常会塞进来一堆和你预期不符的依赖而且deb安装到系统路径后改动起来很痛苦。runfile方式把CUDA装到/usr/local/cuda-11.8独立目录切换版本就是改个环境变量的事干净利落。下载完成后执行安装命令# 下载的文件名类似 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安装程序会先弹出一个ASCII协议界面长按d往下翻输入accept接受条款。接下来进入组件选择界面重点来了——把Driver选项取消只保留CUDA Toolkit和Samples。因为驱动已经装过在这里重复安装很可能覆盖掉你的驱动版本导致驱动和Toolkit版本不一致。3.2 环境变量配置详解安装完成后CUDA Toolkit默认安装在/usr/local/cuda-11.8目录下。为了让系统的命令找到它需要修改~/.bashrc。为什么不改全局的/etc/profile因为CUDA版本切换很频繁每个用户用自己家目录里的环境变量配置更灵活。编辑~/.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 ~/.bashrc有一点要注意的是/usr/local/cuda通常是一个软链接指向你最新安装的CUDA版本。比如我同时装了11.8和12.1软链接会指向最后安装的那个。如果项目需要固定版本我建议直接写死具体路径如/usr/local/cuda-11.8不要用/usr/local/cuda这种软链接路径免得切换版本后原本能编译的项目突然报一堆头文件缺失的错误。3.3 验证nvcc与CUDA功能配置完环境变量后第一项验证nvcc -V看到类似下图的输出就说明编译工具链已经就绪nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on ... Cuda compilation tools, release 11.8, V11.8.89再验证编译和运行时是否匹配。进入CUDA自带的samples目录编译一个小例子cd ~/NVIDIA_CUDA-11.8_Samples/1_Utilities/deviceQuery make ./deviceQuery输出里看到Detected 1 CUDA Capable device(s)和你的显卡型号还有Result PASS就说明CUDA Toolkit功能完整。这一步值得做因为只装不编译很多底层库的问题会在后面跑模型时才暴露到时候排查范围更大。注意如果deviceQuery出现Failed通常是/dev/nvidia0设备节点权限问题。检查ls -l /dev/nvidia0如果不是crw-rw-rw-权限用sudo chmod 666 /dev/nvidia*临时解决长期方案是配置udev规则。4. Anaconda安装与虚拟环境创建4.1 为什么用Anaconda管理Python环境Python环境的混乱是深度学习项目的隐形杀手。你在某个项目里装PyTorch在另一个项目里装TensorFlow直接装在系统Python上很容易产生依赖冲突。Anaconda的核心价值在于虚拟环境隔离每个项目一套Python版本和包集合互不干扰。我见过很多新手直接用pip install torch在系统Python里装了一堆乱七八糟的包最后想换PyTorch版本卸载都卸不干净。用Anaconda的conda命令创建独立环境可以在几分钟内重来一遍代价很小。这也是我在这条链路中强烈建议加一道Anaconda的原因。下载Anaconda安装脚本时推荐从清华镜像源下载比官方源快得多。在浏览器打开清华镜像站的anaconda/archive目录找最新版本的Anaconda3-2023.09-0-Linux-x86_64.sh这种文件。服务器在国外直连下载经常只有几十KB每秒清华镜像能跑满带宽。执行安装bash Anaconda3-2023.09-0-Linux-x86_64.sh安装过程中会问是否接受许可协议输入yes。接着会提示安装路径默认在~/anaconda3回车即可。最后问是否执行conda init这里建议选择yes这样会在~/.bashrc里自动加上初始化代码终端重启后就可以直接使用conda命令。4.2 创建PyTorch专用虚拟环境Anaconda装好后准备一个独立的虚拟环境。我习惯按项目命名比如pytorch-gpuconda create -n pytorch-gpu python3.8 -y为什么选Python 3.8因为PyTorch对Python版本支持有一个向后兼容窗口而很多旧项目在Python 3.8上测试最充分。如果你想用更新的Python版本3.10也在支持范围内但遇到老代码编译报错时需要多花时间排查。我建议看你要跑的项目的requirements.txt照着里面的Python版本建环境最稳。激活环境conda activate pytorch-gpu激活后命令行前面会出现(pytorch-gpu)前缀这就是虚拟环境生效的标志。在这个环境里所有用pip或conda安装的包都会被限制在这个环境目录下不会影响到系统Python。我之前踩过最典型的坑是忘记激活虚拟环境直接pip安装到了base环境后面发现又得回到base环境去卸载非常混乱。4.3 更换conda源加速包下载conda默认使用官方的包源在国内网络条件下的下载速度不怎么理想。就算只是安装PyTorch的几个依赖包也可能卡在进度条上半天不动。换源是性价比最高的一步。执行以下命令配置清华conda源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes验证一下是否生效conda config --show channels输出能看到刚才添加的清华镜像路径就说明配置成功。之后用conda install或者conda create创建环境时下载速度会有质的提升。提示如果用pip安装包同样建议配置国内pip源。在~/.pip/pip.conf里写入清华大学PyPI镜像地址能避免很多等待超时的问题。5. PyTorch安装与CUDA可用性验证5.1 用conda还是pip安装PyTorchPyTorch安装方式也有讲究。在虚拟环境创建完成后进入PyTorch官网的安装页面它会根据你选择的平台自动生成安装命令。对于Linuxconda环境官网推荐的是conda命令conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia用conda安装的好处是它会自动帮你匹配好PyTorch和CUDA运行时库的关系理论上不需要额外配置就能在框架层调用CUDA。不过conda安装的PyTorch包体积大而且如果源里没有最新版本你还要再等等。我个人更偏爱用pip安装PyTorch。因为PyTorch的pip包更新快版本选择灵活而且pip安装的核心包和conda安装的在功能上没区别。pip方式也很简单pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118这个命令的关键是--index-url参数它指向PyTorch在CUDA 11.8下编译好的wheel包仓库。如果这个地址下载速度慢可以在前面加http://mirrors.aliyun.com/pytorch-wheels/cu118/这类国内镜像不过要注意镜像的完整性。5.2 验证PyTorch能否调用CUDA安装完成后最让人紧张的环节来了——验证CUDA是否可用。在虚拟环境里启动Pythonpython然后逐行执行测试import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))如果你看到以下输出恭喜环境已经全部打通2.1.0cu118 True 1 NVIDIA GeForce RTX 3070torch.cuda.is_available()是判断框架能否调用CUDA的核心标志它返回True才说明GPU通道打通了。torch.cuda.get_device_name(0)能识别出显卡型号说明驱动层、CUDA层、框架层三层之间通信正常。接下来可以做一次真实的GPU浮点运算验证这一步比看布尔值更有说服力import torch # 定义一个大矩阵同时放到CPU和GPU上有一次对比 x torch.randn(5000, 5000) print(CPU计算耗时) y torch.mm(x, x) print(torch.cuda.is_available()) x_gpu x.cuda() print(GPU计算耗时) y_gpu torch.mm(x_gpu, x_gpu)正常情况GPU运算会比CPU快一个数量级左右。如果is_available()返回False或者.cuda()时报出RuntimeError: Found no NVIDIA driver on your system问题基本出在驱动与PyTorch版本不匹配需要按前面的步骤回溯检查。5.3 完整验证脚本与Samples编译为了确认整个环境链路没有隐患我每次装完都会跑一个综合验证脚本把刚才说的检查项合在一起pip install torchinfo然后写一段脚本检测GPU基本信息import torch import torch.nn as nn print(PyTorch版本:, torch.__version__) print(CUDA是否可用:, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU数量:, torch.cuda.device_count()) print(当前GPU名称:, torch.cuda.get_device_name(torch.cuda.current_device())) # 创建一个简单的模型并搬到GPU上 model nn.Linear(10, 10).cuda() print(模型已成功部署到GPU) # 反向传播测试 x torch.randn(32, 10).cuda() y model(x) loss y.sum() loss.backward() print(前向/反向传播测试通过)跑完这个脚本PyTorch层面的CUDA可用性就确认了。如果这里全部通过你可以放心地去跑模型了后续的深度学习训练、推理不会因为环境问题卡住。6. 常见问题与排查技巧实录6.1 驱动安装后黑屏或循环登录这种现象在装了独显的机器上非常常见。核心原因有两种一是安装驱动时Nouveau没有完全禁用旧开源驱动和新驱动冲突二是驱动版本和内核不兼容。排查思路# 进入文本模式Ctrl Alt F2 # 查看驱动模块加载状态 lsmod | grep nouveau如果有输出说明Nouveau还在加载。这时候先卸载NVIDIA驱动再执行第2节的黑名单步骤sudo apt purge nvidia-* sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia.conf sudo update-initramfs -u sudo reboot如果问题依旧检查内核版本和驱动版本兼容性uname -r查看内核去NVIDIA官网搜索对应的驱动分支。实测来看Ubuntu 20.04搭配5.15内核时535驱动很稳定换到5.4旧内核545可能就装不上。6.2 CUDA版本和PyTorch版本不匹配时的表现这是最容易让人误以为环境坏了的情况。当项目的CUDA版本和PyTorch的CUDA版本不一致时典型报错是CUDA error: no kernel image is available for execution on the device或者是torch.cuda.is_available()返回False。原因在于PyTorch的wheel包只包含特定CUDA版本的运行时库如果NVIDIA驱动版本太低无法运行该CUDA版本编译的kernel。解决方案分两种情况。如果你的项目对CUDA版本要求严格就安装对应的PyTorch wheel# CUDA 11.8 用这个 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # CUDA 12.1 用这个 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121如果你不确定项目到底要哪个CUDA就用排除法先查项目文档没有就按驱动支持的最高版本来。nvidia-smi右上角那个数字是驱动支持的上限要求而不是必须满足的版本PyTorch只要低于这个上限一般就没问题。6.3 装完conda后命令找不到或环境变量冲突有些用户安装Anaconda后发现conda命令在终端里提示Command not found通常是因为没执行conda init或者没重新加载.bashrc。先试source ~/.bashrc如果还不行手动把Anaconda的bin目录加到PATHexport PATH$HOME/anaconda3/bin:$PATH另一种情况是Anaconda的Python环境变量覆盖了系统自带的Python导致系统工具异常。这在Ubuntu上尤其明显有些桌面应用依赖系统的Python路径。解决思路是不要动默认顺序让conda初始化代码保持在.bashrc末尾如果还冲突可以在系统级脚本如/etc/environment里指定绝对路径调用/usr/bin/python3。6.4 常见问题速查表现象可能原因解决办法nvidia-smi提示command not found驱动未安装或PATH没配置执行sudo apt install nvidia-driver-535后重启torch.cuda.is_available()返回FalsePyTorch装成CPU版用--index-url https://download.pytorch.org/whl/cu118重装运行GPU程序报CUDA out of memory显存被其他进程占用nvidia-smi查看占用后用kill -9 PID释放nvcc -V找不到命令环境变量没生效确认source ~/.bashrc成功执行或直接写死路径桌面进入循环登录Nouveau未禁用或驱动不匹配按6.1步骤处理必要时切换驱动版本conda创建环境极慢默认源下载缓慢更换清华conda镜像源6.5 我从多次装机中总结的避坑经验装备这套环境前前后后我折腾了不下十次有几个细节是每次都能帮我省下大把时间的第一装驱动前一定把所有系统更新做完再装。apt upgrade之后内核版本会更新如果驱动是先装的内核更新后可能导致驱动模块失效nvidia-smi突然报错。顺序最好是系统更新到最新版本重启再装驱动。第二CUDA Toolkit的runfile安装时一定要看清楚组件选择界面是否勾选了Driver。我建议所有场景下都取消Driver勾选。因为即使你勾选上了它装的那个驱动版本不一定和你之前手动装的一致反而制造新的问题。第三创建conda虚拟环境时建议先指定Python版本。不要用默认base环境装PyTorchbase环境的包依赖容易越滚越乱。单独建一个环境就算废了直接删掉重建成本很低。第四任何一条命令输出报错第一反应该是看日志而不是搜索。比如驱动安装失败先看/var/log/nvidia-installer.log里的报错行官方日志给出的提示比论坛里的猜测准确得多。CUDA编译失败时报错信息前几行通常会指明缺少哪个头文件或者库文件对症下药比重装来得高效。我在实际使用中的体验是这套环境跑通之后后续卸载重装就有章可循了。驱动出问题apt purge nvidia-*再装新的CUDA版本不对改环境变量指向新的/usr/local/cuda-xxPyTorch要升级pip卸载再装就行。只要每一层都验证过关组合在一起就稳如老狗。如果你第一次跟着教程装遇到卡住的地方不用急着重来按我上面说的排查思路一步步回溯大概率能定位到问题所在。这套链路虽然繁琐但每一步都有明确的验证点只要耐心捋一遍你的GPU就能真正为深度学习项目发光发热了。
返回列表