零GPU入门PyTorch:CPU环境搭建与MNIST手写数字识别实战
2026/8/18 8:31:27 网站建设 项目流程

想入门深度学习,但手头没有高性能GPU?看到PyTorch官网复杂的安装命令就头疼?别担心,这篇文章就是为你准备的。

很多初学者在第一步“环境搭建”上就卡住了,尤其是面对CUDA、cuDNN、GPU驱动这些概念时。一个常见的误区是:没有GPU就无法学习和实践深度学习。这直接劝退了大批对AI感兴趣的同学。实际上,对于学习、原型验证和小规模数据处理,CPU环境完全足够。PyTorch官方也提供了完善的CPU版本,安装过程比GPU版本简单得多。

本文将彻底解决这个问题。我会带你绕开所有复杂的GPU配置,手把手在纯CPU环境下安装PyTorch,并完成一个完整的深度学习模型训练流程。你将学到的不只是复制粘贴命令,而是理解每一步背后的逻辑,以及如何在CPU上高效地进行深度学习实践。无论你是学生、算法爱好者,还是想快速验证想法的开发者,这篇文章都能让你在10分钟内跑通第一个PyTorch程序。

1. 为什么你应该从CPU开始学习PyTorch?

在急于追求GPU算力之前,我们先明确一个核心观点:对于深度学习入门和大部分实验验证阶段,CPU环境不仅是可行的,有时甚至是更优的选择。

这听起来可能和主流观点相悖,但理由很充分:

  1. 零门槛,专注算法本身:GPU环境涉及硬件兼容性、驱动版本、CUDA版本等一系列复杂依赖。一个环节出错就可能导致安装失败。从CPU开始,你可以跳过所有硬件相关的坑,把100%的精力集中在理解PyTorch的API、数据流和模型构建上。
  2. 成本与便捷性:不是每个人都有条件配备高性能显卡。个人笔记本、公司的普通开发机、甚至一些云服务器默认都是CPU环境。学会在CPU上工作,意味着你可以在任何设备上开始学习。
  3. 理解计算本质:在CPU上运行,虽然慢,但能让你更真切地感受到模型的计算量、数据的内存占用。这种“体感”对于后续进行性能优化和理解GPU加速的原理非常有帮助。
  4. 平滑过渡到GPU:PyTorch的代码在CPU和GPU之间切换通常只需一两行代码(.to(‘cuda’))。先在CPU上把整个流程跑通、调试无误,再迁移到GPU进行加速,是更稳妥的工程实践。

所以,如果你卡在环境配置,或者被GPU相关的问题困扰,直接使用CPU版本是最高效的启动策略。接下来,我们就从最干净的环境开始。

2. 核心概念:PyTorch、CPU版本与深度学习环境

在动手之前,快速厘清几个关键概念,避免后续混淆。

PyTorch:一个由Facebook开源的深度学习框架。它以动态计算图、直观的API设计和强大的Python集成而闻名,是目前学术界和工业界最流行的框架之一。你可以把它理解为一个“超级计算器”,专门为处理多维数组(张量)和自动求导而设计。

CPU版本 vs GPU版本

  • CPU版本:利用计算机的中央处理器进行计算。优点是无须额外硬件,兼容性极好。缺点是对于大规模矩阵运算速度较慢。
  • GPU版本:利用图形处理器进行计算。GPU有成百上千个核心,擅长并行处理海量简单计算(这正是神经网络需要的)。速度快,但需要NVIDIA显卡、特定驱动和CUDA工具包。

深度学习环境:这不仅仅指PyTorch本身,而是一个工具链,通常包括:

  1. Python:PyTorch的运行语言。
  2. 包管理工具:如pipconda,用于安装和管理PyTorch及其依赖。
  3. PyTorch:核心框架。
  4. 辅助库:如torchvision(处理图像数据)、numpy(科学计算)等。

