1. 为什么 PyTorch 安装这件事值得单独写一篇
如果你已经装过三四次 PyTorch,可能会觉得这话题没什么好聊的——一条命令的事。但我带过的新人里,十个有八个在第一次装 PyTorch 时卡过至少半天,而且卡住的地方高度集中:不是命令记不住,而是环境没理清楚就急着敲安装命令。装完之后import torch报错、torch.cuda.is_available()返回False、conda 和 pip 混着装出两套版本互相打架,这些问题的根子都不在安装命令本身,而在安装之前的判断和安装之后的验证。
这篇内容我打算把 PyTorch 安装与验证这件事从头到尾讲透。它适合三类人:完全没碰过深度学习框架、想一次装对不返工的初学者;装过但被环境问题折磨过、想搞清楚原理的中级使用者;以及需要给团队写一份可复现环境文档的工程同学。核心关键词就是PyTorch、安装、验证,但我会把这三个词背后的判断逻辑、参数取舍、踩坑经验全部展开,让你看完之后不只是会敲命令,而是知道每一步为什么这么敲。
先说一个反直觉的结论:PyTorch 安装的难点从来不是安装,而是"验证"。很多人装完看到没报错就以为成功了,结果跑训练时才发现用的是 CPU 版本,或者 CUDA 版本和驱动对不上,白白浪费几个小时。所以这篇的重点会放在验证环节,把"怎么确认自己真的装对了"讲清楚。
另外提前说明,本文涉及的所有操作都是本地开发环境的常规配置,不涉及任何网络访问工具相关的内容,纯粹围绕 Python 生态和深度学习框架本身展开。
2. 装之前必须想清楚的三个问题
动手之前先花五分钟回答三个问题,能帮你省掉后面至少两小时的返工。这三个问题分别是:用 conda 还是 pip、装 CPU 版还是 GPU 版、Python 版本选哪个。每一个都会直接影响你后面敲的命令。
2.1 conda 和 pip 到底该选哪个
这是新手最容易纠结的点。我的建议很直接:如果你用 Anaconda 或 Miniconda 管理环境,就用 conda 装;如果你用系统 Python 或 venv,就用 pip 装。关键是不要混用。
为什么不能混用?因为 conda 和 pip 各自维护一套依赖解析逻辑,conda 装了一部分包、pip 又装了另一部分,很容易出现同一个包存在两个版本、动态库路径冲突的情况。我见过最典型的症状是:conda list显示 torch 是 2.1,pip show torch显示是 2.0,import torch时加载的却是另一个,报错信息还特别隐晦。
从实际体验看,conda 的优势在于它能连带把 CUDA 运行时、cuDNN 这些非 Python 依赖一起装好,省去手动配环境变量的麻烦;pip 的优势是版本更新更快、包更全,尤其是某些新版本 PyTorch 在 conda 渠道上会滞后几天。所以我的取舍是:追求省心用 conda,追求最新用 pip,但一个环境里只用一种。
2.2 CPU 版和 GPU 版的分水岭在哪
很多人一上来就想装 GPU 版,但其实要先确认两件事:你的显卡是不是 NVIDIA 的、驱动版本够不够。AMD 显卡和 Mac 的 M 系列芯片走的是另一套方案(ROCm 和 MPS),不在本文的 CUDA 讨论范围内。
判断方法很简单,在命令行敲:
nvidia-smi如果这条命令能输出显卡信息和驱动版本,说明你有 NVIDIA 显卡且驱动装好了。重点看右上角的CUDA Version,这个数字代表你的驱动最高支持的 CUDA 版本,不是你已经装的 CUDA 版本。比如显示CUDA Version: 12.4,那你可以装 CUDA 12.1 或 12.4 的 PyTorch,但不能装 12.6 的。
如果nvidia-smi报"不是内部或外部命令",说明驱动没装或者显卡不是 NVIDIA 的,那就老老实实装 CPU 版。CPU 版不是不能用,只是训练大模型会慢到让你怀疑人生,做小规模实验和推理完全够。
2.3 Python 版本别追新也别守旧
PyTorch 对 Python 版本有明确的支持范围。截至我写这篇时的稳定版本,Python 3.9 到 3.11 是最稳的区间,3.12 部分版本支持但生态包(比如某些数据处理库)可能还没跟上,3.8 及以下已经逐步停止支持。
我的经验是:新项目用 3.10 或 3.11,老项目跟着原环境走。不要为了用某个新语法去装 3.13,然后发现一半的依赖装不上。conda 创建环境时可以指定版本:
conda create -n pytorch_env python=3.10 conda activate pytorch_env这里pytorch_env是环境名,你可以随便起,但建议起得有意义一点,比如dl_train、torch_gpu,别用test1、env这种,过两周你自己都忘了哪个是哪个。
提示:环境名一旦创建后改名比较麻烦,建议一开始就想好命名规则,比如按用途或按框架版本命名。
3. 分场景的安装命令与参数取舍
环境想清楚之后,安装本身其实很快。这一节我按"CPU 版""GPU 版""国内网络环境"三个场景分别给出命令,并解释每个参数为什么这么写。
3.1 CPU 版:最省事但也最容易装错
CPU 版的官方推荐命令是:
pip install torch torchvision torchaudio看起来简单,但这里有个坑:如果你之前装过 GPU 版,这条命令不一定会把 GPU 版替换掉,因为 pip 认为版本号相同就不重装。所以如果你是从 GPU 版切回 CPU 版,建议先卸载:
pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu注意后面那个--index-url,它明确指向 CPU 版本的下载源。不加这个参数,pip 可能会从默认源拉到带 CUDA 的版本,导致你明明想要 CPU 版却装了个几百 MB 的 GPU 包。
conda 装 CPU 版则是:
conda install pytorch torchvision torchaudio cpuonly -c pytorchcpuonly这个包是关键,它告诉 conda 不要装 CUDA 相关的依赖。
3.2 GPU 版:CUDA 版本必须和驱动对齐
GPU 版的命令长这样:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这里的cu121代表 CUDA 12.1。你要根据前面nvidia-smi看到的驱动支持版本来选,常见的有cu118、cu121、cu124。选错了会怎样?轻则torch.cuda.is_available()返回False,重则 import 时直接报找不到动态库。
conda 版本:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia注意-c nvidia这个渠道,CUDA 相关的包在 NVIDIA 自己的渠道里,不加会找不到。
我整理了一张对照表,方便你快速判断:
| 驱动显示的 CUDA Version | 推荐安装的 PyTorch CUDA 版本 | 说明 |
|---|---|---|
| 11.8 | cu118 | 老驱动,兼容性好 |
| 12.1 | cu121 | 目前最稳的组合 |
| 12.4 | cu124 | 较新,部分包生态还在跟进 |
| 12.6 及以上 | cu124 或更高 | 按官方最新支持选 |
注意:驱动版本高于 PyTorch 要求的 CUDA 版本是没问题的,向下兼容;反过来则不行。所以驱动新一点反而更灵活。
3.3 网络慢的时候怎么办
官方源在国内访问有时候会很慢,这时候可以换镜像源。但换源有个原则:镜像源要和你装的版本匹配,不能随便找个源就装。
pip 换源的方式是加-i参数:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple但要注意,清华源这类通用镜像不一定同步了所有 CUDA 版本的 PyTorch 包,如果装 GPU 版失败,还是建议回到官方源加--index-url。
conda 换源则是修改.condarc文件,把 channels 指向镜像。这个操作我建议谨慎,因为 conda 的镜像同步有时会有延迟,导致你装到的版本比官方旧。我的做法是:CPU 版和通用包用镜像,GPU 版和 CUDA 相关包坚持用官方源。
4. 验证环节:怎么确认自己真的装对了
这一节是全文的核心。安装命令敲完不报错,不代表装对了。下面这套验证流程,我建议每次装完都完整跑一遍。
4.1 第一层验证:能不能 import
最基础的验证:
import torch print(torch.__version__)如果这步就报错,说明安装本身有问题,常见原因是环境没激活、装到了别的 Python 环境里。这时候先确认:
which python # Linux/Mac where python # Windows输出的路径应该指向你当前激活的环境。如果指向系统 Python,说明环境没激活成功。
4.2 第二层验证:CUDA 到底能不能用
这步是 GPU 用户的重灾区:
import torch print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))is_available()返回True才算 GPU 版装成功。如果返回False,按下面这个顺序排查:
- 确认装的是 GPU 版而不是 CPU 版:
print(torch.version.cuda),如果是None,说明装的是 CPU 版。 - 确认驱动版本够:回到
nvidia-smi看驱动支持的 CUDA 版本。 - 确认 CUDA 版本匹配:
torch.version.cuda显示的版本要小于等于驱动支持的版本。
我踩过最坑的一次是:驱动是 11.7,我装了 cu118 的 PyTorch,is_available()一直返回False,查了半天才发现是驱动太老。升级驱动后立刻就好了。
4.3 第三层验证:跑一个真实的小计算
前两层过了,还要跑一个实际计算确认没有隐藏问题:
import torch # 创建一个张量并做矩阵乘法 x = torch.randn(3, 3) y = torch.randn(3, 3) z = torch.matmul(x, y) print(z) # 如果有 GPU,把计算放到 GPU 上 if torch.cuda.is_available(): x_gpu = x.to('cuda') y_gpu = y.to('cuda') z_gpu = torch.matmul(x_gpu, y_gpu) print(z_gpu) print(z_gpu.device)这步能跑通,说明从 Python 层到 CUDA 层的整条链路都是通的。如果 GPU 计算报错,通常是 CUDA 运行时和 PyTorch 编译版本不匹配。
4.4 第四层验证:torchvision 和 torchaudio 是否配套
很多人只验证 torch,忽略了 torchvision 和 torchaudio。这三个包的版本必须配套,否则会出现奇怪的兼容问题:
import torch import torchvision import torchaudio print(torch.__version__) print(torchvision.__version__) print(torchaudio.__version__)版本对应关系可以去 PyTorch 官网的版本矩阵查。一般来说,同一批命令装下来的三个包是配套的,但如果你是分开装的,就要特别留意。
5. 那些年我踩过的安装坑
这一节不讲理论,只讲真实踩过的坑和排查过程。这些经验在官方文档里基本找不到,但实际工作中遇到概率极高。
5.1 conda 命令找不到:环境变量没配
Windows 上装完 Miniconda 后,新开命令行敲conda提示"无法将 conda 项识别为 cmdlet",这是最经典的坑。原因是安装时没勾选"Add to PATH",或者勾了但当前终端没刷新。
解决办法有两个:一是重新运行安装程序勾选添加 PATH;二是手动把 conda 的Scripts和condabin目录加到系统环境变量里。我一般推荐第二种,因为可控。
Linux 和 Mac 上则是把 conda 的初始化脚本加到.bashrc或.zshrc:
source ~/miniconda3/etc/profile.d/conda.sh5.2 pip 装完 import 报 DLL 错误
Windows 上偶尔会遇到ImportError: DLL load failed,这通常是缺了 Visual C++ 运行库。装一个 Microsoft Visual C++ Redistributable 基本能解决。另一个可能是 numpy 版本冲突,PyTorch 对 numpy 版本有要求,太新或太旧都可能出问题。
排查方法:
pip show numpy如果版本特别新(比如 2.x),可以试着降到 1.26 左右。
5.3 装完发现装到了 base 环境
这是新手高频错误:忘了conda activate,直接在 base 环境里装了一堆包,把 base 环境搞得乱七八糟。base 环境是 conda 自己用的,不建议往里装项目依赖。
补救办法是卸载重装到新环境。预防办法是养成习惯:装任何包之前先看命令行提示符前面有没有环境名。
5.4 版本号看着对但功能不对
有一次我装完 PyTorch,torch.__version__显示 2.1.0,但某些新 API 用不了。查了半天发现是装到了预发布版本或者某个 fork 版本。这种情况在用了非官方源时更容易出现。
所以验证时不要只看版本号,还要实际调用一下你要用的 API。比如你要用torch.compile,就实际跑一下确认能用。
6. 装完之后的环境固化与复用
装好一个能用的环境不容易,所以一定要固化下来,方便以后复现或者分享给同事。
6.1 导出环境依赖清单
conda 环境导出:
conda env export > environment.ymlpip 环境导出:
pip freeze > requirements.txt两者的区别是:environment.yml会记录 conda 渠道信息和 Python 版本,复现更完整;requirements.txt只记录 pip 包,跨平台兼容性更好但可能漏掉非 Python 依赖。
我的习惯是两个都导出,environment.yml用于自己复现,requirements.txt用于分享给不用 conda 的人。
6.2 复现环境时的注意事项
用environment.yml复现时:
conda env create -f environment.yml注意导出的文件里可能包含prefix字段,记录了原环境的绝对路径,换机器复现时这个字段会导致问题,建议手动删掉。
用requirements.txt复现时:
pip install -r requirements.txt如果里面有 CUDA 相关的包,要确认目标机器的驱动版本匹配,否则会装出问题。
6.3 给团队写环境文档的模板
如果是团队协作,我建议在 README 里写清楚这几项:Python 版本、PyTorch 版本、CUDA 版本、安装命令、验证脚本。验证脚本可以直接用第 4 节的那几段代码,让每个人装完自己跑一遍,比口头交代靠谱得多。
7. 关于验证集的一点延伸
热词里出现了"训练集 测试集 验证集",虽然和安装本身不是一回事,但既然装 PyTorch 是为了做深度学习,这里顺带说一句:环境验证和数据集的验证集是两码事,别混淆。
环境验证是确认框架装对了,数据集划分里的验证集是模型训练时用来调超参的。前者是工程问题,后者是算法问题。我见过新人把这两个概念搞混,以为torch.cuda.is_available()返回 True 就代表模型能训好,这完全是两回事。
装好环境只是起点,后面还有数据准备、模型定义、训练循环、评估指标一大堆事。但环境这关过不去,后面全是空谈。所以花时间把安装和验证做扎实,是性价比最高的投入。
最后分享一个我自己的习惯:每次在新机器上装完 PyTorch,我都会把第 4 节的验证脚本存成一个check_env.py文件,放在项目根目录。换机器、换环境、升级版本之后,第一件事就是跑这个脚本。三秒钟出结果,比任何排查都高效。这个脚本我用了三年,帮我省下的时间大概够我多写好几个模型了。