1. 为什么从CPU版PyTorch开始如果你刚接触深度学习或者手头没有一块像样的独立显卡看到铺天盖地的“GPU加速”、“CUDA”教程可能会觉得门槛高不可攀。别急我当年也是从一台只有集成显卡的笔记本开始的。今天要聊的就是如何在没有GPU的环境下把PyTorch这个深度学习框架稳稳当当地装起来并且让它跑起来。很多人有个误解觉得没有GPU就玩不了深度学习。其实不然。GPU的核心优势在于并行计算它能将训练一个复杂模型的时间从几天缩短到几小时。但对于学习、原型验证、小数据集实验或者推理一些已经训练好的轻量级模型CPU完全够用。PyTorch的CPU版本功能是完整的API和GPU版本完全一致只是计算后端换成了CPU。这意味着你写的所有代码在有了GPU之后几乎可以无缝迁移。从CPU起步能让你更专注于理解模型结构、数据流和PyTorch的核心逻辑而不是一开始就陷入驱动、CUDA版本兼容性这些令人头疼的“环境玄学”里。所以无论你是学生、研究者还是刚转行的开发者手头只有一台普通电脑这篇文章就是为你准备的。我们会绕开所有关于GPU的复杂配置直击核心如何用最简洁、最不容易出错的方式搭建一个纯净、可用的PyTorch学习环境。2. 环境基石Python与包管理器的选择在安装PyTorch之前我们需要一个稳固的基础——Python环境。这里我强烈建议不要直接使用系统自带的Python。系统Python通常版本较旧且直接在上面安装包容易引起权限冲突和依赖混乱一旦玩坏了可能影响系统其他功能。2.1 为什么是Anaconda/Miniconda对于数据科学和机器学习领域Anaconda或其精简版Miniconda是事实上的标准环境管理工具。它们解决了几个核心痛点环境隔离你可以为每个项目创建独立的Python环境比如一个环境用PyTorch 1.13另一个用PyTorch 2.0彼此互不干扰。依赖管理Conda不仅能管理Python包还能管理非Python的库依赖比如某些科学计算库的底层C/Fortran库这是pip有时做不到的。预编译包Conda提供的包通常是预编译好的在各种操作系统上安装更稳定尤其是涉及NumPy、SciPy这类包含本地代码的包。Miniconda只包含Conda、Python和少量核心依赖比完整的Anaconda自带几百个数据科学包更轻量更灵活。我通常推荐Miniconda需要什么包再自己装保持环境干净。2.2 安装Miniconda实操步骤下载访问Miniconda官网根据你的操作系统Windows/macOS/Linux和系统架构通常是64位下载对应的安装包。对于Windows选择“Miniconda3 Windows 64-bit”的.exe安装程序。安装运行安装程序。有几个关键选项需要注意安装路径避免包含中文和空格比如D:\Miniconda3。“Add Miniconda3 to my PATH environment variable”这个选项不建议勾选。勾选后Conda的基础环境会全局可用但可能与你系统已有的其他软件如某些IDE冲突。我们后续通过Conda自带的命令行来激活环境更安全。“Register Miniconda3 as my default Python 3.x”这个可以勾选影响不大。验证安装安装完成后在Windows开始菜单中找到并打开“Anaconda Prompt (Miniconda3)”。这是一个专为Conda配置的命令行。输入以下命令并回车conda --version如果显示类似conda 24.x.x的版本号说明安装成功。2.3 创建专属的PyTorch环境打开“Anaconda Prompt”我们创建一个名为pytorch_cpu的独立环境并指定使用Python 3.9这是一个长期支持、生态兼容性极好的版本。conda create -n pytorch_cpu python3.9执行后Conda会解析依赖并提示你将安装哪些包输入y确认。完成后激活这个环境conda activate pytorch_cpu激活后命令行提示符前面通常会显示环境名(pytorch_cpu)这表示你后续的所有操作都只在这个“沙箱”内生效。3. 核心安装获取正确的PyTorch CPU版本这是最关键的一步也是新手最容易踩坑的地方。PyTorch官网的安装命令生成器默认会推荐带CUDA的版本我们需要主动选择CPU版本。3.1 官方安装命令生成器的正确用法打开PyTorch官网找到“Get Started”页面下的安装命令生成器。按以下方式选择PyTorch Build选择Stable (2.3.0)。稳定版是经过充分测试的最适合学习和生产。Your OS选择你的操作系统。Package选择Conda。这能确保我们通过Conda来安装与之前创建的环境管理方式一致。Language选择Python。Compute Platform这是关键一定要选择CPU。这个选项会生成不包含CUDA工具链的纯CPU版本安装命令。选择完成后页面下方会生成一行命令例如conda install pytorch torchvision torchaudio cpuonly -c pytorch3.2 执行安装与深度解析将生成的命令复制到已激活的pytorch_cpu环境的“Anaconda Prompt”中执行。conda install pytorch torchvision torchaudio cpuonly -c pytorch这条命令做了以下几件事pytorchPyTorch主框架。torchvision一个专门用于计算机视觉的库提供了常用的数据集如MNIST、CIFAR-10、模型架构如ResNet和图像变换工具。即使你不做CV很多教程的例子也会用到它。torchaudio用于音频处理的库。cpuonly这是一个元包。它的作用不是安装一个软件而是作为一个约束条件告诉Conda“我要安装的PyTorch必须是纯CPU版本的不能依赖任何CUDA相关的包”。这是确保我们安装纯净CPU版的核心。-c pytorch指定从PyTorch官方的Conda频道下载包保证版本的权威性和兼容性。安装过程会显示将要安装、更新或降级的包列表。确认无误后输入y。网络通畅的情况下几分钟即可完成。注意有时特别是在国内网络环境下从默认的pytorch频道下载可能速度较慢或中断。你可以尝试添加清华大学的Conda镜像源来加速。但需注意镜像源可能存在同步延迟。对于PyTorch这类核心包如果镜像源版本不是最新的我建议多等一会儿直接从官方源安装或使用-c pytorch -c conda-forge同时指定官方和conda-forge频道conda-forge社区维护的包通常也很及时。3.3 验证安装是否成功安装完成后我们需要验证PyTorch是否被正确安装并且确认它运行在CPU模式。在(pytorch_cpu)环境下启动Python交互界面python然后依次输入以下Python代码import torch # 导入PyTorch如果没有报错说明安装成功 print(torch.__version__) # 打印PyTorch版本号确认版本 print(torch.cuda.is_available()) # 检查CUDA是否可用对于CPU版本这里必须返回 False x torch.randn(2, 3) # 创建一个2行3列的随机张量 print(x) # 打印这个张量 print(x.device) # 打印张量所在的设备这里应该显示 ‘cpu’如果一切顺利你将看到类似以下的输出2.3.0 False tensor([[ 0.1234, -0.5678, 0.9012], [-0.3456, 0.7890, -0.1234]]) device(typecpu)torch.cuda.is_available()返回False是我们期望的结果它明确告诉我们当前环境没有GPU支持所有计算都将在CPU上进行。x.device显示为cpu也证实了这一点。4. 配套工具链提升开发体验有了PyTorch我们还需要一些“趁手兵器”来写代码、管理项目。这里我推荐最主流的组合。4.1 集成开发环境IDE的选择与配置PyCharm (推荐)JetBrains出品专为Python开发设计功能强大对科学计算和数据科学支持良好。它的专业版对学术用户是免费的。安装从官网下载社区版免费或专业版。安装过程简单一直“下一步”即可。配置Conda环境安装后新建一个项目在项目设置File - Settings - Project: 你的项目名 - Python Interpreter中点击齿轮图标选择Add...然后选择Conda Environment-Existing environment找到你之前创建的Conda环境下的Python解释器路径通常像D:\Miniconda3\envs\pytorch_cpu\python.exe。这样PyCharm就会使用我们这个安装了PyTorch CPU版的环境来运行和调试代码。Visual Studio Code (VSCode)轻量、免费、插件生态丰富。通过安装Python和Jupyter插件也能获得极佳的开发体验。配置在VSCode中按CtrlShiftP打开命令面板输入Python: Select Interpreter选择路径为...envs\pytorch_cpu\python.exe的解释器即可。4.2 Jupyter Notebook/Lab交互式探索利器对于学习、数据分析和模型原型快速迭代Jupyter Notebook是无可替代的工具。它以单元格Cell为单位运行代码可以即时看到结果并混合编写Markdown文档非常适合教学和探索。在我们的pytorch_cpu环境中安装Jupyterconda install jupyterlab notebook -c conda-forge我推荐直接安装jupyterlab它是Jupyter Notebook的下一代界面更现代化功能也更强大。安装完成后在命令行输入jupyter lab会自动在浏览器中打开Lab界面。你可以新建一个Notebook选择Python 3内核在单元格中输入import torch等代码并运行体验交互式编程。4.3 版本控制Git入门虽然与PyTorch安装不直接相关但使用Git进行版本控制是任何严肃开发的必备技能。它能帮你管理代码历史方便回滚和协作。安装Git从Git官网下载安装程序默认选项安装即可。基本配置安装后在命令行或Git Bash中设置你的用户名和邮箱这是你提交代码的“签名”。git config --global user.name Your Name git config --global user.email your.emailexample.com在PyCharm/VSCode中使用这两个IDE都内置了优秀的Git图形界面支持你可以很方便地进行提交Commit、推送Push、拉取Pull等操作无需记忆复杂命令。5. 你的第一个PyTorch CPU程序从张量到模型环境搭好了工具备齐了我们来点实际的。通过一个完整的微型流程感受一下PyTorch在CPU上是怎么工作的。5.1 张量Tensor操作一切的基础张量是PyTorch中最基本的数据结构你可以把它理解为N维数组。CPU上的张量操作和GPU在语法上完全一致。import torch # 1. 创建张量 cpu_tensor torch.tensor([[1, 2, 3], [4, 5, 6]]) # 从列表创建 zeros_tensor torch.zeros(2, 3) # 创建2x3的全0张量 random_tensor torch.randn(2, 3) # 创建2x3的标准正态分布随机张量 print(CPU Tensor:, cpu_tensor) print(Device:, cpu_tensor.device) # 输出: device(typecpu) # 2. 基本运算 a torch.tensor([1.0, 2.0, 3.0]) b torch.tensor([4.0, 5.0, 6.0]) c a b # 逐元素相加 d torch.matmul(a.reshape(1, 3), b.reshape(3, 1)) # 矩阵乘法点积 print(c a b:, c) print(d a · b:, d) # 3. 与NumPy互转 (非常常用) import numpy as np numpy_array np.array([7, 8, 9]) torch_tensor_from_numpy torch.from_numpy(numpy_array) # NumPy - PyTorch numpy_array_back torch_tensor_from_numpy.numpy() # PyTorch - NumPyCPU上的张量计算由PyTorch调用底层的数学库如Intel MKL或OpenBLAS进行优化对于中小规模数据速度完全可以接受。5.2 构建一个简单的神经网络我们来定义一个最简单的全连接网络用于理解PyTorch的模型定义方式。import torch.nn as nn import torch.nn.functional as F class TinyNet(nn.Module): # 必须继承 nn.Module def __init__(self): super(TinyNet, self).__init__() # 定义网络层 self.fc1 nn.Linear(10, 5) # 全连接层输入特征10输出特征5 self.fc2 nn.Linear(5, 2) # 全连接层输入5输出2 (例如二分类) def forward(self, x): # 定义前向传播路径 x F.relu(self.fc1(x)) # 第一层后接ReLU激活函数 x self.fc2(x) return x # 实例化模型 model TinyNet() print(model) # 创建一个模拟输入 (batch_size4, feature_size10) input_data torch.randn(4, 10) output model(input_data) print(Input shape:, input_data.shape) print(Output shape:, output.shape) # 应该是 (4, 2)这个模型完全由CPU执行。nn.Linear层的计算就是矩阵乘法和偏置加法。5.3 训练循环骨架反向传播与优化即使没有GPU我们也能完整地走一遍训练流程。这里我们用随机数据模拟一个训练步骤。import torch.optim as optim # 1. 准备模拟数据 num_samples 100 num_features 10 X torch.randn(num_samples, num_features) # 100个样本每个10维特征 # 生成简单的二分类标签 (0或1) y (X.sum(dim1) 0).long() # 如果特征和大于0则为1否则为0 # 2. 定义模型、损失函数和优化器 model TinyNet() criterion nn.CrossEntropyLoss() # 交叉熵损失适用于分类问题 optimizer optim.SGD(model.parameters(), lr0.01) # 随机梯度下降优化器 # 3. 一个简单的训练循环 num_epochs 5 for epoch in range(num_epochs): # 前向传播 outputs model(X) loss criterion(outputs, y) # 反向传播 optimizer.zero_grad() # 清空上一步的梯度非常重要 loss.backward() # 计算损失关于模型参数的梯度 # 更新参数 optimizer.step() print(fEpoch [{epoch1}/{num_epochs}], Loss: {loss.item():.4f})这段代码在CPU上完整执行了前向计算、损失评估、反向传播求导和参数更新。loss.backward()会沿着计算图利用链式法则自动计算所有参数的梯度这是PyTorch的核心特性——自动微分Autograd。优化器optimizer.step()则根据梯度更新参数。6. CPU环境下的性能调优与实战建议在GPU稀缺的情况下让CPU发挥最大效能至关重要。以下是一些切实可行的优化策略。6.1 利用多核并行计算现代CPU都是多核心的。PyTorch的许多操作在底层已经通过库如OpenMP实现了多线程并行。你可以通过设置环境变量来控制线程数以匹配你的CPU核心数避免资源闲置或过度争抢。import torch # 设置PyTorch使用的CPU线程数通常设置为物理核心数 torch.set_num_threads(4) # 例如对于4核CPU对于数据加载部分DataLoader的num_workers参数可以并行预加载数据避免训练时等待IO。from torch.utils.data import DataLoader, TensorDataset dataset TensorDataset(X, y) dataloader DataLoader(dataset, batch_size16, shuffleTrue, num_workers2) # 使用2个子进程加载数据注意在Windows上num_workers 0有时会引发多进程序列化问题。如果遇到错误可以尝试设置为0。在Linux/macOS上则问题较少。6.2 批处理Batch的重要性即使是在CPU上批处理也是加速训练的关键。一次处理一个样本batch_size1的效率极低因为每次前向/反向传播都有固定的开销。增大batch_size可以摊薄这部分开销更充分地利用CPU的向量化指令如SIMD。但batch_size也不是越大越好它会影响模型优化的动态和内存占用。可以从16、32、64开始尝试找到适合你机器内存和任务的最佳值。6.3 监控CPU与内存使用在训练时打开任务管理器Windows或活动监视器macOS/htopLinux观察CPU利用率和内存占用。CPU利用率理想情况下在训练时尤其是DataLoader工作且模型计算时应该接近100%对于设置的多线程。如果很低可能是batch_size太小、num_workers设置不当或者代码中存在不必要的同步点如频繁的.item()调用将张量转为Python标量这会阻塞计算。内存确保你的数据集和模型不会导致内存交换Swapping。一旦开始使用硬盘虚拟内存速度会急剧下降。如果内存不足考虑减小batch_size、使用更小的模型或者采用梯度累积等技术来模拟大批次。6.4 针对CPU优化的PyTorch构建PyTorch官方预编译的CPU版本通常已经使用了优化的数学库如MKL。但如果你是从源码编译PyTorch确保启用以下优化使用MKLIntel Math Kernel Library对Intel CPU有深度优化。使用OpenBLAS一个开源的优化BLAS库在非Intel CPU上可能表现更好。 对于绝大多数用户直接使用Conda或Pip安装的预编译包就是最优选择。7. 常见问题排查与进阶路线即使按照步骤操作也可能会遇到问题。这里列出几个典型问题及解决方案。7.1 安装失败或导入错误ImportError: DLL load failed或lib not found这通常是环境混乱或依赖冲突。最彻底的解决方案是创建一个全新的Conda环境严格按照上述步骤重装。确保安装命令中包含cpuonly。CondaHTTPError或下载极慢这是网络问题。可以尝试添加国内镜像源如清华、中科大但要注意镜像的同步延迟。对于PyTorch有时耐心等待官方源或使用conda-forge频道更可靠。版本不匹配确保Python版本、PyTorch版本以及torchvision、torchaudio的版本大致匹配。官网安装命令生成器给出的组合是经过测试的最好遵循它。7.2 代码在CPU上运行太慢首先进行性能剖析使用Python的cProfile模块或PyTorch的torch.utils.bottleneck来找出代码中的热点最耗时的部分。很多时候慢的不是模型计算而是数据预处理、日志记录或低效的Python循环。检查数据管道确保DataLoader的num_workers设置合理并且数据预处理如图像变换尽可能高效。可以考虑将预处理后的数据缓存到内存或高速磁盘。模型层面简化模型学习阶段使用更小、更浅的网络。减少参数全连接层是参数大户考虑是否能用卷积层或循环层替代。使用更高效的算子例如对于嵌入层使用torch.nn.EmbeddingBag可能比torch.nn.Embedding更高效。7.3 从CPU到GPU的平滑过渡当你未来获得GPU资源时迁移代码非常容易。只需要做两件事安装GPU版的PyTorch在新环境中使用官网命令生成器选择对应的CUDA版本安装。将模型和数据移动到GPUdevice torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) # 对于每个批次的训练数据 inputs, labels inputs.to(device), labels.to(device)你之前为CPU编写的所有模型定义、训练循环代码都无需改动。PyTorch的这一设计使得代码的设备无关性非常好。7.4 学习资源与项目实践官方教程PyTorch官网的Tutorials是最好起点从60分钟闪电战开始。经典模型复现在CPU上尝试复现LeNet-5MNIST、简单的RNN用于时序预测等轻量级模型。理解每一行代码比跑通一个巨大模型更重要。参与开源项目在GitHub上寻找一些标记为“beginner-friendly”或“good-first-issue”的PyTorch项目尝试阅读代码、修复文档或解决简单问题。从CPU开始深度学习之旅是一个扎实且低风险的选择。它迫使你更关注算法本质和代码效率这些基本功在未来使用强大GPU时会让你更加游刃有余。当你看到第一个由自己编写的、在CPU上成功运行并输出合理结果的模型时那份成就感是真实的。接下来就基于这个稳定的环境开始你的探索吧。