Anaconda (conda):一个强大的Python数据科学平台和包管理器。它最大的优势是能创建相互隔离的“虚拟环境”,避免不同项目间的包版本冲突。强烈建议初学者使用conda来管理环境,它能自动处理很多依赖关系。

3. 环境准备:安装Python与Conda

我们的目标是创建一个纯净、可复现的PyTorch学习环境。请根据你的操作系统选择步骤。

3.1 检查与安装Python

首先,打开你的终端(Windows: CMD或PowerShell; macOS/Linux: Terminal)。

输入以下命令检查是否已安装Python及版本:

python --version # 或 python3 --version

如果显示Python 3.83.93.103.11,且版本号大于等于3.8,则符合PyTorch的要求,可以跳过安装。如果未安装或版本过低,请访问 Python官网 下载最新稳定版安装。安装时务必勾选 “Add Python to PATH”

3.2 安装Anaconda(推荐)

访问 Anaconda官网 下载对应操作系统的安装包。安装过程基本是“下一步”即可。 安装完成后,打开一个新的终端,输入以下命令验证安装:

conda --version

如果成功显示版本号(如conda 24.x.x),说明安装成功。

3.3 创建专用的PyTorch虚拟环境

这是最佳实践,能保证你的学习环境独立且干净。

# 创建一个名为 pytorch_cpu 的新环境,并指定Python版本为3.9 conda create -n pytorch_cpu python=3.9

系统会提示安装一些基础包,输入y确认。 环境创建完成后,激活它:

# Windows conda activate pytorch_cpu # macOS / Linux conda activate pytorch_cpu

激活后,你的命令行提示符前面通常会显示(pytorch_cpu),表示你已进入该环境。后续所有操作都在这个激活的环境中进行。

4. 核心步骤:安装PyTorch CPU版本

这是最关键的一步。我们将使用PyTorch官网提供的安装命令,但进行针对性调整。

4.1 访问PyTorch官网获取安装命令

打开 PyTorch官网 。你会看到一个配置选择器:

  1. PyTorch Build: 选择Stable (稳定版)
  2. Your OS: 选择你的操作系统。
  3. Package: 强烈推荐选择Conda。它会通过Conda渠道安装,依赖管理更省心。
  4. Language: 选择Python
  5. Compute Platform:这是关键!一定要选择CPU

选择完成后,网站会生成一行安装命令。例如,对于Windows系统,命令可能类似于:

conda install pytorch torchvision torchaudio cpuonly -c pytorch

请注意-c pytorch表示从PyTorch官方频道(channel)下载,确保版本最新最兼容。

4.2 执行安装命令

将官网生成的命令复制到你的终端(确保pytorch_cpu环境已激活)并执行。

# 示例命令,请以官网生成为准 conda install pytorch torchvision torchaudio cpuonly -c pytorch

过程中会提示确认安装一系列包(包括pytorch, torchvision, torchaudio, cpuonly等),输入y并回车。等待下载和安装完成,这可能需要几分钟,取决于你的网速。

4.3 验证安装是否成功

安装完成后,我们需要验证PyTorch能否正常导入,并且确认它运行在CPU上。 在终端中,启动Python交互环境:

python

然后依次输入以下Python代码:

import torch # 导入PyTorch print(torch.__version__) # 打印PyTorch版本号 print(torch.cuda.is_available()) # 检查CUDA(GPU)是否可用

你会看到类似这样的输出:

2.1.0 False

第一行是你安装的PyTorch版本。第二行输出False是我们期望的结果!这明确表明当前PyTorch运行在CPU模式下,没有检测到GPU。验证成功!

输入exit()退出Python交互环境。

5. 完整示例:用CPU训练你的第一个神经网络

理论说再多不如亲手运行一行代码。现在,我们将在CPU上完成一个经典的机器学习任务——手写数字识别(MNIST)。我们将创建一个完整的Python脚本。

