1. 先把路线定下来这套深度学习环境到底装了什么搞深度学习环境搭建这件事说难不难说简单也确实能把人卡一整天。Python、PyCharm、PyTorch CPU 版这三个东西单独拿出来装任何一个都不会让你抓狂但把它们串成一条能跑通的链路中间的解释器路径、包依赖、虚拟环境归属、IDE 绑定每一个环节都能出问题。我前后在 Windows 和 Linux 上装过不下二十次这套组合踩过的坑基本能覆盖新手会遇到的所有报错所以这篇就把完整流程和我自己的处理习惯一次讲透。这套环境解决的核心问题很直白让你在一台没有独立显卡、也不想折腾驱动的机器上把深度学习代码真正跑起来。Python 负责语言运行时PyCharm 负责写代码和调试PyTorch CPU 版负责提供张量运算、自动求导和神经网络模块。只要这三者版本对得上、解释器绑得准你就能从“装环境”阶段直接进入“写模型”阶段不用再去研究 CUDA 版本和显卡驱动的对应关系。适合看这篇的人大致有三类刚入门、连 Python 都还没装过的同学装过 Python 但被 PyCharm 解释器搞晕的同学以及手上有台办公本、只想先把算法逻辑跑通、暂时不碰显卡加速的同学。第三类其实最多CPU 版跑小规模卷积网络、跑张量运算、验证论文里的公式速度完全够用没必要一上来就给自己加难度。1.1 三个组件各自负责什么别搞混很多人装环境装到一半会迷糊是因为没分清这三个东西的边界。Python 是地基你写的所有.py文件最终都由它来解释执行pip也归它管。PyCharm 是壳子它自己不执行任何计算只是调用你指定的那个 Python 解释器去跑代码所以 PyCharm 里配置解释器这一步本质是在告诉 IDE“请用这个 exe 去运行我的文件”。PyTorch 是库装在某个具体的 Python 环境里只对那个环境可见。理解了这个层次关系很多报错就变得好解释了。比如 PyCharm 里import torch报ModuleNotFoundError八成是因为你在命令行里把 torch 装到了系统 Python而 PyCharm 项目用的是虚拟环境里的 Python两者不是同一个解释器。再比如命令行能跑、PyCharm 不能跑反过来也一样本质都是解释器不一致。提示判断解释器是否一致的唯一标准是路径不是名字。sys.executable打印出来的那个路径才是真相。1.2 为什么这次刻意选 CPU 版CPU 版 PyTorch 最容易被低估。它没有 CUDA 依赖装完就是能跑不用管显卡型号、不用管驱动版本、不用管 CUDA 和 cuDNN 的匹配矩阵。对于一个刚上手的人来说先把nn.Conv2d、nn.Linear、反向传播这些概念跑通比折腾环境死活装不上要有价值得多。性能上也不用太悲观。现在的 CPU 版本会调用 MKL 或者 OpenMP 做多线程加速矩阵运算效率并不低。跑一个几万参数的小卷积网络做手写数字识别CPU 上几十秒一个 epoch 是很正常的事。真正需要显卡的场景是参数量到千万级、数据量到几十万张以上那个阶段你再换 GPU 环境也不迟而且换的时候只需要换安装命令代码基本不用动。另外还有一点很实际笔记本用 CPU 跑训练风扇声可控电池撑得住不会出现显存不够的报错。做教学演示、写课程作业、验证算法思路CPU 版是性价比最高的起点。1.3 版本策略什么时候该锁死版本我的习惯是Python 选一个还在维护期的主版本小版本选最新PyTorch 选官网当前稳定版PyCharm 用最新的社区版。原因很简单这三者的兼容性由官方维护你只要不选过老的版本基本不会遇到兼容性断裂。但有两种情况我会主动锁版本。第一种是复现别人的项目requirements.txt里写死了torch1.13.1这种那就照着装别自作聪明升级。第二种是学校里统一的教学环境老师给的版本号就是标准答案跟着走最省事。需要特别提醒的是PyTorch 2.x 之后对 Python 版本有下限要求装之前先看一眼官方安装页面上写的支持范围。如果你用的是比较老的系统比如某些还在服役的旧笔记本Python 版本上不去那 PyTorch 也得跟着往下选这是唯一需要逆向推导的地方。2. Python 安装后面所有的坑几乎都从这里埋下Python 安装这一步绝大多数教程都是一句“下一步下一步”带过但我实际帮人排查问题时十次里有六次的问题根源在这一步。要么是安装时没勾 PATH要么是路径里带了中文和空格要么是装了三四个版本自己都记不清哪个是哪个。花五分钟把这一步做干净后面能省两小时。2.1 安装包从哪拿安装器怎么勾安装包只从官网拿搜索的时候认准 python.org 这个域名别去各种下载站那些站点捆绑安装的东西能让你怀疑人生。进官网后选 Windows 的 installer注意区分 32 位和 64 位现在基本都用 64 位。下载页面上通常有两个安装包一个是带 web 字样的小体积在线安装器一个是几十兆的完整离线包。我一般推荐离线包网络不好时不会装到一半失败。双击之后安装器第一屏有两个复选框下面那个写的是 Add python.exe to PATH这个必须勾。勾了它你才能在命令行里直接敲python就能进解释器否则每次都得手打完整路径。上面那个 Install launcher for all users 建议也勾上它提供py这个命令用来在多版本之间切换非常方便。然后不要直接点 Install Now点下面的 Customize installation。进去之后 Optional Features 那一页默认全勾就行包含 pip、IDLE、文档和测试套件。真正要看的是 Advanced Options 那一页有几个关键项选项建议说明Install Python 3.x for all users按需勾了装到 Program Files需要管理员权限多用户共用时勾Add Python to environment variables必勾等价于首页的 PATH 选项Associate files with Python建议勾双击 .py 文件会用 Python 打开Create shortcuts for installed applications建议勾开始菜单里方便找Precompile standard library建议勾第一次导入模块更快最关键的是安装路径。默认会装在用户目录下的 AppData 里路径长且带隐藏目录看着难受。我习惯改成C:\Python312这种短路径全英文、无空格、无中文。这一点在后续装某些需要编译的库时能救你一命因为路径里的空格会让一部分构建脚本解析出错。注意安装路径绝对不能出现中文。中文路径导致的问题往往不是立刻报错而是某个库在运行时静默失败或者加载模型文件时报编码错误排查起来极其折磨。2.2 三条命令验证装没装好装完之后别急着开 PyCharm先把命令行开出来验证。按 WinR 输入 cmd或者用 PowerShell依次敲下面三条python --version pip --version where python第一条应该输出类似Python 3.12.4的版本号。如果提示“不是内部或外部命令”说明 PATH 没生效。先别急着重装最可能的原因是安装完之后没有重开命令行窗口环境变量是进程启动时读取的老窗口读不到新值。关掉重开还不行就手动去系统环境变量里把 Python 安装目录和它下面的 Scripts 目录加进 Path。第二条输出 pip 的版本和它对应的 Python 路径。这里有个细节值得看pip 输出的路径应该和你 Python 的安装路径一致。如果 pip 指向的是另一个 Python说明你机器上有多个版本PATH 顺序有问题。第三条where python会把系统里所有能找到的 python.exe 都列出来按 PATH 顺序排列排在最上面的就是命令行实际调用的那个。这个命令在多版本环境下是我用得最多的排查工具一眼就能看出当前生效的是哪个。2.3 多版本共存怎么办如果你之前装过 Python 2.x 或者别的版本现在机器上有两三个我的建议是不要急着卸载旧的用py启动器管理就行。py -0会列出所有已注册的版本py -3.12就能指定用 3.12 启动。装上 py 启动器之后多版本共存反而比单版本更好管理。还有一个高频问题pip 装了包但 import 找不到。这几乎都是因为pip命令对应的 Python 和python命令对应的 Python 不是同一个。解决办法是用模块方式调用写成python -m pip install xxx这样能保证 pip 一定装到当前这个 Python 下。这个写法我从开始就养成了习惯几年下来省了无数麻烦强烈建议你也这么用。3. PyCharm 落地解释器绑不对等于白装Python 装好了接下来是 PyCharm。这一步的核心任务只有一个让你在 IDE 里点运行的时候用的是你刚装好的那个 Python。其他所有设置都是锦上添花。3.1 社区版够不够用说清楚官网上下载页面会给两个版本社区版和专业版。社区版免费专业版需要商业授权。对于纯 Python 开发、跑 PyTorch 训练脚本这件事来说社区版完全够用代码补全、调试器、断点、变量查看、内置终端、版本控制这些核心能力全都在。专业版多出来的是 Web 框架支持、数据库工具、远程解释器、部分科学计算的可视化面板这些东西。日常做深度学习实验用得上的概率不高。如果你是学生可以走官方的教育授权渠道申请免费使用专业版企业环境请通过正规授权渠道获取用破解补丁或者来路不明的注册方式风险不只是法律层面那些被改过的可执行文件本身就可能是安全后门。我的建议很直接先用社区版把环境跑通等你真的遇到社区版解决不了的问题再考虑升级。另外提一句现在也有不少人用 VS Code 配 Python 插件同样能跑通这套环境配置思路和 PyCharm 是一样的都是绑解释器。选哪个看个人习惯不影响后面任何内容。3.2 新建项目时把解释器绑对安装 PyCharm 的过程没什么好说的一路下一步安装路径同样建议纯英文。第一次打开会让你选主题、装插件全部按默认走就行插件以后随时能加。真正的关键在新建项目这一屏。Location 填项目目录同样是纯英文路径。下面有个 Python Interpreter 区域默认可能会给你推荐一个叫 Virtualenv 的新环境位置在项目目录下的.venv文件夹里。这个默认行为其实是好事我在 4.1 节会详细讲为什么。如果你已经有现成的解释器想直接用就展开解释器下拉框选 Add Local Interpreter在弹窗里选 System Interpreter然后浏览到你的python.exe。选完之后点 OK项目就会用这个解释器。还有一种情况是从别处拿到一个已有项目PyCharm 打开后右下角会提示没有配置解释器。这时候点右下角的解释器状态栏走同样的流程配置一遍就行。别忘了 PyCharm 有时会缓存旧配置配置完还是报错的话File 菜单里有个 Invalidate Caches 的选项清一下重启绝大多数玄学问题都能解决。3.3 上手先改的几个默认设置装完就用的默认配置有几个地方我每次都会改。第一个是编码Settings 里搜索 File Encodings把 Global Encoding 和 Project Encoding 都设成 UTF-8。这个在国内环境里特别重要不然读中文文件或者写中文注释时可能出乱码。第二个是字体和字号默认的行高对长时间看代码不太友好改成 14 到 16 号行距调宽一点眼睛会舒服很多。第三个是把内置终端调出来AltF12所有 pip 命令我都在这个终端里敲这样它自动激活的就是项目当前的虚拟环境不会装错地方。再分享一个习惯在项目根目录建一个requirements.txt每装一个新库就往上加一行。等你换电脑或者重装系统的时候一条命令就能把环境恢复。这个小动作刚开始做没什么感觉等到你需要复现三个月前的实验时你会感谢自己。4. PyTorch CPU 版安装虚拟环境和依赖链终于到正题。前面铺垫这么多是因为 PyTorch 安装是整条链路的最后一环前面任何一步没做对都会在这里以各种奇怪报错的形式爆发。4.1 为什么我坚持每个项目一个虚拟环境虚拟环境这个东西新手最容易觉得是多余步骤但它解决的是 Python 生态里最真实的痛点不同项目依赖不同版本的库。比如你上个月的项目要用numpy 1.x这个月的新项目要求numpy 2.x全局安装的话两者只能二选一装了这个那个就崩。虚拟环境把每个项目的依赖隔离在各自目录里互不干扰。PyCharm 新建项目时默认创建的.venv目录就是干这个的创建过程也就几秒钟。手动创建也简单在项目目录下打开命令行python -m venv .venvWindows 上激活用.venv\Scripts\activate激活成功后命令行提示符前面会多一个括号里面是环境名。这时候你敲where python指向的就是.venv里的 python而不是系统的那个。这一步是判断环境激活成功与否的硬标准。提示虚拟环境目录不要提交到版本库也不要在多个项目之间复制粘贴。它里面记录的路径是绝对路径换个位置就可能失效重建一个比修复一个快得多。如果你习惯用 Anaconda逻辑是一样的用conda create -n dl_cpu python3.12建环境然后conda activate dl_cpu。Conda 装 CPU 版 PyTorch 的命令是conda install pytorch torchvision torchaudio cpuonly -c pytorch。两种方式二选一不要混着用混用最容易出现装了却 import 不到的情况。4.2 安装命令逐段拆解PyTorch 官网的安装页面会给你一个生成好的命令选好系统、包管理器、语言和计算平台之后复制出来就行。CPU 版本对应的命令长这样python -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu这行命令里三个部分值得说清楚。python -m pip前面讲过了保证装到当前解释器。torch torchvision torchaudio三个包分别对应核心张量库、计算机视觉工具包、音频处理工具包如果你只做图像和通用模型torchvision建议装上torchaudio用不到可以不装。最后的--index-url是指定从 PyTorch 官方的 CPU 专用仓库下载这里面的包是编译好的 CPU 版本不会把 CUDA 那一大堆依赖拖下来。为什么必须指定这个索引地址因为默认的 PyPI 源上Windows 平台拿到的torch包体积会非常大因为它捆绑了 CUDA 相关的内容。指定了 cpu 索引下载的是精简版以 2.x 为例下载包是两百多兆的量级装好之后加上依赖通常占用一到两个 GB给磁盘留出 5GB 余量比较踏实。有些同学会先换国内镜像源来加速。这里要注意普通的 PyPI 镜像比如清华的 tuna 源、阿里云源不一定同步了 PyTorch 的 CPU 专用包混着用可能出现版本对不上或者找不到包的情况。稳妥做法是PyTorch 就用官方索引装其他库再用国内源命令分开敲。比如装 numpy、matplotlib 这类库的时候加-i https://pypi.tuna.tsinghua.edu.cn/simple就行。如果官方索引下载过程中断流可以先把 pip 的超时时间调长加上--timeout 1000然后重试。断点续传在 pip 上是默认行为重试的时候已下载的部分不会白费。安装之前记得升级一下 pip老版本 pip 对新版 wheel 格式的支持可能有问题python -m pip install --upgrade pip4.3 装完必须做的四项验证装完之后不要急着庆祝先跑验证。可以新建一个check_env.py内容如下import sys import torch import torchvision print(Python:, sys.version) print(解释器路径:, sys.executable) print(PyTorch:, torch.__version__) print(TorchVision:, torchvision.__version__) print(CUDA 可用:, torch.cuda.is_available()) print(可用线程数:, torch.get_num_threads()) x torch.randn(3, 4) y torch.randn(4, 2) print(矩阵乘法结果形状:, (x y).shape)这六行输出把该确认的都确认了。解释器路径要和你在 PyCharm 里配的一致torch.cuda.is_available()输出False是正常的CPU 版本就该是 False如果是 True 反而说明装成了 GPU 版本矩阵乘法能算出(3, 2)的结果形状说明底层运算链路是通的。这四项里我最看重的是解释器路径。很多同学装完一切正常结果在 PyCharm 里跑就是 import 失败问题基本都在这里。命令行验证通过、PyCharm 里失败那就把 PyCharm 的解释器设置打开看一眼路径对不上就改过来。5. 环境验收用两段代码跑通完整闭环环境装完了但“装完”和“能用”是两回事。我习惯用两段代码做验收第一段验证张量和自动求导第二段跑一个极小的卷积网络两段都过了这个环境才算真的可用。5.1 张量基础与自动求导验证先来一段最基础的把张量创建、形状变换、广播、自动求导这几个核心概念都过一遍import torch # 从列表创建指定类型 a torch.tensor([[1.0, 2.0], [3.0, 4.0]], dtypetorch.float32) print(a 的形状:, a.shape, 数据类型:, a.dtype) # 全零、全一、随机 print(torch.zeros(2, 3)) print(torch.ones(2, 3)) print(torch.randn(2, 3)) # 形状变换 b a.view(4) print(展平后:, b) c a.reshape(1, 4) print(reshape 后:, c.shape) # 广播机制 row torch.tensor([10.0, 20.0]) print(广播相加:, a row) # 自动求导 w torch.tensor([2.0], requires_gradTrue) loss (w ** 2 3 * w).sum() loss.backward() print(w 的梯度:, w.grad)最后一行输出应该是 7因为对 w 求导得到 2w3代入 w2 就是 7。这个值能对上说明反向传播的整个链路是通的。这里有个新手容易混淆的点view和reshape的区别。view要求张量在内存里是连续的reshape会在必要时先复制一份再变换形状更宽容。日常写代码我基本都用reshape省得去操心连续性。另外一个高频坑是原地操作a.add_(1)这种带下划线的写法会修改原张量如果这个张量后面还要参与求导可能触发计算图报错调试的时候要留意。5.2 一个能跑起来的小卷积网络第二段代码我用随机数据造一个迷你卷积网络不依赖任何数据集下载纯粹验证前向、反向、参数更新这条链路import torch import torch.nn as nn import torch.optim as optim class TinyCNN(nn.Module): def __init__(self, num_classes10): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 8, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(8, 16, kernel_size3, padding1), nn.ReLU(), nn.AdaptiveAvgPool2d(1) ) self.classifier nn.Linear(16, num_classes) def forward(self, x): x self.features(x) x torch.flatten(x, 1) return self.classifier(x) device torch.device(cpu) model TinyCNN().to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-3) inputs torch.randn(16, 3, 32, 32).to(device) targets torch.randint(0, 10, (16,)).to(device) for step in range(5): optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, targets) loss.backward() optimizer.step() print(f第 {step1} 步, loss {loss.item():.4f}) print(参数量:, sum(p.numel() for p in model.parameters()))这段代码在纯 CPU 上跑五步迭代基本是秒出结果。注意AdaptiveAvgPool2d(1)这个操作它把任意尺寸的特征图压成 1x1这样全连接层的输入维度就固定了不用手算卷积之后的尺寸。这是我自己写小网络时的偷懒技巧能省掉一大串尺寸推导。关于数据形状PyTorch 卷积层要求的是(N, C, H, W)也就是批大小、通道数、高、宽。如果你从 PIL 或者 OpenCV 读进来的图像是(H, W, C)需要先转成张量再调整维度顺序用permute(2, 0, 1)就行。这个顺序问题在第一次接触图像任务时几乎人人都会踩报错信息通常是维度不匹配看到这类报错先检查形状。5.3 CPU 上跑得更快的一些小手段既然用的是 CPU有些调优手段值得知道。第一是控制线程数默认 PyTorch 会用上所有核心但在某些机器上线程开太多反而会因为调度开销变慢torch.set_num_threads(4)具体数字需要在你自己机器上试一般设成物理核心数或者物理核心数的一半比较合适。第二是批大小CPU 上没有显存限制但批太大反而会让内存带宽成为瓶颈从小批开始试逐渐加倍找到那个耗时增长开始不线性的点。第三是数据类型训练结束后做推理的时候可以用model.eval()加上torch.no_grad()能省下大量内存和计算。还有一点如果你用的是 Intel 较新的处理器PyTorch 会通过 MKL 自动利用 AVX 指令集加速这个不需要额外配置。可以留意一下装上之后矩阵运算的实际速度如果发现比预期慢很多检查一下是不是不小心装成了带 CUDA 依赖的版本那种版本在无显卡机器上反而会拖慢启动。6. 常见故障排查与踩坑记录环境搭建的价值有一半在排查能力上。下面这些是我这几年被问得最多的问题整理成速查表遇到报错先扫一遍能省下大量搜索时间。6.1 问题速查表报错现象最可能的原因处理方式python 不是内部或外部命令PATH 未生效重开命令行窗口仍不行则手动加环境变量pip install成功但import torch失败pip 和 python 不是同一个解释器改用python -m pip install重装PyCharm 里报 ModuleNotFoundError命令行正常IDE 解释器指向系统 Python检查项目解释器路径改成.venv里的安装 PyTorch 时卡住或超时网络中断或超时设置太短加--timeout 1000重试利用断点续传ImportError: DLL load failed缺少系统运行库安装 Microsoft Visual C 运行库重启后重试导入 numpy 相关报错numpy 大版本不兼容按 PyTorch 版本的兼容要求装对应 numpy内存占用飙升、程序被系统杀掉批大小或数据量过大减小批大小用 DataLoader 分块加载训练速度极慢线程数设置不合理用torch.set_num_threads调整后实测对比PyCharm 配置改了不生效缓存未刷新清理缓存并重启 IDE中文路径下运行异常路径含非 ASCII 字符项目和环境全部移到纯英文路径下这张表里前三行覆盖了实际遇到的八成问题。特别是第一行和第二行看起来很蠢但每一次帮人排查最后都落在这两个点上。关于 DLL load failed补充一句。这个报错在 Windows 上出现频率不低根本原因是 PyTorch 的底层二进制依赖了系统的 C 运行库而某些精简版系统没有预装。解决办法就是去官网下载最新版的 Visual C Redistributable 装上装完重启一次。不要试图通过降级 PyTorch 来绕过这个问题那是治标不治本。关于 numpy 兼容性现在的 PyTorch 2.x 对 numpy 2.x 的支持已经比较完善了但如果你的项目里有别的老库依赖 numpy 1.x两边会打架。稳妥做法是先装 PyTorch让它自己挑依赖版本再装其他库出现冲突时 pip 会给出提示按提示降级就行。6.2 几条文档里不会写的经验第一条是我最想强调的所有东西都放纯英文路径下。项目目录、Python 安装目录、虚拟环境目录、数据集存放目录全部英文加数字加下划线。中文路径引发的问题往往不在安装阶段爆发而是在你读数据集或者保存模型的时候突然出现报错信息还特别难懂。我见过最离谱的一次是模型能训练但保存失败排查了半天才发现是路径里两个字的问题。第二条是关于环境的可复现性。养成随手记录的习惯每装一个库就更新requirements.txt。我一般用python -m pip freeze requirements.txt直接导出当前环境的全部依赖和版本号换成新机器的时候python -m pip install -r requirements.txt一把装回来。这个习惯能让你在换电脑、重装系统、帮同学配环境时效率提升一个量级。第三条是关于“重装大法”。环境出问题的时候新手容易陷入一个误区就是拼命在原环境上修。我的经验是如果一个报错你排查超过半小时还没头绪直接删掉.venv重建一个环境重新装一遍依赖。建环境加装 PyTorch 在网速正常的情况下也就五分钟比继续折腾要有性价比得多。这不是逃避问题是效率选择。第四条是关于版本记录。每次搭好一个能用的环境我会在项目根目录写一个简短的 README记下 Python 版本、PyTorch 版本、几个关键库的版本和安装命令。三个月后你回头看这份记录的价值远超你写它花的两分钟。注意不要把全局 Python 环境当成实验田。任何python -m pip install之前先确认命令行提示符前面的环境名是不是你想要的。我有过把一堆实验性依赖装进系统 Python后来导致另一个正经项目跑不起来的经历清理起来非常麻烦。最后分享一个我在实际使用中的体会。刚入门那段时间我总觉得环境搭建是个没有技术含量的杂活恨不得找个一键脚本糊弄过去。后来才慢慢意识到搭建环境的过程本身就是在建立对整个工具链的认知。你知道了 Python 和 pip 的关系知道了 IDE 只是个壳子知道了虚拟环境为什么存在这些东西在你后面遇到依赖冲突、部署上线、容器化打包这些问题时会一遍遍地派上用场。把这一步走扎实收益远不止“能跑代码”这么简单。后面如果算力不够用了要上 GPU那也只是把安装命令里的索引地址换成对应 CUDA 版本的地址代码里把设备改成cuda其余流程和今天走的这一套完全一致。所以这套 CPU 环境不是权宜之计而是一个可以平滑升级的起点。