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也可以指定版本安装,比如你看到推荐的是535:
sudo 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 modeset=0' >> /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-gpu:
conda create -n pytorch-gpu python=3.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安装PyTorch
PyTorch安装方式也有讲究。在虚拟环境创建完成后,进入PyTorch官网的安装页面,它会根据你选择的平台自动生成安装命令。对于Linux+conda环境,官网推荐的是conda命令:
conda install pytorch torchvision torchaudio pytorch-cuda=11.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是否可用。在虚拟环境里启动Python:
python然后逐行执行测试:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))如果你看到以下输出,恭喜,环境已经全部打通:
2.1.0+cu118 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 modeset=0' >> /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目录加到PATH:
export 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()返回False | PyTorch装成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环境装PyTorch,base环境的包依赖容易越滚越乱。单独建一个环境,就算废了直接删掉重建,成本很低。
第四,任何一条命令输出报错,第一反应该是看日志而不是搜索。比如驱动安装失败,先看/var/log/nvidia-installer.log里的报错行,官方日志给出的提示比论坛里的猜测准确得多。CUDA编译失败时,报错信息前几行通常会指明缺少哪个头文件或者库文件,对症下药比重装来得高效。
我在实际使用中的体验是,这套环境跑通之后,后续卸载重装就有章可循了。驱动出问题,apt purge nvidia-*再装新的;CUDA版本不对,改环境变量指向新的/usr/local/cuda-xx;PyTorch要升级,pip卸载再装就行。只要每一层都验证过关,组合在一起就稳如老狗。如果你第一次跟着教程装,遇到卡住的地方不用急着重来,按我上面说的排查思路一步步回溯,大概率能定位到问题所在。这套链路虽然繁琐,但每一步都有明确的验证点,只要耐心捋一遍,你的GPU就能真正为深度学习项目发光发热了。