1. 先想清楚:为什么是 Python + PyCharm + PyTorch CPU 版
我接触过不少刚入门深度学习的朋友,卡住他们的往往不是反向传播、卷积这些概念,而是最前面这一步——环境搭不起来。今天就围绕深度学习环境完整安装(Python+Pycharm+Pytorch cpu版)这个主题,把我这几年在一台台机器上重复折腾了十几遍的流程,完整地拆开讲一遍。这套组合适合三类人:零基础想入门深度学习的学生、手头只有普通笔记本没有独立显卡的开发者、以及需要在一台干净机器上快速跑起一个验证脚本的工程人员。为什么强调 CPU 版,因为不是每个人都有能用的独立显卡,而 CPU 版 PyTorch 在跑小规模模型、验证代码逻辑、做课程作业这些场景下完全够用,安装过程还省去了显卡驱动、CUDA 工具链这一大堆最容易出问题的环节。
我个人的一个判断是:初学阶段最怕的不是跑得慢,而是根本跑不起来。你拿一块高端显卡去装 GPU 版,光驱动版本和 CUDA 版本对应关系就够你查半天,一个不匹配就是一行报错。而 CPU 版的安装链路短、依赖少、报错信息也干净,特别适合用来把“从写代码到看结果”这个闭环先打通。等这套流程你闭着眼都能走一遍了,再升级到 GPU 版就是水到渠成的事,因为那时候你对虚拟环境、包管理、解释器绑定这些底层概念已经心里有数了。
所以这篇文章的目标很明确:让你在一台全新的机器上,从零把 Python、PyCharm、PyTorch(CPU 版)这条链路完整跑通,并且知道每一步为什么要这么做、坑在哪里、出错了怎么查。下面我会按“选型思路 → 分步实操 → 验证跑通 → 问题排查”的顺序展开,每一步都尽量给出可复制的路径和参数。
1.1 CPU 版和 GPU 版的真实差距在哪里
很多人对 CPU 版有误解,觉得 CPU 版就是“残废版”。这个说法要分场景看。深度学习里绝大部分运算本质上是矩阵乘法和卷积,这类运算在 GPU 上因为几千个并行核心同时开工,确实能比 CPU 快几十倍甚至上百倍。但这里有个前提:只有当模型参数量足够大、数据量足够多、batch size 足够大的时候,GPU 的并行优势才能充分发挥。如果你只是跑一个几百个参数的小网络、或者在做一个手写数字识别的练习,瓶颈往往在数据加载和 Python 解释器本身的开销上,这时候 GPU 和 CPU 的差距会被大幅压缩,有时候甚至感觉不到明显区别。
我在一台普通轻薄本上用 CPU 跑 MNIST 做了一个简单对比,一个两层卷积加两层全连接的小网络,训练 5 个 epoch,全程大概几分钟。这个速度用在学习和验证上完全可以接受,你完全可以边看结果边调参数。真正需要 GPU 的场景是:你要训练稍微像样的模型、要处理图像或文本的较大数据集、要做迁移学习微调预训练模型。这种时候 CPU 版会让你等到怀疑人生。所以我的建议是,先 CPU 版把流程和代码逻辑练熟,等确认真要往深里走了,再考虑添置设备或者用带显卡的机器,不要在还没写几行代码的时候就在硬件上纠结太久。
还有一个容易被忽略的点:CPU 版和 GPU 版的代码在绝大多数情况下是同一套。你写的模型定义、训练循环、数据管道,只要不硬编码.cuda(),换到 GPU 机器上基本就是改一行device变量的事。也就是说,你现在用 CPU 版学的东西,百分之九十以上可以直接迁移到 GPU 环境,不会浪费。
1.2 三个组件各自扮演什么角色
这套组合里三个东西分工很清晰,理解了分工,后面每一步的意图就自然明白了。Python 是语言运行时,负责执行你写的所有代码,它本身只是一个解释器和标准库,不具备任何深度学习能力。PyTorch 是深度学习框架,它是一个安装到 Python 环境里的第三方库,提供了张量运算、自动求导、神经网络层、优化器这一整套工具,你可以理解成“一堆帮你实现数学运算和模型训练的代码集合”。PyCharm 是集成开发环境,它负责让你舒服地写代码、管理项目、运行调试,本质上它是在背后调用 Python 解释器来执行你的脚本,它自己不参与任何计算。
这里最容易让人困惑的是 PyCharm 和 Python 的关系。很多新手以为装了 PyCharm 就等于有了 Python,其实不是。PyCharm 只负责“管理和调用”,真正执行代码的始终是那个独立的 Python 解释器。所以你会看到后面有一个关键步骤叫“给项目绑定解释器”,本质就是告诉 PyCharm:“去用这个路径下的 Python 来跑我的代码。”没绑定对,就会出现你明明装了某个库,PyCharm 里却提示找不到的诡异情况——因为 PyCharm 用错了 Python,你装的库在另一个 Python 里。
提示:不要把 Python、PyCharm、PyTorch 三个东西的安装顺序搞混。正确顺序是 Python → PyCharm → PyTorch。PyTorch 必须装在 Python 环境里,PyCharm 只是最后用来指挥它们干活的。
2. Python 安装:版本选择和 PATH 这一步千万别踩坑
Python 是整条链路的地基,这一步没搞好,后面全白搭。我见过太多问题最后追根溯源都是 Python 装得不干净导致的:装了多个版本互相打架、PATH 没配上导致命令行里敲 python 没反应、或者用了一个太新的版本结果某些库还没适配。
2.1 到底该选哪个 Python 版本
先说结论:不要盲目追最新版,选一个当前主流、生态适配完善的稳定版本。深度学习的各个库对 Python 版本的跟进是有延迟的,某个新版本刚发布时,一些科学计算相关的包可能还没有对应的预编译 wheel,你装的时候就得现场编译,那过程能让你崩溃。我一般会选发布一年左右、社区反馈稳定的版本,这个时间点上主流库的适配基本都跟上了。
对 Windows 用户来说,安装包从 Python 官网下载即可,注意勾选那个“Add Python to PATH”的复选框,这是安装向导里最重要的一步。很多人安装时一路下一步,把这个勾选漏了,结果命令行里敲python提示“不是内部或外部命令”,然后又得手动去配环境变量,平白多走一段弯路。如果你是 macOS 用户,系统自带的是 Python 2 的老版本或者根本没有,建议用官方安装包装一个新的,别去动系统自带的那个,系统有些工具依赖它,乱动容易出问题。Linux 用户相对来说简单,大多数发行版自带 Python,但同样建议装一个独立的版本用于开发,把系统自带的和开发用的分开。
| 场景 | 建议方案 | 原因 |
|---|---|---|
| Windows 全新机器 | 官网安装包,勾选添加到 PATH | 最省事,一步到位 |
| macOS | 官网安装包或包管理器安装 | 避开系统 Python 2 |
| Linux | 独立安装一个版本,不动系统的 | 系统工具依赖自带版本 |
2.2 安装过程和验证方法
下载好安装包之后,Windows 上的操作流程大概是:双击运行,第一屏务必勾选“Add Python to PATH”,然后选择“Install Now”或者自定义安装路径。自定义路径的话我建议路径里不要有中文和空格,比如放在D:\Python\这种简单路径下,因为空格和中文在后续某些工具处理路径时容易出幺蛾子,这是个说不清道不明但真实存在的坑。
安装完成后,必须验证。打开命令行(Windows 上按 Win+R 输入 cmd,macOS 和 Linux 打开终端),输入两个命令来确认:
python --version pip --version如果第一条命令能输出你安装的版本号,第二条能输出 pip 的版本号,说明 Python 装好并且 PATH 配对了。如果提示找不到命令,先别急着重装,大概率是 PATH 的问题。Windows 上可以在“系统属性 → 高级 → 环境变量”里检查用户变量和系统变量里的 Path,看有没有 Python 的安装目录和它下面的 Scripts 目录。这两个都要有,缺一个就会出现python能用但pip不能用的怪问题。
macOS 和 Linux 上如果系统里存在多个 Python,可能需要用python3和pip3来区分,这个要看你安装的时候有没有建立 python 这个软链接。我的习惯是每次都明确用python还是python3,避免歧义。
注意:如果你之前装过 Python 但卸载过,重装前建议去安装目录和用户目录下清理一下残留的
pip缓存和旧的环境变量,残留是导致各种奇怪问题的常见原因。
2.3 一个小验证:确认 pip 能正常装包
Python 装好之后,顺手验证一下 pip 能不能真正装包,这样能把网络和权限问题提前暴露出来。随便装一个小而干净的包试试,比如:
pip install requests如果进度条正常跑完、最后显示Successfully installed,说明 pip 和网络都没问题。如果卡住不动或者报连接超时,那就是网络访问源的问题,这时候可以配置一下镜像源来加速。国内常用的镜像源配置方式是在 pip 配置文件里指定,或者在命令里临时加参数:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple这个镜像源的原理很简单:pip 默认去国外的官方仓库拉包,跨境访问不稳定,换成国内镜像就是把下载地址指到一个国内同步的仓库上,速度和成功率都会好很多。这个配置对后面的 PyTorch 安装尤其重要,因为 PyTorch 的安装包体积不小,用默认源下载经常中途断掉。
如果这一步验证通过了,Python 这块就基本稳了,可以进入下一步。
3. PyCharm 安装与解释器绑定:新手最容易败在这里
PyCharm 是 JetBrains 出品的 Python 集成开发环境,社区版免费,专业版功能更多但需要授权。对深度学习入门来说,社区版完全够用,我一直在用社区版,从来没觉得缺什么关键功能。
3.1 社区版够不够用,怎么选
先回答那个每个人都想知道的问题:社区版和专业版到底差在哪,入门要不要上专业版。简单说,专业版主要在远程开发、数据库工具、Web 框架支持、科学计算工具的深度集成这些方面多一些能力,而这些对纯写深度学习脚本的初学者来说,基本用不上。社区版支持完整的编辑、调试、运行、版本控制、虚拟环境管理功能,你要写模型、跑训练、看输出,社区版一点不虚。
所以我的建议很直接:入门就用社区版,免费、安装包小、启动也快。等你以后真的需要在远程服务器上开发、或者需要那几个专业功能了再考虑。安装过程也很简单,官网下载对应系统的安装包,双击运行,一路下一步即可。中间有一个选项问你要不要关联.py文件、要不要添加到右键菜单,建议都勾上,方便后续直接右键打开文件。
Windows 上安装路径同样建议避开中文和空格,跟 Python 一个道理。macOS 上就是拖进应用程序目录,Linux 上通常从官网下 tar.gz 解压后运行启动脚本,或者用 snap 安装。装完之后第一次启动会让你选主题、设置快捷键方案,这些按自己喜好来就行,不影响后面。
3.2 PyCharm 和 Python 的绑定,是整个环节的关键
这是我见过新手翻车最多的地方。你把项目在 PyCharm 里打开,写了一段代码,点了运行,结果报错说找不到某个库,但你刚才明明在命令行里用 pip 装过了。这种情况九成九是因为PyCharm 用的 Python 和你命令行里的 Python 不是同一个。
PyCharm 在创建项目的时候会问你要用哪个解释器,这时候一定要注意看清楚路径。我的建议是先在命令行里用下面的命令确认一下当前用的 Python 在哪:
python -c "import sys; print(sys.executable)"这个命令会打印出当前 Python 解释器的完整路径,把这个路径记住。然后在 PyCharm 里创建项目时,选择“已存在的解释器”,手动指定到这个路径。这样就能保证命令行装好的包,PyCharm 里能直接用。
| 常见现象 | 真实原因 | 解决方向 |
|---|---|---|
| PyCharm 里 import 报错 | PyCharm 用了另一个解释器 | 检查并重新绑定解释器 |
| 命令行装包 PyCharm 看不到 | 两者环境不一致 | 统一到同一解释器 |
| 换了项目又报错 | 每个项目绑定的解释器不同 | 确认项目级解释器设置 |
绑定好之后,PyCharm 右下角会显示当前解释器的名字和版本,你可以点开它查看已经安装的包列表。如果能看到你之前用 pip 装的那些包,就说明绑定对了。这个习惯我建议一直保持:装完任何包,先到 PyCharm 的解释器设置里看看能不能看到它,比反复试运行要高效。
3.3 第一次配置的几个顺手设置
PyCharm 装好之后有几个设置我每次都会调,调完体验会顺畅很多。第一是字体和字号,看代码看得舒服比什么都重要;第二是自动导入,把 Python 相关的自动导入提示开上,写torch.的时候能自动补全模块;第三是把代码检查的黄绿波浪线提示调到一个合理的级别,新手容易被满屏的警告吓到,其实很多是无害的提示。
还有一个实用功能是“运行配置”。第一次运行脚本时,PyCharm 会问你要不要保存运行配置,保存之后以后点那个绿色三角就是按固定配置跑,包括工作目录、环境变量这些。工作目录这个参数有讲究:如果你的代码里用了相对路径读取数据文件,而工作目录不对,就会报文件找不到。所以养成习惯,把工作目录设成项目根目录,数据和代码都基于这个根目录来引用,能避免很多路径问题。
到这一步,你已经有了一个能写能跑 Python 的编辑器环境,接下来就是把最重要的深度学习库装进去。
4. PyTorch CPU 版安装:虚拟环境是必须的
PyTorch 的安装,我强烈建议不要直接装在全局 Python 环境里,而是给每个项目单独建一个虚拟环境。虚拟环境这个概念听起来吓人,其实就是给项目划一块独立的、只有它自己能用的库空间。这样不同项目之间用到的库版本互相隔离,不会打架。
4.1 为什么要用虚拟环境
我刚开始学的时候也觉得虚拟环境是多此一举,直接全局装多省事。结果就是:A 项目需要一个库的 1.0 版本,B 项目需要 2.0 版本,全局只有一个位置,你装了 A 的版本,B 就跑不了,来回重装能把自己折腾疯。更严重的是,当你把某个核心库升级后,可能会连带影响其他库的依赖,导致本来好好的项目突然跑不动了,而你还想不起来自己动过什么。
虚拟环境解决的正是这个问题。你为每个项目创建独立环境,项目 A 的环境里装 1.0,项目 B 的环境里装 2.0,互不干扰。删掉项目直接把环境文件夹删了就行,干净利落。对深度学习这种依赖链复杂、版本要求又比较敏感的领域来说,虚拟环境几乎算是标配。Python 自带的venv模块就够用,不需要额外装工具。
创建和激活虚拟环境的命令大概是这样:
# 在项目目录下创建虚拟环境,名字叫 venv python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate激活之后,命令行的开头会出现(venv)这样的标记,表示当前所有 pip 操作都只在这个环境里生效。这一步确认好了,后面装 PyTorch 才不会污染全局。在 PyCharm 里新建项目时也可以直接选择“新建虚拟环境”,这样编辑器会自动帮你创建并绑定,省去手动命令行的步骤,两种方式都可以,手动一遍能帮助你理解背后的机制。
4.2 安装 PyTorch 的正确姿势
现在是重头戏。PyTorch 的官网有一个安装命令生成器,你选好系统、包管理方式、Python 版本、计算平台(选 CPU),它就会给你一条现成的命令。我强烈建议从官网生成命令,不要凭记忆手写,因为它的包名和索引地址是特定格式,写错了会装到奇怪的东西或者报错。
CPU 版的安装命令大致是这个形态(具体版本号以官网当前生成为准):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu这里解释一下这三个包的分工。torch是核心库,张量、自动求导、神经网络都在里面;torchvision是计算机视觉相关的工具包,包含常用数据集、预训练模型和图像变换工具;torchaudio是音频处理相关。入门阶段你至少需要前两个,第三个顺手一起装也不占多少事。命令最后的--index-url参数就是把安装源指向 PyTorch 官方的 CPU 包仓库,确保装的是纯 CPU 版本而不是带 CUDA 的版本。
安装过程会很慢,因为包体积不小。这时候前面配置的镜像源思路就能帮上忙,但要注意 PyTorch 的包不一定在所有国内镜像上都有 CPU 版的最新同步,所以如果镜像源里找不到或者版本对不上,就老老实实用官方源慢慢等。我个人的经验是:这种大包安装,找一个网络稳定的时间一次装完,别装一半断了再重来,中断的安装有时会留下损坏的缓存,反而更麻烦。
提示:安装完成后,用
pip list看一眼,确认 torch、torchvision、torchaudio 三个都在列表里,且版本号符合预期。如果只有 torch 没有另外两个,说明命令没执行完整,补装即可。
4.3 安装后的验证,三步确认
装完不能光看命令成功就完事,一定要做验证。我习惯用三段式验证,能层层确认装的东西是否真的可用。
第一段,确认能导入并且看版本:
import torch print(torch.__version__) print(torch.cuda.is_available())第二行会输出False,这是正常的,因为装的是 CPU 版,没有 CUDA 支持。如果这里报错说没有 cuda 模块,也别慌,CPU 版本本来就不依赖它,能正常打印版本号就说明导入成功了。
第二段,确认张量运算正常:
import torch x = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) y = torch.tensor([[5.0, 6.0], [7.0, 8.0]]) print(x + y) print(torch.matmul(x, y))能看到正确的矩阵加法和乘法结果,就说明核心运算没问题。
第三段,确认能定义一个最简单的网络并跑一次前向:
import torch import torch.nn as nn model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 1) ) out = model(torch.randn(4, 10)) print(out.shape)输出形状应该是(4, 1)。这三步都通过,你的 PyTorch 环境就是真正可用的了,而不是“装上了但用不了”的状态。
5. 环境跑通验证:从张量到第一个能训练的小网络
装完只是开始,要让这套环境真正为你所用,得跑一个完整的训练流程。我一般用经典的 MNIST 手写数字识别来做这个验收,原因很实在:数据小、内置在 torchvision 里自动下载、几分钟就能跑完、还能完整覆盖数据加载、模型定义、训练、评估这条链路。
5.1 数据准备和加载器的写法
MNIST 通过 torchvision 可以一行代码加载,关键是理解DataLoader是干什么的。它负责把整个数据集按 batch 分批、随机打乱顺序、后台并行读取,让训练循环每次只处理一小批数据。对 CPU 环境来说,num_workers这个参数设置要谨慎,Windows 上设成大于 0 有时会因为多进程机制出问题,我建议先用 0,稳定了再试着调。batch size 设成 64 或者 128 都可以,CPU 上别设太大,内存和速度都吃不消。
数据下载那一步如果卡住,多半是网络问题,可以从网上找现成的数据集文件手动放到指定目录,torchvision 检测到文件已存在就不会重复下载。这个技巧在数据量大、网络不稳的时候特别有用。
5.2 一个最小可用的卷积网络
我写一个极简的 CNN,两层卷积两层全连接,结构上足够说明问题,又不会太复杂。核心要点是搞清楚每一层的输入输出维度怎么衔接:卷积层输出的是多通道的特征图,进入全连接层之前要先用flatten展平成一维向量,而展平后的维度要和全连接层的输入维度对上,这是新手最容易算错、也最容易报错的地方。如果报维度不匹配的错误,八成就是这里没对上。
训练循环里有几个固定动作:清零梯度、前向传播、计算损失、反向传播、更新参数。这五步是 PyTorch 训练的标准骨架,我从入门到现在写的大部分训练代码都是这个结构。损失函数用交叉熵,优化器用 Adam,学习率从 0.001 起步,这些都是分类任务的常规配置。
5.3 在 CPU 上的实际表现和观察
跑起来之后,你会看到每个 epoch 的耗时和 loss 变化。CPU 上第一个 epoch 会慢一些,因为要加载数据、初始化各种东西,后面会稳定下来。观察 loss 是不是在下降、准确率是不是在上升,这是判断代码写没写对的最简单标准。如果 loss 一直不动或者变成 NaN,那就要回头检查学习率是不是太大、数据处理是不是有问题。
我这里想强调一个心态问题:CPU 上训练慢,不要急着换设备,先确认你的代码逻辑是对的。环境搭建和代码正确性,跟硬件快慢是两码事。你能用 CPU 把一个小网络正确训练到收敛,就说明整条链路你都掌握了,剩下的只是速度差异。这个阶段积累的信心和方法,比省下来的那点训练时间值钱得多。
6. 常见问题排查与踩坑经验
讲完了流程,最后这部分是我觉得最有价值的地方,因为这些坑不是教程里会写的,都是我自己一次次撞出来的。
6.1 高频问题速查表
| 报错或现象 | 可能原因 | 处理方向 |
|---|---|---|
| 命令行 python 找不到 | PATH 没配 | 检查环境变量里的 Python 目录和 Scripts 目录 |
| pip 装了 PyCharm 里没有 | 解释器不一致 | 在 PyCharm 里重新绑定到同一个解释器 |
| pip 安装超时失败 | 网络源问题 | 配置国内镜像源或换时间重试 |
| import torch 报错 | 装到了别的环境 | 确认虚拟环境已激活再装、再导入 |
| 训练时报维度不匹配 | 全连接输入维度算错 | 打印展平后的 shape 再对应改 |
| loss 变成 NaN | 学习率过大或数据未归一化 | 降低学习率、检查输入数值范围 |
| 多进程加载卡死 | Windows 下 worker 机制 | 把 num_workers 设成 0 |
表格里每一条我都亲身遇到过,其中解释器不一致和维度不匹配这两条,新手撞上的频率最高。解释器那条尤其隐蔽,因为你明明在命令行验证过库能用,到了编辑器里就不行,很容易怀疑人生。
6.2 几条教程不会写的经验
第一条经验关于虚拟环境。我现在的习惯是每个项目一个独立虚拟环境,绝不偷懒。早期图省事全局装,后来环境一乱,排查问题的时间比建十个虚拟环境加起来还多。建环境的成本很低,命令行一行命令,或者 PyCharm 里点几下,但这个习惯能帮你省下大量“这库怎么突然用不了了”的困惑时间。
第二条经验关于版本记录。装完环境之后,我会导出一份依赖清单:
pip freeze > requirements.txt这个文件记录了当前环境所有包的精确版本。好处是,当你换了机器、或者把项目分享给别人,直接pip install -r requirements.txt就能复刻一个完全一样的环境,不会出现“在我这能跑在你那报错”的经典问题。养成这个习惯,对以后协同开发帮助极大。
第三条经验关于报错信息。新手看到红色报错容易慌,其实大部分报错的最后一行才是真正的关键。看报错要倒着看,先看最后一行的错误类型和信息,再往上追溯是哪一行代码触发的。把这个习惯建立起来,你自己就能解决绝大多数问题,而不是遇到报错就到处问人。
第四条经验关于学习路径。环境搭好之后,不要一头扎进复杂的项目,先找几个小的、能跑通的例子,把数据加载、模型定义、训练循环、评估这个流程反复走几遍,走到你不用查资料就能写出来的程度。深度学习这门东西,动手跑通的收益远大于看视频看教程。我见过太多人收藏了一堆教程却从没真正跑起过一个模型,而真正拉开差距的,就是那条从“环境搭好”到“亲手跑通第一个网络”的路。环境这一关你过了,后面才是真正有趣的部分。