1. 为什么本地深度学习环境值得折腾一次
刚入行那会儿,我最怕听到的一句话就是“你先配个环境”。明明代码就几十行,结果在环境上耗掉一整天,最后还跑不起来。后来带过几个新人,发现大家卡的地方几乎一模一样:显卡驱动版本对不上、CUDA和PyTorch版本错位、Vscode找不到解释器、conda环境装了一堆却互相打架。这些问题单看都不难,但凑在一起就变成一团乱麻。
这篇内容就是把我这些年反复装环境、反复踩坑的经验整理出来,围绕PyTorch安装、Anaconda环境管理、CUDA配置、Vscode开发环境搭建这四件事,给一套能直接照着做的完整流程。不管你是刚接触深度学习的学生,还是想从CPU训练切到GPU训练的老手,只要手里有一台带NVIDIA显卡的机器,这套流程都能用。没有显卡的机器也能跟着走,只是CUDA那部分跳过即可,PyTorch照样能跑CPU版本。
我尽量不写成说明书,而是把每一步“为什么这么做”讲清楚。比如为什么推荐用conda而不是pip装PyTorch,为什么CUDA版本要倒着推而不是正着选,为什么Vscode里要单独选解释器。这些细节才是真正决定你装一次能用半年的关键。整套流程我会按“先规划、再动手、后验证”的顺序展开,中间穿插我实际踩过的坑和排查思路,争取让你少走弯路。
2. 装之前先把版本关系理清楚
2.1 三个版本之间的依赖链条
很多人装环境失败,根本原因不是操作错了,而是一开始版本就没选对。这里有一条铁律:显卡驱动决定CUDA版本上限,CUDA版本决定PyTorch版本。顺序不能反。
具体来说,你的NVIDIA显卡驱动有一个支持的最高CUDA版本,这个信息可以通过命令行查到。然后PyTorch官方会针对不同的CUDA版本发布对应的安装包,比如cu118对应CUDA 11.8,cu121对应CUDA 12.1。你要做的是:先看驱动支持到哪个CUDA,再在这个范围内选一个PyTorch官方支持的CUDA版本,最后装对应版本的PyTorch。
我见过太多人反过来操作:先在网上抄了一个PyTorch安装命令,装完发现torch.cuda.is_available()返回False,然后开始怀疑人生。其实问题就出在版本链条断了。
2.2 一张表看懂版本对应关系
下面这张表是我根据常见组合整理的,实际以PyTorch官网为准,但大方向不会错:
| 显卡驱动版本区间 | 支持的最高CUDA | 推荐PyTorch CUDA版本 | 备注 |
|---|---|---|---|
| 450.x 及以上 | CUDA 11.0 | cu111 | 较老,新项目不建议 |
| 470.x 及以上 | CUDA 11.4 | cu113 | 稳定但偏旧 |
| 515.x 及以上 | CUDA 11.7 | cu117 | 兼容性好 |
| 525.x 及以上 | CUDA 11.8 | cu118 | 目前最推荐 |
| 535.x 及以上 | CUDA 12.2 | cu121 | 新卡首选 |
注意:这里的“支持的最高CUDA”指的是驱动能兼容的CUDA运行时上限,不是说你必须装到最高。选一个PyTorch官方长期维护的版本更稳妥,比如cu118。
2.3 为什么优先用conda而不是pip
PyTorch官方两种安装方式都提供:conda和pip。我的建议是,只要你在用Anaconda,就优先用conda装PyTorch。原因有三个。
第一,conda会把CUDA运行时、cuDNN这些底层依赖一起打包管理,不需要你单独去装CUDA Toolkit。pip装的PyTorch虽然也自带CUDA运行时,但在某些系统上会出现动态库找不到的问题。第二,conda的环境隔离更彻底,不同项目之间的CUDA版本可以完全独立,不会互相污染。第三,conda卸载干净,pip有时候会留下残留文件。
当然conda也有缺点,就是下载慢、占空间大。如果你网络条件不好,可以配置国内镜像源,这个后面会讲。
3. Anaconda安装与环境管理实操
3.1 安装Anaconda的正确姿势
Anaconda的安装本身不难,但有几个选项会影响后续使用体验。下载安装包的时候,建议去官网下载对应系统的版本,Windows选exe,macOS和Linux选sh。安装过程中有两个勾选项需要特别注意。
Windows安装时,会问你是否“Add Anaconda to my PATH environment variable”。官方默认是不勾的,理由是避免和其他Python冲突。但我的经验是,如果你机器上没装过其他Python,勾上会更方便,这样在任意终端都能直接用conda命令。如果你已经装了其他Python,那就别勾,改用Anaconda Prompt来操作。
另一个选项是“Register Anaconda as my default Python”,这个建议勾上。装完之后,打开终端输入conda --version,能输出版本号就说明装好了。
Linux和macOS用户安装完后,需要手动初始化一下shell,执行conda init,然后重开终端。这一步不做的话,conda命令用不了。
3.2 创建独立环境的完整命令
装好Anaconda后,第一件事不是急着装PyTorch,而是先建一个独立环境。我习惯给每个项目建一个环境,名字取有意义一点,比如dl-cu118。
conda create -n dl-cu118 python=3.10这里指定Python 3.10是有讲究的。PyTorch对Python版本有要求,太新的Python可能还没有对应的wheel包,太旧的又可能不支持新特性。3.10是目前兼容性最好的版本之一,3.11也可以,但3.12在某些CUDA版本上还会遇到问题。
创建完环境后激活:
conda activate dl-cu118激活后终端提示符前面会出现环境名,说明你已经在环境里了。接下来所有操作都在这个环境里进行,不会影响系统Python。
3.3 配置国内镜像源加速下载
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查看当前源。如果以后想恢复默认,把.condarc文件删掉或者改回来就行。
提示:镜像源偶尔会同步延迟,如果发现某个包版本比官方旧,可以临时用官方源装,装完再切回来。
3.4 环境管理的几个实用命令
环境用久了会越来越多,这里列几个我常用的管理命令:
- 查看所有环境:conda env list
- 删除某个环境:conda env remove -n 环境名
- 导出环境配置:conda env export > environment.yml
- 从文件恢复环境:conda env create -f environment.yml
- 查看当前环境已装的包:conda list
导出环境这个功能特别有用,换机器或者分享给同事的时候,一条命令就能复现整个环境。不过要注意,export出来的文件会包含具体版本号,跨平台可能会有差异,必要时手动调整。
4. CUDA与cuDNN配置要点
4.1 先查驱动支持的最高CUDA版本
在装CUDA之前,先确认你的显卡驱动支持到哪个版本。打开终端执行:
nvidia-smi输出右上角会显示“CUDA Version: 12.2”之类的信息,这就是你的驱动支持的最高CUDA版本。注意,这只是上限,你实际装的CUDA可以低于这个值。
如果nvidia-smi命令找不到,说明驱动没装好或者没加到PATH。Windows用户可以去NVIDIA官网下载对应显卡的驱动重新装,Linux用户可以用系统包管理器装。
4.2 用conda装CUDA还是单独装
这是很多人纠结的问题。我的建议是:如果你用conda装PyTorch,就不需要单独装CUDA Toolkit。因为conda安装的PyTorch包(比如pytorch-cuda=11.8)会自动带上对应的CUDA运行时和cuDNN,你直接用就行。
那什么时候需要单独装CUDA Toolkit?两种情况:一是你要编译自定义的CUDA算子,需要nvcc编译器;二是你用pip装PyTorch,某些情况下需要系统里有CUDA。对于绝大多数只跑现成模型的人来说,conda方案足够了。
如果你确实需要单独装,去NVIDIA官网下载对应版本的CUDA Toolkit安装包,安装时选择“自定义”,把Visual Studio Integration之类的用不上的组件取消掉,能省不少空间。
4.3 cuDNN的版本匹配问题
cuDNN是NVIDIA的深度神经网络加速库,PyTorch依赖它来做卷积等操作。用conda装PyTorch时,cuDNN会自动匹配好,不用管。但如果你是手动装CUDA Toolkit,就需要单独下载cuDNN,并且版本要和CUDA对应。
cuDNN的安装方式是把压缩包里的文件复制到CUDA安装目录对应的文件夹里。Windows下是bin、include、lib三个目录,Linux下类似。复制完记得把bin目录加到PATH。
注意:cuDNN版本和CUDA版本必须严格对应,比如CUDA 11.8要配cuDNN 8.7.x或8.8.x,装错了会出现“找不到cudnn64_8.dll”之类的报错。
4.4 验证CUDA是否可用
装完CUDA后,可以用一个简单命令验证:
nvcc --version能输出版本信息就说明CUDA Toolkit装好了。但要注意,nvcc是编译器,PyTorch运行时不依赖它。真正判断PyTorch能不能用GPU,还是看torch.cuda.is_available()。
5. PyTorch安装的两种主流方案
5.1 conda安装法(推荐)
在激活的conda环境里,执行下面这条命令(以CUDA 11.8为例):
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia这条命令会从pytorch和nvidia两个channel拉取包。pytorch-cuda=11.8这个参数是关键,它告诉conda装带CUDA 11.8支持的版本。如果你要装CPU版本,把pytorch-cuda参数去掉,改成:
conda install pytorch torchvision torchaudio cpuonly -c pytorch安装过程可能比较慢,耐心等。装完后用下面的代码验证:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果第二行输出True,第三行输出你的显卡型号,就说明装好了。
5.2 pip安装法(备选)
有些情况下conda装不上,比如网络问题或者channel冲突,这时候可以用pip。去PyTorch官网的安装页面,选好版本后会生成对应的pip命令,类似:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118pip安装的优点是快,缺点是CUDA运行时依赖系统环境,如果系统里没有对应的CUDA,可能会报错。所以pip方案更适合已经装好CUDA Toolkit的机器。
5.3 安装后的验证清单
装完PyTorch后,我习惯跑一个完整的验证脚本,确认各个组件都正常:
import torch import torchvision # 基础信息 print("PyTorch版本:", torch.__version__) print("TorchVision版本:", torchvision.__version__) print("CUDA可用:", torch.cuda.is_available()) if torch.cuda.is_available(): print("CUDA版本:", torch.version.cuda) print("cuDNN版本:", torch.backends.cudnn.version()) print("显卡数量:", torch.cuda.device_count()) print("当前显卡:", torch.cuda.get_device_name(0)) # 实际跑一个张量运算 x = torch.randn(1000, 1000).cuda() y = torch.randn(1000, 1000).cuda() z = torch.mm(x, y) print("矩阵乘法结果形状:", z.shape) print("GPU运算正常")这个脚本能跑通,说明环境基本没问题了。如果中间报错,根据报错信息定位,常见的是CUDA版本不匹配或者显存不足。
6. Vscode开发环境配置
6.1 必装的几个插件
Vscode本身只是个编辑器,要写Python需要装插件。我必装的几个:
- Python:微软官方插件,提供语法高亮、调试、解释器选择等功能。
- Pylance:类型检查和智能提示,写代码的时候能提前发现错误。
- Jupyter:如果你用notebook写代码,这个必须有。
- GitLens:看代码提交历史,团队协作时很有用。
装插件直接在Vscode的扩展面板搜索名字,点安装就行。
6.2 选择conda环境的解释器
这是新手最容易卡的地方。装好插件后,按Ctrl+Shift+P(macOS是Cmd+Shift+P)打开命令面板,输入“Python: Select Interpreter”,然后从列表里找到你刚才创建的conda环境。
如果列表里没有,点“Enter interpreter path”,手动找到conda环境的python.exe(Windows)或python(Linux/macOS)。conda环境一般在Anaconda安装目录下的envs文件夹里,比如:
C:\Users\你的用户名\anaconda3\envs\dl-cu118\python.exe选好之后,Vscode左下角会显示当前解释器。新建一个.py文件,写几行代码,按F5运行,如果能正常输出就说明配置好了。
6.3 配置launch.json和settings.json
为了让调试更顺手,可以配置一下launch.json。在项目根目录建一个.vscode文件夹,里面放launch.json:
{ "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "justMyCode": true } ] }这个配置的意思是:调试当前打开的文件,用集成终端输出,只调试自己的代码不进入库代码。justMyCode设为true能避免调试时跳进PyTorch源码里出不来。
settings.json里可以配置一些格式化选项:
{ "python.formatting.provider": "black", "editor.formatOnSave": true, "python.linting.enabled": true }这样保存文件时自动格式化,代码风格统一。
6.4 远程开发场景的处理
如果你在服务器上跑代码,本地用Vscode编辑,可以用Remote-SSH插件。装好插件后,按F1输入“Remote-SSH: Connect to Host”,配置服务器地址和用户名,连上之后就像在本地一样操作。
远程开发的好处是,重活都在服务器上跑,本地机器只负责编辑。配置的时候注意,服务器上也要装好conda环境和Vscode Server,第一次连接会自动装。
7. 常见报错与排查思路
7.1 torch.cuda.is_available()返回False
这是最高频的问题。排查顺序如下:
- 先确认显卡是NVIDIA的,AMD和Intel显卡不支持CUDA。
- 执行nvidia-smi,看驱动是否正常。如果命令找不到,说明驱动没装。
- 检查PyTorch版本和CUDA版本是否匹配。用conda list查看pytorch和pytorch-cuda的版本。
- 如果装的是CPU版本,那当然返回False,重新装GPU版本。
我遇到过一次,驱动正常、版本也对,但就是False。后来发现是conda环境里同时装了CPU和GPU两个版本的PyTorch,冲突了。卸载重装解决。
7.2 报错“CUDA out of memory”
显存不够。解决方法有几个:减小batch size、用梯度累积、清理缓存(torch.cuda.empty_cache())、或者换更小的模型。如果是推理阶段,可以用torch.no_grad()减少显存占用。
提示:nvidia-smi显示的显存占用包括其他进程,如果看到显存被占满但你的程序没跑,可能是之前的进程没退干净,用nvidia-smi找到PID然后kill掉。
7.3 conda安装时Solving environment卡住
conda在解析依赖的时候会卡很久,尤其是环境复杂的时候。解决办法是换用mamba,它是conda的C++重写版,速度快很多。安装mamba:
conda install -n base -c conda-forge mamba之后把conda命令换成mamba就行,用法完全一样。
7.4 Vscode找不到conda环境
有时候Vscode的Python插件识别不到conda环境。可以尝试:重启Vscode、重新加载窗口(Ctrl+Shift+P输入Reload Window)、或者手动指定解释器路径。如果还不行,检查conda是否在PATH里,或者用Anaconda Prompt启动Vscode。
7.5 常见问题速查表
| 报错信息 | 可能原因 | 解决方法 |
|---|---|---|
| torch.cuda.is_available() False | 版本不匹配/驱动问题 | 检查驱动和CUDA版本 |
| CUDA out of memory | 显存不足 | 减小batch size/清理缓存 |
| Solving environment 卡住 | conda解析慢 | 换mamba |
| 找不到cudnn64_8.dll | cuDNN版本不对 | 重装匹配版本 |
| No module named torch | 环境没选对 | 检查Vscode解释器 |
| nvcc command not found | CUDA没加PATH | 手动添加环境变量 |
8. 我踩过的几个坑和实用建议
第一个坑是混用pip和conda。有一次我先用pip装了PyTorch,后来觉得版本不对,又用conda装了一遍,结果两个版本混在一起,torch.cuda.is_available()时好时坏。后来养成习惯,一个环境里只用一种包管理器,要么全conda,要么全pip。
第二个坑是环境名乱取。刚开始图省事,环境名就叫test、env1,过两个月完全不知道哪个环境是干什么的。现在我的命名规则是“项目名-框架-版本”,比如detection-cu118,一眼就知道用途。
第三个坑是忘了导出环境。有次换电脑,想把环境迁过去,结果发现没导出配置文件,只能凭记忆重装,折腾了半天。现在每个项目根目录都放一个environment.yml,随时能复现。
第四个坑是Vscode的终端没激活环境。Vscode默认终端可能不是conda环境,导致在终端里pip install装到了系统Python。解决办法是在settings.json里配置默认终端,或者在终端里手动conda activate。
最后分享一个小技巧:装完环境后,先跑一个最小的训练脚本,比如用MNIST训练一个简单的CNN,确认整个链路(数据加载、GPU运算、反向传播)都正常。这比单纯验证torch.cuda.is_available()更靠谱,因为有些问题只有在实际训练时才会暴露。
这套流程我用了好几年,从Windows到Linux,从单卡到多卡,基本都能覆盖。环境配置这件事,第一次装可能花半天,但把版本关系和排查思路理清楚之后,以后换机器半小时就能搞定。真正花时间的不是操作本身,而是理解每一步背后的逻辑。希望这篇内容能帮你把这块硬骨头啃下来。