1. 为什么 PyTorch 安装这件事值得单独写一篇
如果你刚接触深度学习,大概率会遇到这样一个场景:跟着教程敲了几行代码,结果第一句import torch就报错,然后开始在各种论坛里翻帖子,折腾一整个下午,最后发现是版本对不上。这不是你笨,而是 PyTorch 的安装确实有几个容易踩的坑——它不像pip install requests那样装完就能用,背后牵扯到 Python 版本、CUDA 驱动、显卡算力、操作系统差异等一连串变量。
我前后在 Windows、Linux、macOS 三种系统上装过不下二十次 PyTorch,从最早用 conda 装到后来用 pip 装,从 CPU 版本到各种 CUDA 版本,踩过的坑基本能写一本小册子。这篇文章就是把这些经验整理出来,从环境判断、安装方式选择、到装完之后的验证,一步步讲清楚。不管你是刚入门的新手,还是换了新机器需要重新配环境的老手,都能从这里找到可以直接抄作业的方案。
核心关键词就三个:PyTorch、安装、验证。但我想聊的不只是"怎么装",更重要的是"为什么这么装"以及"装完怎么确认它真的能用"。很多人装完看到import torch不报错就以为万事大吉,结果跑模型的时候才发现 GPU 根本没用上,这种问题在验证环节就能提前发现。
2. 装之前先搞清楚:你的环境到底适合哪种装法
2.1 三种安装方式的本质区别
PyTorch 官方提供的安装方式主要有三种:conda、pip、以及从源码编译。对绝大多数人来说,前两种就够了,源码编译只在特殊需求下才用。
conda 安装的优势在于它会帮你管理 CUDA 运行时和 cuDNN 这些底层依赖,你不需要单独去装 CUDA Toolkit。缺点是 conda 的包体积大,环境创建慢,而且有时候国内下载速度感人。pip 安装的优势是快、轻量,PyTorch 官方从 1.13 之后对 pip 的支持已经非常完善,pip 装的 wheel 包里已经包含了 CUDA 运行时,同样不需要你单独装 CUDA Toolkit。缺点是它不管你的 Python 环境隔离,你得自己用 venv 或者 conda 创建虚拟环境。
我个人的建议是:如果你已经在用 conda 管理环境,那就继续用 conda 装;如果你习惯用 venv + pip,那就用 pip 装。两者没有绝对优劣,关键是别混着用——在 conda 环境里用 pip 装 PyTorch 有时候会出现依赖冲突,这个后面会细说。
2.2 先确认你的显卡和驱动情况
这一步很多人会跳过,但它恰恰是最关键的。你得先知道自己有没有 NVIDIA 显卡、驱动版本是多少、支持的最高 CUDA 版本是多少。
在 Windows 上,打开命令行输入:
nvidia-smi在 Linux 上同样:
nvidia-smi这个命令会输出一个表格,右上角会显示CUDA Version: 12.x这样的信息。注意,这个 CUDA Version 指的是你的驱动支持的最高 CUDA 版本,不是你已经安装的 CUDA 版本。比如显示 12.4,意味着你可以安装任何 CUDA 版本 ≤ 12.4 的 PyTorch。
如果没有 NVIDIA 显卡,或者nvidia-smi命令找不到,那你就只能装 CPU 版本。CPU 版本也能跑模型,只是训练速度会慢很多,做推理或者学习阶段完全够用。
提示:AMD 显卡和 Apple Silicon 芯片的情况不同。Mac 的 M 系列芯片用 MPS 加速,安装时选对应版本即可;AMD 显卡在 Windows 上支持有限,建议直接用 CPU 版本或者考虑 Linux 环境。
2.3 Python 版本的选择
PyTorch 对 Python 版本有要求,太新或太旧都可能装不上。截至我写这篇文章的时候,PyTorch 2.x 系列支持的 Python 版本大致是 3.9 到 3.12。Python 3.13 刚出来那会儿,很多包还没跟上,装 PyTorch 会报找不到对应 wheel 的错误。
我的建议是用 Python 3.10 或 3.11,这两个版本兼容性最好,社区支持也最完善。如果你系统里装的是 3.12,一般也没问题。但如果你用的是 3.8 或更早的版本,建议升级,因为新版本的 PyTorch 已经不再支持了。
检查 Python 版本:
python --version或者:
python3 --version3. 手把手实操:从零到跑通第一个张量
3.1 创建独立的虚拟环境
不管你用 conda 还是 venv,第一步都是创建独立环境。这一步的意义在于把 PyTorch 的依赖和你系统里其他项目的依赖隔离开,避免版本冲突。
用 conda 的话:
conda create -n pytorch_env python=3.11 conda activate pytorch_env用 venv 的话:
python -m venv pytorch_env # Windows pytorch_env\Scripts\activate # Linux/macOS source pytorch_env/bin/activate创建完之后,命令行前面会出现(pytorch_env)这样的标识,说明你已经进入虚拟环境了。后面所有的安装操作都在这个环境里进行。
注意:如果你在 Windows 上执行
conda activate时报"无法将 conda 项识别"的错误,说明 conda 没有加到系统 PATH 里。解决办法是打开 Anaconda Prompt 而不是普通的 cmd 或 PowerShell,或者手动把 conda 的路径加到环境变量里。
3.2 选择正确的安装命令
这是最容易出错的一步。PyTorch 官网的安装页面会根据你选择的选项生成对应的命令,但很多人不看选项直接复制粘贴,结果装了个 CPU 版本还纳闷为什么 GPU 用不了。
我以几个常见场景为例,给出具体的命令。
场景一:Windows + NVIDIA 显卡 + CUDA 12.1 + pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121场景二:Linux + NVIDIA 显卡 + CUDA 12.1 + pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121场景三:macOS + Apple Silicon + pip
pip install torch torchvision torchaudio场景四:纯 CPU 版本 + pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu场景五:用 conda 安装 CUDA 12.1 版本
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia这里解释一下几个关键点。--index-url指定的是 PyTorch 官方的 wheel 下载源,不同 CUDA 版本对应不同的 URL 后缀,比如 cu118 对应 CUDA 11.8,cu121 对应 CUDA 12.1,cu124 对应 CUDA 12.4。如果你不指定--index-url,pip 默认从 PyPI 下载,PyPI 上的版本通常是 CPU 版本或者默认 CUDA 版本,不一定符合你的需求。
torchvision和torchaudio是 PyTorch 的配套库,分别处理视觉和音频任务。即使你暂时用不到,也建议一起装上,因为很多第三方库会依赖它们。
3.3 国内下载慢的解决办法
PyTorch 的 wheel 包体积很大,CUDA 版本动辄两三个 GB,从官方源下载在国内可能会很慢甚至超时。这时候可以用国内镜像源加速。
清华源的使用方式:
pip install torch torchvision torchaudio --index-url https://pypi.tuna.tsinghua.edu.cn/simple但要注意,清华源同步的通常是 CPU 版本或者默认版本,如果你需要特定 CUDA 版本,可能还是得从官方源下载。另一种做法是先用官方源下载,配合--timeout参数延长超时时间:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 --timeout 300如果下载中断了,pip 支持断点续传,重新执行同样的命令即可,已经下载的部分不会重新下。
实操心得:我一般会先用
pip download把 wheel 包下载到本地,再用pip install从本地安装。这样即使网络不稳定,也不会影响安装过程。命令是pip download torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 -d ./wheels,下载完再pip install --no-index --find-links=./wheels torch torchvision torchaudio。
3.4 安装后的目录结构
装完之后,你可以用pip show torch看一下安装位置和版本信息:
pip show torch输出会包含 Name、Version、Location 等信息。Location 指向的就是 PyTorch 安装的目录,通常在虚拟环境的site-packages下面。你可以进去看看,会发现 torch 目录下有lib文件夹,里面包含了 CUDA 相关的动态链接库(如果是 GPU 版本的话)。这也是为什么 pip 装的 GPU 版本不需要单独装 CUDA Toolkit——运行时库已经打包在里面了。
4. 验证环节:不只看 import 成不成功
4.1 基础验证:版本和 CUDA 可用性
装完之后,打开 Python 交互环境,依次执行以下代码:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))这几行代码分别检查:PyTorch 版本号、CUDA 是否可用、可用 GPU 数量、第一块 GPU 的名称。
如果torch.cuda.is_available()返回True,说明 GPU 版本安装成功。如果返回False,但你有 NVIDIA 显卡,那可能是以下几种情况:装的是 CPU 版本、驱动版本太低、CUDA 版本和驱动不匹配。
如果torch.cuda.device_count()返回 0,同样说明 CUDA 不可用。如果返回大于 1 的数字,说明你有多个 GPU,可以用torch.cuda.get_device_name(i)逐个查看。
4.2 进阶验证:实际跑一个 GPU 运算
is_available()返回 True 只是第一步,真正要确认 GPU 能干活,得实际跑一个运算:
import torch # 创建一个张量并移到 GPU 上 x = torch.randn(1000, 1000).cuda() y = torch.randn(1000, 1000).cuda() # 做矩阵乘法 z = torch.matmul(x, y) # 把结果移回 CPU 并打印 print(z.sum().item()) print(z.device)如果这段代码能正常跑完并输出结果,说明 GPU 运算链路是通的。z.device应该输出cuda:0,表示结果在 GPU 上。
你还可以进一步测试显存占用:
print(torch.cuda.memory_allocated()) print(torch.cuda.max_memory_allocated())这两个函数分别返回当前分配的显存和峰值显存,单位是字节。跑完上面的矩阵乘法后,应该能看到非零的数值。
4.3 验证 cuDNN 是否可用
cuDNN 是 NVIDIA 的深度神经网络加速库,PyTorch 在跑卷积等操作时会用到它。验证方式:
print(torch.backends.cudnn.is_available()) print(torch.backends.cudnn.version())如果返回 True 和一个版本号,说明 cuDNN 正常。如果返回 False,可能是安装的 PyTorch 版本没有打包 cuDNN,或者 CUDA 版本不匹配。
4.4 验证常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
import torch报 ModuleNotFoundError | 没装或者装到了别的环境 | 确认当前虚拟环境,重新安装 |
torch.cuda.is_available()返回 False | 装的是 CPU 版本 | 卸载后重装 GPU 版本 |
torch.cuda.is_available()返回 False | 驱动版本太低 | 更新 NVIDIA 驱动 |
torch.cuda.is_available()返回 False | CUDA 版本和驱动不匹配 | 换一个 CUDA 版本的 PyTorch |
| 安装时提示找不到匹配的 wheel | Python 版本不兼容 | 换 Python 3.10/3.11 |
| 安装时下载超时 | 网络问题 | 用国内源或延长 timeout |
| 跑 GPU 运算时报 CUDA out of memory | 显存不够 | 减小 batch size 或换小模型 |
torch.backends.cudnn.is_available()返回 False | cuDNN 未正确安装 | 重装对应 CUDA 版本的 PyTorch |
5. 那些年我踩过的坑和独家经验
5.1 conda 和 pip 混用的坑
这是我最想强调的一点。在 conda 环境里用 pip 装 PyTorch,有时候会出现这样的情况:pip 装的 PyTorch 依赖某个版本的 numpy,但 conda 环境里已经装了另一个版本的 numpy,结果 import 的时候报错,或者跑着跑着出现奇怪的段错误。
原因是 conda 和 pip 各自维护一套依赖解析机制,它们互相不知道对方装了什么。解决办法是:在一个环境里只用一种包管理器。如果你用 conda 创建的环境,就全部用 conda 装;如果你习惯 pip,就用 venv 创建环境,全部用 pip 装。
如果已经混用了并且出了问题,最干净的做法是删掉环境重建:
conda remove -n pytorch_env --all conda create -n pytorch_env python=3.11 conda activate pytorch_env # 然后只用 conda 装 conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia5.2 驱动版本和 CUDA 版本的对应关系
很多人搞不清楚驱动版本、CUDA 版本、PyTorch 版本之间的关系。我用一个生活化的类比来解释:驱动就像是你的手机系统,CUDA 就像是某个 App 的版本,PyTorch 就是那个 App。手机系统太旧,装不了新版 App;App 版本太高,旧系统也跑不起来。
具体来说,nvidia-smi显示的 CUDA Version 是你的驱动支持的最高 CUDA 版本。你可以安装任何不高于这个版本的 CUDA 对应的 PyTorch。比如显示 12.4,你可以装 cu121、cu118,但不能装 cu124 以上的。
如果你不确定该装哪个版本,一个简单的原则是:装比驱动支持的最高版本低一到两个小版本的 CUDA。比如驱动支持 12.4,那就装 cu121,这样兼容性最稳。
5.3 Windows 上的路径和权限问题
Windows 用户经常会遇到两个问题。一是路径里有中文或空格,导致某些包安装失败。解决办法是把虚拟环境建在纯英文、无空格的路径下,比如D:\envs\pytorch_env。
二是权限问题,pip 安装时提示 Permission denied。这通常是因为没有用管理员权限,或者目标目录被占用。解决办法是右键以管理员身份运行命令行,或者加上--user参数装到用户目录。
还有一个 Windows 特有的坑:如果你之前装过 CUDA Toolkit,系统 PATH 里可能有旧版本的 CUDA 路径,导致 PyTorch 加载了错误的动态链接库。检查方式是echo %PATH%,看看有没有多个 CUDA 路径。如果有,把不需要的删掉,或者调整顺序。
5.4 验证时容易忽略的细节
很多人验证只跑import torch和torch.cuda.is_available(),看到 True 就结束了。但实际上还有几个细节值得检查。
第一,确认torch.version.cuda和你预期的一致:
print(torch.version.cuda)这个输出的是 PyTorch 编译时使用的 CUDA 版本,应该和你安装时选择的版本一致。如果装的是 cu121,这里应该显示 12.1。
第二,确认torch.cuda.get_device_capability()返回的算力等级:
print(torch.cuda.get_device_capability(0))这个返回一个元组,比如(8, 6)表示算力 8.6。不同的 GPU 算力等级不同,某些新版本的 PyTorch 可能不再支持太老的算力等级。如果你的 GPU 算力太低,可能需要装旧版本的 PyTorch。
第三,跑一个简单的训练循环,确认反向传播也能正常工作:
import torch import torch.nn as nn model = nn.Linear(10, 1).cuda() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) x = torch.randn(32, 10).cuda() y = torch.randn(32, 1).cuda() for i in range(10): optimizer.zero_grad() output = model(x) loss = nn.MSELoss()(output, y) loss.backward() optimizer.step() print(f"Step {i}, Loss: {loss.item():.4f}")这段代码跑通,说明前向传播、反向传播、参数更新整条链路都没问题。
5.5 关于镜像验证和功能验证的补充
热词里提到了"镜像验证"和"功能验证",这两个概念在 PyTorch 安装场景下可以这样理解。镜像验证指的是确认你下载的 wheel 包来源可靠、没有被篡改。pip 默认会校验包的哈希值,但如果你从非官方源下载,建议手动核对一下。功能验证就是我上面说的那些——不只是 import 成功,还要实际跑运算、跑训练循环,确认各个功能模块都正常。
我一般会写一个简单的验证脚本,每次装完新环境就跑一遍:
import torch def verify_pytorch(): print(f"PyTorch version: {torch.__version__}") print(f"CUDA available: {torch.cuda.is_available()}") if torch.cuda.is_available(): print(f"CUDA version: {torch.version.cuda}") print(f"cuDNN available: {torch.backends.cudnn.is_available()}") print(f"cuDNN version: {torch.backends.cudnn.version()}") print(f"GPU count: {torch.cuda.device_count()}") for i in range(torch.cuda.device_count()): print(f"GPU {i}: {torch.cuda.get_device_name(i)}") print(f" Capability: {torch.cuda.get_device_capability(i)}") # 实际运算测试 x = torch.randn(100, 100).cuda() y = torch.randn(100, 100).cuda() z = torch.matmul(x, y) print(f"GPU matmul test passed, result device: {z.device}") else: print("Running on CPU only") x = torch.randn(100, 100) y = torch.randn(100, 100) z = torch.matmul(x, y) print(f"CPU matmul test passed") if __name__ == "__main__": verify_pytorch()把这个脚本保存成verify_torch.py,每次装完环境跑一下,几秒钟就能确认环境是否正常。
6. 不同系统下的特殊注意事项
6.1 Windows 系统的额外配置
Windows 上除了装 PyTorch 本身,有时候还需要装 Visual C++ Redistributable,否则 import 的时候会报找不到 DLL 的错误。微软官网可以下载最新的 VC++ 运行库,装完重启一下命令行即可。
另外,Windows 的路径长度限制有时候会导致安装失败,尤其是路径嵌套很深的时候。解决办法是开启长路径支持,在组策略里或者用注册表修改。
如果你用的是 WSL2,那实际上就是在 Linux 环境里装 PyTorch,按照 Linux 的流程走就行。WSL2 支持 GPU 直通,nvidia-smi在 WSL2 里也能正常用。
6.2 Linux 系统的驱动安装
Linux 上装 NVIDIA 驱动比 Windows 麻烦一些,尤其是 Ubuntu 桌面版,有时候会遇到 nouveau 驱动冲突的问题。我一般推荐用系统自带的附加驱动工具安装,或者用官方的.run文件安装。装完驱动后nvidia-smi能正常输出,再装 PyTorch。
Linux 上还有一个常见问题是多用户环境下权限配置。如果服务器是多个人共用,建议每个人创建自己的 conda 环境,避免互相干扰。
6.3 macOS 的 MPS 加速
Mac 的 M 系列芯片用 MPS(Metal Performance Shaders)做加速,验证方式和 CUDA 不同:
import torch print(torch.backends.mps.is_available()) print(torch.backends.mps.is_built())如果都返回 True,说明 MPS 可用。使用时把.cuda()换成.to("mps")即可。不过 MPS 目前对某些操作的支持还不完善,遇到不支持的算子会自动回退到 CPU,性能会受影响。
7. 装完之后:环境固化与迁移
环境装好验证通过之后,建议把依赖固化下来,方便以后迁移或者复现。pip 的话:
pip freeze > requirements.txtconda 的话:
conda env export > environment.yml这样换机器或者重装系统的时候,直接根据文件恢复环境即可。不过要注意,pip freeze会导出所有包,包括间接依赖,有时候会有平台相关的包导致在别的系统上装不上。更精细的做法是只导出直接依赖,或者用pipreqs这样的工具自动分析项目里实际用到的包。
我在实际使用中的体会是,环境配置这件事看起来简单,但真正要做好,需要对整个工具链有清晰的认识。不要怕麻烦,第一次装的时候多花点时间搞清楚每个步骤的原理,后面遇到问题就能快速定位。另外,养成装完就验证的习惯,别等到跑模型的时候才发现环境有问题,那时候排查成本会高很多。