刚接触深度学习的人,十有八九都会卡在环境配置这一关。尤其是手头只有一台普通Windows笔记本、没有独立显卡的时候,一搜教程全是“CUDA、cuDNN、NVIDIA驱动”这些词,心里很容易发怵。这篇文章就是我实际走过一遍的Windows系统CPU版PyTorch安装全过程,也是我给自己定的“第一周”入门目标里最核心的一步。整个过程不需要显卡,不需要Linux,不需要翻来覆去改系统设置,就用一台集成显卡的笔记本,把PyTorch装好、验证通过,并且能顺利跑起来一个小训练任务。
如果你是纯新手,看完这篇文章能少走很多弯路;如果你装过但踩了坑,排查部分也许能帮上忙。下面从头梳理一遍。
1. 为什么CPU版PyTorch是新手的第一站
1.1 CPU版本到底能干什么
很多人有个误区,觉得不用GPU就等于“不能学深度学习”。其实完全不是这样。PyTorch本来就是一套深度学习框架,底层运算既支持GPU也支持CPU。CPU版本做的事情和GPU版本几乎完全一样:定义神经网络、计算梯度、做反向传播、跑卷积和全连接层……这些核心功能都在,只是具体的数学运算跑在CPU上,速度慢一些而已。
用CPU版来学习和理解深度学习的原理,反而是更合适的选择。因为模型很小、数据量不大,CPU足够应付,而且你不必一开始就跟显卡驱动较劲。等以后真要训练大规模模型、跑大数据集,再上GPU也不迟。把最基础的环境先搞定,才是最重要的。
1.2 CPU版与GPU版的差距
为了让你心里有底,我把两者的区别先列成一张表,实际用的时候就知道差异在哪里。
| 对比项 | CPU版 | GPU版 |
|---|---|---|
| 硬件要求 | 任意普通CPU,无需独立显卡 | 需要NVIDIA显卡且驱动支持CUDA |
| 安装复杂度 | 低,一条pip命令即可 | 需要额外配置CUDA、cuDNN、显卡驱动 |
| 训练速度 | 小模型够用,大模型明显慢 | 速度快,适合大规模计算 |
| 程序代码 | 与GPU版几乎完全一致 | 支持.cuda()或device设置 |
| 学习门槛 | 低,专注算法本身 | 较高,还要弄清楚各种版本匹配关系 |
这里要特别说一句:新版的PyTorch中,CPU版和GPU版在代码层面区别非常小,最多就是声明设备时用device = torch.device("cpu"),这个即使以后升级到GPU也只需要改一行。所以完全不用担心学了CPU版以后白学。
1.3 选择CPU版的四个理由
第一个理由就是快,安装快。CPU版不需要下载CUDA工具包、不需要考虑显卡驱动,整体安装时间能压缩到十分钟左右,对新手特别友好。第二个理由是稳,不容易出幺蛾子,兼容性也更好。第三个理由是够用,学习阶段的线性回归、逻辑回归、简单图像分类,用CPU训练完全跑得动。第四个理由是便宜,不需要额外花几千块钱买显卡,一台普通办公本就能起步。
所以我一直建议真正想入门的人:第一周不需要纠结GPU,先把CPU环境装好,把代码跑通,把基础概念弄明白。这也是这篇文章标题里“第一周”的意义——这一周的任务不是追上别人多厉害,而是让自己稳稳地起步。
2. 准备工作:先搭好Python运行环境
2.1 到底选Anaconda、Miniconda还是裸Python
这一步是很多人刚开始容易纠结的。如果你之前已经装了Python,不一定需要卸载,但为了保证后面不出乱子,我强烈建议用conda来管理环境。
Anaconda像一个全家桶,里面带了几百个常用库,装完即用,但体积大;Miniconda像一个精简版,只带conda和最小依赖,需要啥装啥;裸Python就是直接官网下载安装包,配合pip一起用。给新手的建议是:用Miniconda或者Anaconda都行,我更推荐Miniconda,干净、不臃肿,还能避免后面环境变量冲突。
从官网下载Windows安装包时,注意选择64位的exe文件。安装时有个选项是“Add Anaconda to my PATH environment variable”,现在很多版本默认不勾选,这在后面用conda命令时可能会造成困扰,可以在安装时勾上,或者装完后手动把conda的Scripts目录加到PATH里。
2.2 把环境变量和虚拟环境一次搞清楚
环境变量不是难懂的东西,说白了就是告诉系统“你可以在哪些文件夹里找到可执行的命令”。装好Miniconda之后,你可以在开始菜单里找到“Anaconda Prompt”或者直接用PowerShell,输入下面这条命令验证:
conda --version如果输出类似conda 24.1.2这样的版本号,说明conda已经能用了。
接下来创建一个干净独立的虚拟环境,这个虚拟环境就像给你安装PyTorch准备了一个“专用隔间”,以后装什么库都不影响系统里的其他Python程序。我自己创建环境的命令是这样的:
conda create -n pytorch_env python=3.9 -y conda activate pytorch_env-pytorch_env是我给环境起的名字,你可以换成任何你喜欢的名字;python=3.9表示环境里默认的Python版本是3.9。
激活之后,命令行提示符前面会出现(pytorch_env)这样的前缀,说明你已经进入了这个虚拟环境。以后所有安装和运行命令都在这环境下进行,避免跟全局Python混在一起。
2.3 给pip和conda换个更快的源
安装PyTorch时最大的痛点往往是下载速度。默认情况下pip是去国外官方源拉包的,数据量一大就容易慢或者超时。解决办法是用国内的镜像源。
我这边用的清华源,配置pip的镜像源如下:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这样配置一次之后,后续的pip命令都会自动走这个镜像地址。conda也可以换源,在用户目录下找到.condarc文件,写入以下内容:
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud换源后建议运行conda clean -i清除缓存,然后测试一下下载速度。这一步能省下大量等待时间,值得提前做好。
3. 实战安装:三种方式实测记录
3.1 方式一:PyTorch官方CPU命令直装
这是最省事的方式。激活虚拟环境之后,直接执行官方提供的CPU版本安装命令。PyTorch官网的安装选择页面里,选好OS=Windows、Package=Pip、Language=Python、Compute Platform=CPU,它会给你一条现成的命令。
我实测过程中用的命令如下:
pip install torch torchvision torchaudio这条命令默认安装的是当前最新的稳定版,如果配置了清华源,速度快到基本不用等待太久。但有一点要注意,默认情况下这条命令装的是GPU版本还是CPU版本,跟具体版本有关系。在你没有CUDA环境的时候,PyTorch会有一版叫“CPU版”的wheel包,而上面的下载逻辑是从官方源拉取,装到没显卡的机器上运行时可能会报错。所以更稳妥的做法是用下面这条指定CPU源:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu这是我实测最喜欢的方案。它会明确从PyTorch官方的CPU wheel目录拉取安装包,绝不跟你纠结CUDA的事。下载量在200MB左右,换不换国内镜像主要看网速,如果慢,可以再加入-i https://pypi.tuna.tsinghua.edu.cn/simple配合--extra-index-url一样用。不过官方CPU wheel地址有时候不在镜像里,所以我更推荐直接用官方地址,慢一点就耐心等,或者采取离线包方案。
3.2 方式二:用国内pypi镜像安装
如果你发现官方地址下载太慢,或者总是断流,可以在pip命令里直接指定国内镜像源:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple这么做的好处是速度快,尤其是在网络不太稳定的情况下。但有个坑:很多国内镜像为了防止包体积过大污染存储,未必会同步最新的CPU wheel包,偶尔会遇到版本对不上的情况。我在实际测试中也遇到过torchvision版本和torch版本不匹配的问题。
比如你装好了torch 2.3.0,但torchvision从镜像里装出来是2.2.2,两个版本冲突,运行import torchvision时就会报module compiled with unexpected C++ ABI之类的错。解决思路是先装torch再接上torchvision,但版本要严格一一对应。PyTorch每个版本的torch、torchvision、torchaudio是一起发布的,必须匹配,具体对应关系在下面单独列。
3.3 方式三:conda离线包安装
如果你不想碰pip,也可以用conda直接安装。在虚拟环境里执行:
conda install pytorch torchvision torchaudio cpuonly -c pytorch这里的cpuonly是一个关键标记,它表示只装CPU版本,不拉取任何CUDA相关组件。用conda装的优点是依赖管理很齐,会自动处理Python版本、numpy等库的对应关系,缺点主要是下载依赖时如果源慢会很痛苦,还有可能把环境中某些依赖给升级到不想要的新版本。
我个人的建议是:新手优先用pip方案,conda方案适合以后对conda比较熟悉了再用。
3.4 版本对照表与避雷建议
安装过程中会遇到版本匹配问题,这里给出我实测过的常见版本对应关系,方便你安装时对照。
| PyTorch版本 | Python版本 | torchvision版本 | torchaudio版本 |
|---|---|---|---|
| 2.3.0 | 3.8-3.12 | 0.18.0 | 2.3.0 |
| 2.2.2 | 3.8-3.11 | 0.17.2 | 2.2.2 |
| 2.1.2 | 3.8-3.11 | 0.16.2 | 2.1.2 |
| 2.0.1 | 3.8-3.11 | 0.15.2 | 2.0.2 |
| 1.13.1 | 3.7-3.10 | 0.14.1 | 0.13.1 |
避雷建议就是一句话:装torch和装torchvision、torchaudio时,最好一次性指定相同的主版本和次版本数字,比如:
pip install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 --index-url https://download.pytorch.org/whl/cpu这样你就提前锁死了依赖关系,后面出错的概率会小很多。“能跑就行”和“一次性装对”之间,往往就差这一点细心。
4. 安装后的第一道验证:让训练真正跑起来
4.1 import测试与设备信息
安装完成后,先别急着写复杂代码。打开命令行,进入虚拟环境,输入python进入交互式解释器:
import torch print(torch.__version__)如果输出2.3.0这样的版本号,说明核心安装已经成功了。这步虽然简单,但一定要做,因为很多看起来“玄乎”的问题,最后发现都是从第一步就没装上。
接着查看当前环境下的可用设备信息:
print(torch.cuda.is_available())在CPU版下输出False是正常的,说明没有检测到CUDA设备,这也是预期结果。再看一下CPU信息:
print(torch.get_num_threads())你会看到这台电脑CPU能用的线程数,一般是物理核心数乘以超线程数,这个数字会影响训练速度。如果要手动设置线程数,可以用:
torch.set_num_threads(4)4.2 张量运算与自动求导
安装成功只是第一步,接下来要验证计算能力。PyTorch最核心的基本单位是张量(Tensor),你可以把它理解成带自动求导的多维数组。先跑一下张量创建和运算:
import torch x = torch.randn(100, 100) y = torch.randn(100, 100) z = x.mm(y) # 矩阵乘法 print(z.shape) # torch.Size([100, 100]) print(z.sum().item())能正常输出结果,说明底层CPU数学库能正常工作。自动求导是深度学习的灵魂,再试试这一段:
w = torch.randn(1, requires_grad=True) loss = (w * 3 - 6) ** 2 loss.backward() print(w.grad) # 输出梯度值这段代码相当于对f(w) = (3w - 6)^2求导,在w=2时导数应该为0。如果w.grad输出一个接近0的数值,说明反向传播机制正常。
4.3 安装torchvision与数据下载失败问题
跑完基础验证,新手一般会正式开始训练一个简单图像分类任务,这时你大概率会用到torchvision。它提供了大量经典数据集的下载接口,比如MNIST、CIFAR-10。如果你已经装好了,直接用:
from torchvision import datasets, transforms train_data = datasets.MNIST( root="./data", train=True, transform=transforms.ToTensor(), download=True )但你很有可能会遇到一个问题:数据下载卡在某个进度之后就不动了,或者一直报连接超时。这是因为MNIST原始数据集的下载地址在国外的服务器上,网络环境不好时会失败。解决方法是先手动下载MNIST数据集的四个关键文件,然后放到./data/MNIST/raw/目录下,PyTorch会自动识别并跳过download。这四个文件分别是:
- train-images-idx3-ubyte.gz
- train-labels-idx1-ubyte.gz
- t10k-images-idx3-ubyte.gz
- t10k-labels-idx1-ubyte.gz
如果你用的不是MNIST,而是其他常见数据集,也可以用国内镜像下载或者把下载好的文件手动放到对应目录。总之一旦下载卡住,先别怀疑代码写错,检查下载源和网络是正事。
4.4 第一周小目标:跑一个MNIST训练片段
为了让“安装成功”这件事不只是一句口号,我建议第一周给自己设置一个明确的小目标:用CPU跑通一个MNIST训练片段,不要求跑完所有epoch,跑一个epoch甚至几十个batch都足够验证环境。
这里我给一个极简可运行的代码示例:
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms train_dataset = datasets.MNIST( root="./data", train=True, transform=transforms.ToTensor(), download=True ) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) # 一个非常简单的两层神经网络 model = nn.Sequential( nn.Flatten(), nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 10), ) loss_fn = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) for batch_idx, (data, target) in enumerate(train_loader): output = model(data) loss = loss_fn(output, target) optimizer.zero_grad() loss.backward() optimizer.step() if batch_idx % 100 == 0: print(f"Batch {batch_idx}, Loss: {loss.item():.4f}") if batch_idx >= 200: # 只跑200个batch,作为验证 break print("CPU 训练验证通过")运行这段代码,如果能看到loss从2.3左右逐渐下降,比如100个batch后降到0.5左右,就说明你的PyTorch环境已经可以正常训练了。CPU跑这200个batch在我的测试机器上只需要十几秒,完全在可接受范围内。
5. 第一周里最常见的坑与排查方法
5.1 报错速查表
下面这张表是我自己踩过之后整理的,也是给“第一周”的同学最直接的排查指引。
| 现象 | 原因 | 解决办法 |
|---|---|---|
ModuleNotFoundError: No module named 'torch' | 没装成功,或者没进入虚拟环境 | 重新执行安装命令,确认命令行前缀有(pytorch_env) |
| 下载慢,卡在某个百分比不动 | 网络问题,或者正在连国外源 | 换清华源,或者用官方CPU wheel地址 |
AttributeError: module 'torch' has no attribute 'cuda' | 装的不是PyTorch,可能是同名冲突库 | 卸载后重装,用pip uninstall torch清理 |
| 版本不匹配报错 | torch和torchvision版本号不一致 | 用pip list检查版本,或者重新指定一组对齐版本 |
CondaHTTPError | conda源没配好或网络问题 | 检查.condarc配置,换国内conda镜像源 |
Unable to find installation candidates | conda找不到匹配包 | 更新conda,或者改用pip安装 |
| 训练时CPU占用率始终很低 | 线程数没优化 | 调用torch.set_num_threads(4)等方法提高线程数 |
5.2 网络下载有关的特定处理
PyTorch相关下载包括两部分:包本身的下载和数据集的下载。包本身可以通过镜像解决,数据集则相对麻烦。我实际测试中,如果用官网直连下载MNIST数据,经常断断续续。后来手动下载四个文件放进去,速度一下就稳了。
另外还要提醒一点:有些数据集下载接口会从公开网址拉取,这类地址偶尔会变动。如果遇到下载失败,先在浏览器里打开那个URL,看能不能正常下载。如果浏览器能下载,说明只是Python端的连接问题,试着手动放置文件就行。
5.3 环境混乱后的彻底清理方法
刚开始装环境,很容易重复安装或者装错版本,搞得环境一团糟。最简单的办法是直接删掉虚拟环境重来:
conda deactivate conda remove -n pytorch_env --all然后重新创建环境、重新安装,整个过程也就十分钟。删环境是一个“不心疼”的过程,因为里面并没有什么不可再生的数据。
如果你只是觉得torch相关包存疑,也可以在环境内卸载干净再装:
pip uninstall -y torch torchvision torchaudio卸载完成后可以检查一下:
pip list | findstr torch看到没有任何torch开头的包,再重新安装。我自己的习惯是:环境一乱就删除重建,干净利落。
6. 接下来一周还能做什么
6.1 动手建议
安装不是目的,用起来才是。“第一周”剩下的时间,可以给自己安排几个阶梯式的小任务。
第一天,用张量实现一次线性回归,完全手写梯度下降,不看任何框架封装,这样能理解梯度到底是什么。第二天,用PyTorch的autograd自动求导改写线性回归,感受框架替你做了什么。第三天,训练一个多层感知机在MNIST上跑分类,熟悉nn.Module、DataLoader这些核心API。第四天,尝试调参:改学习率、改batch size、改网络层数,记录loss曲线变化。第五天,尝试把MNIST的网络结构换成卷积层,看看效果怎么变化,也可以顺带熟悉一下torch.nn.Conv2d。
这些任务都不需要GPU,CPU完全可以扛住。你会发现,当你动手写完这些,对深度学习背后的数学和工程实现会有很不一样的感觉。
6.2 关于“第一周”这个起点的一点体会
我始终觉得,学深度学习最难的不是算法,也不是代码,而是“起步”时的环境搭建和心态调整。CPU版PyTorch对很多人来说是个“次优选择”,但恰恰是这个次优选择让门槛降到了最低。
装完环境、跑完训练验证之后,你会突然觉得很多东西开始变得顺理成章。以后再看到GPU、CUDA、分布式训练,也不会觉得无从下手。到了第二周,再去了解GPU版本怎么装、怎么配置CUDA,你会发现它们之间其实只是差了一个硬件的设置而已。
这也是为什么我会把“第一周”这个时间节点单独拎出来写——它代表的不是“我还没用上GPU”的遗憾,而是“我已经把最关键的起步问题解决了”的踏实感。保持这种“先把一件事做到底”的状态,后面学任何东西都很顺。