5.1 创建项目文件

在你的工作目录下,创建一个名为first_pytorch_mnist.py的文件。

5.2 编写完整代码

将以下代码复制到文件中。代码包含了数据加载、模型定义、训练和评估的全流程,我添加了详细注释。

# first_pytorch_mnist.py import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import time print("PyTorch版本:", torch.__version__) print("是否可用CUDA:", torch.cuda.is_available()) print("正在使用设备: CPU") # 1. 数据准备 # 定义数据预处理:将图像转换为张量,并做归一化 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) # MNIST数据集的均值和标准差 ]) # 下载并加载训练集和测试集 train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST('./data', train=False, download=True, transform=transform) # 创建数据加载器,批量大小为64 train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False) # 2. 定义神经网络模型 # 一个简单的多层感知机(MLP) class SimpleMLP(nn.Module): def __init__(self): super(SimpleMLP, self).__init__() # 定义网络层 # MNIST图片是28*28=784像素 self.fc1 = nn.Linear(784, 512) # 全连接层1: 784 -> 512 self.fc2 = nn.Linear(512, 256) # 全连接层2: 512 -> 256 self.fc3 = nn.Linear(256, 10) # 全连接层3: 256 -> 10 (10个数字类别) def forward(self, x): # 定义数据前向传播的路径 x = x.view(-1, 784) # 将二维图像展平成一维向量 (batch_size, 784) x = F.relu(self.fc1(x)) # 第一层 + ReLU激活函数 x = F.relu(self.fc2(x)) # 第二层 + ReLU激活函数 x = self.fc3(x) # 输出层(未激活,配合CrossEntropyLoss) return x # 初始化模型、损失函数和优化器 model = SimpleMLP() criterion = nn.CrossEntropyLoss() # 交叉熵损失函数,适用于分类任务 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 随机梯度下降优化器 # 3. 训练循环 def train(epoch): model.train() # 将模型设置为训练模式(影响Dropout、BatchNorm等层) train_loss = 0 correct = 0 total = 0 for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() # 清空上一轮的梯度 output = model(data) # 前向传播,得到预测值 loss = criterion(output, target) # 计算损失 loss.backward() # 反向传播,计算梯度 optimizer.step() # 更新模型参数 # 统计训练信息 train_loss += loss.item() _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() # 每处理100个batch打印一次进度 if batch_idx % 100 == 0: print(f'训练轮次: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ' f'({100. * batch_idx / len(train_loader):.0f}%)]\t损失: {loss.item():.6f}') # 打印本轮平均训练精度和损失 avg_loss = train_loss / len(train_loader) accuracy = 100. * correct / total print(f'\n训练集结果: 平均损失: {avg_loss:.4f}, 准确率: {correct}/{total} ({accuracy:.2f}%)') return avg_loss, accuracy # 4. 测试函数 def test(): model.eval() # 将模型设置为评估模式 test_loss = 0 correct = 0 total = 0 # 在测试时不计算梯度,以节省内存和计算 with torch.no_grad(): for data, target in test_loader: output = model(data) test_loss += criterion(output, target).item() _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() test_loss /= len(test_loader) accuracy = 100. * correct / total print(f'测试集结果: 平均损失: {test_loss:.4f}, 准确率: {correct}/{total} ({accuracy:.2f}%)\n') return test_loss, accuracy # 5. 主程序:运行训练和测试 print("\n开始训练...") start_time = time.time() num_epochs = 3 # 为了快速演示,只训练3轮。你可以增加轮数以提高精度。 for epoch in range(1, num_epochs + 1): print(f"\n=== 第 {epoch} 轮训练 ===") train(epoch) test() end_time = time.time() print(f"总训练时间: {end_time - start_time:.2f} 秒") print("训练完成!")

