刚开始用深度学习框架的朋友,十有八九都栽在环境配置上。Anaconda、PyTorch、GPU这三样东西单看都不难,凑到一起却能让不少人折腾一整天。我本人也经历过在终端里反复敲命令、看着一堆报错信息无从下手的阶段,所以今天把这套“Anaconda配置pytorch-gpu虚拟环境”的步骤完整整理出来,并且把每一步背后的原因也讲清楚。这篇文章适合刚接触PyTorch、准备用自己电脑的显卡跑代码的读者,也适合被各种版本号绕晕的初学者。整篇文章的目标只有一个:照着操作,你能稳定跑起一个带GPU支持的PyTorch虚拟环境,并且以后遇到异常时,知道该从哪里排查。
1. 动手前的关键认知:显卡驱动、CUDA和PyTorch到底是什么关系
很多人在配置GPU环境时,第一反应是去下载安装CUDA Toolkit,折腾一圈之后发现PyTorch还是跑不起来,最后才明白这中间有三层东西需要分清。
1.1 三层依赖关系
第一层是显卡驱动。它是操作系统层面的程序,负责让系统识别并调用GPU。判断驱动是否正常,最直接的方法就是在终端执行nvidia-smi,能打印出显卡型号和驱动版本,说明驱动工作正常。
第二层是CUDA。它是NVIDIA的并行计算平台,本身包含两部分:一部分是驱动组件,装显卡驱动时已经带了;另一部分是开发工具包,也就是CUDA Toolkit,包含编译器、运行库等。深度学习里说的“要装CUDA”,大多数情况下指的是让运行库可用,而不是非要完整装一套Toolkit。
第三层是PyTorch。它是深度学习框架,而PyTorch的GPU版本安装包,也就是pip的wheel包,里面已经把CUDA运行库和cuDNN等相关依赖直接打包进去了。也就是说,你把torch装好之后,它自带CUDA运行环境,根本不需要你再额外装一套完整的CUDA Toolkit。
这里有个非常关键的理解:大多数人不需要单独下载安装CUDA Toolkit。真正决定能不能用GPU的只有两件事,一是显卡驱动版本够不够新,二是你装的PyTorch是不是带CUDA支持的版本,而不是CPU版。
打个比方:显卡驱动像是给GPU修好的“道路”,CUDA是“交通规则和工具箱”,PyTorch是“货车”。PyTorch这辆货车自己带了一套工具箱,里面已经打包了CUDA运行库,只要道路足够新、能通过,它就能跑起来。你硬要再手动装一套Toolkit,相当于多带了一套工具,不仅没必要,还可能因为版本冲突把路堵住。
1.2 怎么快速确认自己的显卡和驱动状态
在Windows系统下,打开CMD或者PowerShell,执行:
nvidia-smi正常会看到类似下面的输出:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 545.23.06 Driver Version: 545.23.06 CUDA Version: 12.3 | |-------------------------------+----------------------+----------------------+ | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC | | GeForce RTX 3060 | 00000000:01:00.0 On | | +-------------------------------+----------------------+----------------------+这里最关键的是看两行:
- Driver Version:驱动版本号
- CUDA Version:当前驱动最高支持到的CUDA版本,比如12.3
很多人会把这里的“CUDA Version”误认为系统已经安装的CUDA版本,其实不是。它表示的是驱动能支撑的最高CUDA版本。只要这个数字大于等于你要装的PyTorch对应CUDA版本要求,就基本满足。
举个例子:你的 nvidia-smi 显示 CUDA Version: 12.3,那么PyTorch选CUDA 12.1或者12.4的版本基本都能用。如果显示的版本很老,比如低于11.8,那就需要先更新显卡驱动。
另外,如果你的机器是核显加独显的笔记本,确认系统用的是NVIDIA独显而不是核显。驱动安装正确的情况下,nvidia-smi一定能看到NVIDIA显卡信息。如果提示找不到命令,说明驱动没装好,得先去硬件厂商官网下载匹配的驱动,装好重启一下再来。
2. 创建干净独立的Anaconda虚拟环境
确认驱动没问题之后,下一步是用Anaconda创建一个独立虚拟环境。这一步看似简单,却是整个配置过程中最值得养成习惯的一环。
2.1 为什么不要直接装在base环境
很多新手图省事,直接在Anaconda的base环境里执行 pip install torch,装完跑起来好像也没问题,但后面会越来越难受。
虚拟环境最大的价值是隔离。base环境承担的是conda自身的管理功能,你在里面装一堆深度学习包,轻则拖慢启动速度,重则把环境搞乱。更实际的问题是:项目A要用PyTorch 1.x,项目B要用PyTorch 2.x,如果都在base里,必然冲突。python包的版本依赖是很敏感的,今天为了A项目升个级,明天B项目就跑不起来了。
我的习惯是把每个项目的依赖关进独立的“箱子”里,各玩各的,互不干扰。这样另一个好处是:环境是可复制的。哪天换了电脑、或者同事要复现你的结果,一份 environment.yml 文件就能把整个环境还原出来,非常省事。
2.2 创建环境的命令细节
打开终端,执行:
conda create -n pytorch python=3.10 -y参数说明:
-n pytorch:环境名叫pytorch,可以按项目来命名python=3.10:创建时顺便指定Python版本-y:跳过确认,直接创建
Python版本选3.10是目前最稳的选择。PyTorch对各版本的支持有滞后性,3.8到3.11基本都在官方支持范围内,3.12则在较新的PyTorch版本才完整支持,旧版甚至会出现 import torch 直接崩溃的情况。选一个成熟版本,能少踩很多坑。
创建完成后,激活环境:
conda activate pytorch如果提示 CommandNotFoundError: Your shell has not been properly configured to use 'conda activate',先执行:
conda init然后重开终端再 activate。
激活后确认一下当前Python版本:
python --version conda env listconda env list会列出所有环境,当前激活的会带星号。我总是强调:安装任何包之前,先确认当前环境的路径不对,这一个习惯能避免大量后续问题。
这时候环境是“空壳”,接下来要装的东西基本就是三件:PyTorch本身、torchvision(图像处理相关)、torchaudio(音频相关)。这三个包版本需要配套,所以最好一次性安装,让pip自己解析依赖关系。
3. 安装PyTorch GPU版本:选对命令是关键
PyTorch的安装命令看起来只有一行,但选错方式、选错CUDA版本,后面就等着报错吧。这一节把选型的逻辑说透。
3.1 从哪里获取安装命令
PyTorch官网上有个安装配置工具,选择操作系统、包管理器、CUDA版本之后,会自动生成对应的安装命令。这是最权威的来源,因为你从官网拿到的命令永远和当前最新版本同步,不容易出现“照着一篇老教程装了个已废弃命令”的问题。
在CUDA版本的选择上,基本遵循一个原则:如果 nvidia-smi 显示的驱动支持版本比较新,比如在12.x,建议直接用官方默认推荐的CUDA版本(通常是12.1或者更新)。如果机器较老,或者要兼容某些旧项目,CUDA 11.8依然是使用范围很广的稳定选择。
生成出来的命令大致是两大类。
conda方式:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidiapip方式:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121注意pip命令里的cu121对应CUDA 12.1,如果选11.8就是cu118。
3.2 conda还是pip?两种方式对比
我经常被问到:“网上教程有的用conda装,有的用pip装,到底听谁的?”这里直接给结论:在conda虚拟环境里,优先用pip方式安装PyTorch。
| 对比项 | conda方式 | pip方式 |
|---|---|---|
| 依赖解析速度 | 可能非常慢,卡在Solving environment很久 | 快 |
| 默认channel兼容性 | 依赖pytorch和nvidia两个channel,配置不对容易报错 | 官方wheel仓库,稳定 |
| 包装入位置 | 如果环境已激活,正常进入当前环境 | 同样,必须激活环境后执行 |
| 出错排查难度 | channel相关问题较难定位 | 错误信息更直接 |
| 适合人群 | 对conda机制熟悉的人 | 绝大多数用户 |
为什么我推荐pip?最主要的原因是conda在某些平台上的依赖解析确实太慢。我见过 conda install 一条命令跑了二三十分钟还没结束,换成pip只需要几分钟。而且PyTorch官方发布的pip wheel包已经把CUDA依赖和版本匹配关系都打包好了,在已经激活的虚拟环境里安装,完全够用。
这里必须提醒一个高频翻车点:一定要先conda activate pytorch,再执行 pip install。如果没激活环境,pip会用base的Python去安装,结果torch装到了base里,你在这个环境里 import torch 还是报错。装完后可以用pip list看一下torch装在哪,或者看which python确认当前路径。
3.3 下载慢怎么处理
如果你在下载阶段遇到速度很慢的问题,有几个实际的应对方式。
第一,对于普通Python包,可以配置国内公共镜像源,比如清华、阿里云、中科大的PyPI镜像,在pip下载时能快很多。配置方法是用pip命令指定镜像地址:
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple但这里有个很关键的坑:PyTorch的GPU版本是通过--index-url https://download.pytorch.org/whl/cu121指定到官方whl仓库下载的,这个仓库里的cu121、cu118系列GPU wheel包,普通PyPI镜像不一定同步。所以稳妥的做法是:torch、torchvision、torchaudio这三件套继续用官方 index-url 安装,其他普通包再切镜像源。
第二,如果下载过程中经常超时,可以加大超时时间:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 --default-timeout=100第三,如果你已经通过网络高峰期的磨砺拿到了wheel文件,也可以直接在本地安装:pip install /path/to/torch-xxx.whl。
3.4 安装完的第一眼检查
安装完成后不要急着写代码,先跑一跑版本检查:
python -c "import torch; print(torch.__version__)" python -c "import torch; print(torch.version.cuda)"第一个命令会输出类似2.3.1+cu121,重点看有没有+cu后缀。带+cu121说明装的是GPU版,只有2.3.1(或者带+cpu)说明是CPU版,那就需要卸载重装。第二个命令输出的是PyTorch内置的CUDA版本号,和你的选择对应。
到这一步,环境的“骨架”已经搭好,但还没完,得验证GPU真的能用。
4. 验证GPU真的被PyTorch用上了
这一步绝不能跳过。很多人安装后以为 import torch 不报错就万事大吉,结果训练时速度慢得离谱,才发现GPU从来没有被调用过,一直是CPU在跑。
4.1 三个命令确认基本状态
在Python交互环境或者脚本里执行:
import torch print(torch.cuda.is_available()) # True print(torch.cuda.get_device_name(0)) # NVIDIA GeForce RTX 3060 之类 print(torch.cuda.device_count()) # GPU数量torch.cuda.is_available()返回 True,说明PyTorch能访问GPUtorch.cuda.get_device_name(0)会返回第一块GPU的型号,可以用来确认PyTorch认的是哪张卡torch.cuda.device_count()返回机器上的GPU数量
如果返回的是 False,重点排查三件事:是不是装了CPU版的torch、当前环境是否激活、驱动是否正常。这三条在上一节都有对应的排查方法。
4.2 跑一个最小的GPU运算验证
命令行的检查只能说明“能访问”,最好再跑一个真实的GPU运算来确认。写一段小代码:
import torch x = torch.rand(16, 16).cuda() y = torch.rand(16, 16).cuda() z = x @ y print(z.shape) # torch.Size([16, 16]) print(z.device) # cuda:0 print(x.is_cuda) # True这段代码让两个张量在GPU上做矩阵乘法。z.device 显示 cuda:0,x.is_cuda 为 True,说明运算确实发生在GPU上。
还可以在跑这段代码的同时,打开另一个终端执行nvidia-smi,观察GPU显存占用情况:如果看到 python 进程占用了显存,说明GPU真的在被调用。这个方法在以后排查训练脚本问题时也很实用。
顺便说一个训练中的常识:并不是所有数据都要一股脑塞进GPU。数据加载、预处理等环节通常在CPU上完成,再把处理好的张量用.to('cuda')送到GPU参与计算,这样能避免显存被不必要地占满。显存比较小的卡,尤其要养成这个习惯。
4.3 版本匹配的最终确认
最后做一个版本匹配的确认。把torch.__version__和驱动支持的CUDA版本放在一起看:
python -c "import torch; print(torch.__version__, torch.version.cuda)"只要 nvidia-smi 显示驱动支持的CUDA版本 ≥ PyTorch对应的CUDA版本,就没问题。这里有个常见的误解:以为两个CUDA版本必须完全一样。实际上PyTorch自带的CUDA运行库是独立打包的,只要驱动足够新、能兼容这个CUDA版本就行,并不要求你机器上另外装了一套一模一样的CUDA。
5. 高频报错与排查实录
配置环境的过程几乎不可能一次顺利,我把实际遇到过、以及帮别人排除过的高频问题整理在这里,方便你直接对号入座。
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| conda create 长时间卡在Solving environment | conda依赖解析慢或channel配置问题 | 创建环境时加-c conda-forge;或安装PyTorch改用pip方式 |
| conda activate 报 CommandNotFoundError | 当前shell未初始化conda | 执行conda init后重开终端 |
| pip install 速度极慢 | 网络不稳定 | torch三件套保留官方index-url,其他包用镜像源;加大--default-timeout |
| torch.cuda.is_available() 返回False | 装了CPU版torch、环境没激活、驱动太老 | 确认torch版本带+cu后缀;激活正确环境;更新显卡驱动 |
| import torch 报 DLL load failed | torch、Python或系统运行库不匹配 | 更换兼容的Python版本;用PyTorch官方wheel重装 |
| 运行时报“CUDA error: no kernel image is available for execution on the device” | 显卡架构较新,但PyTorch对应的CUDA版本太老 | 换CUDA 11.8或12.1等更高版本的PyTorch |
| 报错 CUDA out of memory | 显存不足或显存碎片 | 调小batch size;重启终端释放显存;关闭其他占用显存的程序 |
| nvidia-smi 提示找不到命令 | 驱动未安装或未加入PATH | 安装匹配显卡型号的驱动,装完重启 |
5.2 一个高效的排查思路
碰见报错别慌,按照下面的顺序一步步来,大多数问题几分钟就能定位。
第一步,确认当前Python环境。执行:
which pythonWindows上是:
where python如果输出的路径不是你的虚拟环境路径,说明环境没激活,或者打开了一个新的、没激活环境的终端。
第二步,确认torch的来源和版本:
pip list | grep torch看版本号有没有+cu后缀,没有就意味着是CPU版。
第三步,确认驱动状态:
nvidia-smi有没有正常显示GPU信息和驱动版本。
第四步,确认Python版本是否在PyTorch支持范围内。如果你图新鲜用了3.12以上的版本,而装的PyTorch比较旧,很可能出现安装成功但运行崩溃的情况。
第五步,看报错原文里的关键字,比如“kernel image”“out of memory”“DLL load failed”,直接对照上表。
这个排查顺序我已经用了一年多,效率非常高。关键思路是:环境问题优先于代码问题,版本问题优先于硬件问题。
5.3 我踩过的几次坑
第一次配置时,我直接在base环境执行了 pip install torch,结果base环境被搅得很乱,后面其他项目跑起来各种报错,最后不得不重建环境。后来我的习惯就固定下来了:所有深度学习相关包一律进独立虚拟环境,base里只留conda本身。
还有一次用conda方式装PyTorch,在Windows上等了将近二十分钟,conda一直卡在“Solving environment”,最后还是换成官方推荐的pip命令,几分钟就装完了。所以前面表格里我特意把这种情况列了出来,遇到卡住别死等,先换思路。
最让我困惑的一次,是 torch.cuda.is_available() 返回False,但 nvidia-smi 完全正常。查了半天,最后发现是安装torch的时候没有激活目标环境,torch被装到了一个Python 3.9的base环境,而那个环境下预装的是CPU版本。所以我反复强调:激活环境后再安装,装完先查which python,这两个习惯能避免至少九成的问题。
6. 环境的日常维护和几个进阶技巧
环境配好之后不是一劳永逸,学会日常维护,能让你以后省出大量时间。
6.1 环境导出、克隆与删除
这几个命令是环境管理的核心:
# 导出当前环境的所有包版本 conda env export > environment.yml # 在另一台机器上还原环境 conda env create -f environment.yml # 克隆环境 conda create --clone pytorch -n pytorch_backup # 删除环境 conda env remove -n pytorch导出的environment.yml会记录包的精确版本号和来源,换机器复现时最可靠。如果只是想把自己的常用包清单分享给同事,可以试试导出时不带间接依赖:
conda env export --from-history > environment.yml这样导出的文件里只有你明确安装过的包,更简洁,别人还原时不会因为一堆依赖版本差异冲突。
6.2 一台机器上共存多个GPU环境
很多人有个误区,觉得一台电脑只能装一个CUDA版本。其实显卡驱动是全局共享的,而PyTorch里的CUDA运行库是跟着虚拟环境打包的。完全可以做到:环境A里装PyTorch配合CUDA 11.8,环境B里装PyTorch配合CUDA 12.1,两者互不干扰,只要显卡驱动版本支持较高那个CUDA版本即可。
实际操作中,我建议把信息写进环境名,时间久了看环境列表就能知道每个环境是干什么的。例如:
pytorch-cu121 pytorch-cu118 tf-gpu-py310还有个维护技巧:conda默认会把下过的包缓存起来,时间长了这些缓存可能占用好几个G的硬盘空间。定期清理很有效:
conda clean --all如果你平时用WSL2跑代码,也可以考虑在Windows和WSL2里共用一套Anaconda安装目录,或者在两边各自建环境。WSL2的好处是Linux生态更完整,很多官方脚本直接跑,但要注意WSL2里同样要先装好Windows端的NVIDIA驱动,WSL2会自动复用Windows的驱动,不需要在WSL里单独装驱动。
6.3 装好后第一件该做的事
如果你的显卡显存不大,建议从第一天写代码时就养成“数据不要全部堆到GPU”的习惯。实践中最常见的显存爆炸,往往不是版本问题,而是训练脚本里把整个数据集一次性读进了显存。正确做法是:数据加载、预处理放CPU,训练循环中把每个batch通过.to('cuda')送到GPU。
另外,强烈建议把验证命令保存成一个脚本,比如 check_env.py:
import torch print("PyTorch:", torch.__version__) print("CUDA:", torch.version.cuda) print("GPU available:", torch.cuda.is_available()) if torch.cuda.is_available(): print("GPU name:", torch.cuda.get_device_name(0)) x = torch.rand(3, 3).cuda() print("GPU compute ok:", (x * 2).sum().item())以后换了环境、更新驱动、或者突然跑不动了,先跑一遍这个脚本,再决定要不要深入排查。
最后分享一个我个人的习惯:每个项目目录里都会放一份 environment.yml 或 requirements.txt,环境一旦有变动就及时更新。不管是交给同事、换电脑,还是几个月后想重现当时的结果,都不会抓瞎。环境配置看起来只是几行命令行,本质上是在给你的项目打一个可复现的底座,这个底座稳不稳,决定了你后面省心还是闹心。