5.3 代码关键逻辑解读

  1. 数据流DataLoader负责分批次提供数据。每个batch包含64张图片和对应的标签。
  2. 模型定义SimpleMLP类继承自nn.Module__init__中定义网络层,forward中定义数据如何通过这些层。
  3. 训练循环:核心是for循环。每个循环完成:清空梯度 -> 前向计算 -> 计算损失 -> 反向传播 -> 更新参数。
  4. 模式切换model.train()model.eval()非常重要,它们控制了如Dropout等层在训练和评估时的不同行为。
  5. 设备无关性:注意,我们全程没有指定设备。在CPU环境下,张量(Tensor)会自动创建在CPU上。这是PyTorch的优点之一。

6. 运行结果与效果验证

现在,在终端中(确保在pytorch_cpu环境下),导航到你的脚本所在目录,运行它:

python first_pytorch_mnist.py

预期你会看到以下输出:

  1. 首先打印PyTorch版本和CUDA is available: False
  2. 程序会自动下载MNIST数据集(约60MB),保存在当前目录的./data文件夹下。
  3. 开始训练。你会看到类似以下的滚动日志,显示训练进度、损失值下降:
    训练轮次: 1 [0/60000 (0%)] 损失: 2.312345 训练轮次: 1 [6400/60000 (11%)] 损失: 2.123456 ...
  4. 每训练完一个epoch(完整遍历一遍训练集),会打印该轮在训练集和测试集上的损失(Loss)和准确率(Accuracy)
    训练集结果: 平均损失: 1.2345, 准确率: 54321/60000 (90.54%) 测试集结果: 平均损失: 0.4567, 准确率: 9876/10000 (98.76%)
  5. 经过3轮训练后,最终测试集准确率通常会达到97%以上。同时会打印出总训练时间。

如何判断成功?

  • 核心指标:测试集准确率(Accuracy)最终应高于95%。这证明你的模型学会了识别手写数字。
  • 损失下降:训练损失(Loss)应随着训练轮次增加而呈现下降趋势。
  • 无报错:程序从头到尾运行完毕,没有抛出ImportErrorRuntimeError等异常。

如果失败,第一步看哪里?

  1. 检查环境:首先确认终端提示符为(pytorch_cpu),并用python -c “import torch; print(torch.__version__)”验证PyTorch导入无误。
  2. 检查网络:首次运行会下载MNIST数据,如果网络超时,可以尝试手动下载或设置代理。
  3. 查看错误信息:Python的错误回溯(Traceback)会明确指出问题所在行和错误类型,这是排查的第一手资料。

7. 常见问题与排查思路

在CPU上安装和运行PyTorch相对简单,但仍可能遇到一些问题。下表总结了常见问题及解决方法:

问题现象可能原因排查方式解决方案
ImportError: No module named ‘torch’PyTorch未安装或不在当前Python环境。1. 运行conda list | grep torch查看。
2. 检查终端是否在pytorch_cpu环境。
1. 激活正确的conda环境。
2. 重新执行官网的conda安装命令。
安装过程极慢或卡住Conda默认源在国外,网络连接不畅。观察下载进度是否长时间为0。1.使用国内镜像源(推荐)。先运行:conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/,然后再次安装。
2. 耐心等待,或切换网络环境。
RuntimeError: Couldn‘t load custom C++ opsPyTorch版本与Python版本或其他库不兼容。检查Python版本是否为3.8-3.11。1. 确保使用conda创建指定版本Python的环境。
2. 在PyTorch官网安装器上重新选择完全匹配的配置生成命令。
运行代码时内存占用过高或程序崩溃批处理大小(batch_size)设置过大,或模型复杂,超出CPU内存。观察任务管理器/系统监视器中的内存使用情况。1.减小batch_size(如从64改为32或16)。
2. 简化模型结构。
3. 使用torch.utils.data.DataLoadernum_workers参数(可设为0或2)有时也能缓解。
训练速度非常慢CPU计算能力有限,这是正常现象。对比GPU训练时间(可能相差数十倍)。1. 接受这是学习阶段的常态。
2. 减少训练轮次(epochs)或使用更小的数据集做实验。
3. 确保没有其他大型程序占用CPU。
conda命令未找到Anaconda未正确安装或未添加到系统PATH。在终端直接输入conda1. Windows:安装时勾选“Add Anaconda to my PATH environment variable”,或手动添加安装目录到PATH。
2. macOS/Linux:检查安装脚本是否修改了~/.bashrc~/.zshrc,并执行source ~/.bashrc

8. 最佳实践与工程建议

成功运行第一个程序后,为了更高效地在CPU上进行深度学习开发,请遵循以下建议:

  1. 环境隔离是金科玉律:永远为不同的项目创建独立的conda虚拟环境。就像本文的pytorch_cpu环境。这能彻底避免包版本冲突。使用conda env export > environment.yaml可以导出环境配置,方便在其他机器上复现。
  2. 管理你的数据:示例中数据下载到了./data。在实际项目中,建议建立清晰的目录结构,例如:
    project/ ├── data/ # 存放原始和预处理数据 ├── src/ # 源代码 ├── models/ # 保存训练好的模型 ├── notebooks/ # Jupyter notebook └── README.md
  3. 从小开始,逐步迭代:在CPU上,务必从小模型、小数据、少轮次开始。先确保整个数据流和训练循环能跑通(就像我们刚才做的),再逐步增加复杂度。这能极大缩短调试周期。
  4. 善用日志与检查点:在训练循环中,不仅要打印损失和准确率,还可以定期将模型状态保存下来(torch.save)。这样即使程序中断,也能从最近的状态恢复,而不是重头开始。
    # 保存模型示例 torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': loss, }, f'checkpoint_epoch_{epoch}.pth')
  5. 监控资源使用:在CPU上训练时,打开系统资源监视器,观察CPU利用率和内存占用。如果内存吃满,果断减小batch_size。这比遇到程序崩溃再排查要高效得多。
  6. 为未来GPU迁移做准备:虽然现在用CPU,但写代码时要养成“设备无关”的好习惯。可以使用以下模式,让代码能无缝运行在CPU或GPU上:
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = SimpleMLP().to(device) # 在训练时,将数据和标签也移到对应设备 data, target = data.to(device), target.to(device)
    这样,当你未来有了GPU环境,只需安装GPU版PyTorch,代码无需修改即可加速。

9. 总结与后续学习方向

至此,你已经成功在CPU上搭建了PyTorch环境,并完成了一个完整的深度学习模型训练流程。回顾一下我们克服的核心障碍:你不再需要昂贵的GPU硬件,也不再需要配置复杂的CUDA驱动,就能亲手运行和修改一个真正的神经网络。

这个过程的意义在于,它为你打开了一扇零成本入门深度学习的大门。你可以在这个稳定的CPU环境里,放心地去尝试:

  • 修改网络结构:在SimpleMLP中增加或减少层,改变神经元数量,使用不同的激活函数。
  • 尝试新的数据集:PyTorch的torchvision提供了CIFAR-10、Fashion-MNIST等更多数据集。
  • 调整超参数:改变学习率(lr)、优化器(试试optim.Adam)、批大小(batch_size),观察它们对训练结果的影响。
  • 学习可视化:引入tensorboardmatplotlib来绘制损失和准确率曲线,直观理解训练过程。

当你对PyTorch的基础API和训练流程越来越熟悉后,可以自然地过渡到更高级的主题,例如卷积神经网络(CNN)、循环神经网络(RNN)、迁移学习,以及如何将你的模型部署为一个简单的Web服务。

记住,深度学习的核心是思想和实验,算力是放大器而非前提。现在,你的实验环境已经就绪。建议收藏本文,在遇到环境问题时随时回顾。接下来,就去尽情探索PyTorch和深度学习的广阔世界吧。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询