1. 项目缘起:为什么要在集成显卡上折腾PyTorch?
你可能觉得这有点反直觉。PyTorch,这个深度学习框架,不是和NVIDIA的独立显卡(GPU)深度绑定的吗?用集成显卡跑PyTorch,性能能看吗?这确实是个好问题。我最初接触这个需求,是帮一个刚入门机器学习的学生调试环境。他的笔记本只有一块Intel的集成显卡,预算有限,暂时不打算升级硬件。他的目标很明确:只是想先跑通《动手学深度学习》里的基础代码,理解一下张量操作、自动求导和简单的神经网络前向传播,而不是立刻训练一个ResNet去刷榜。
这恰恰点出了在集成显卡上安装PyTorch的核心价值:学习与验证。对于绝大多数深度学习初学者、算法概念的验证者,或者仅仅想用PyTorch做一些轻量级张量计算(比如替代NumPy进行更复杂的矩阵运算)的用户来说,集成显卡环境是完全足够的。PyTorch的CPU版本功能完整,包含了其所有核心特性——动态计算图、自动微分、丰富的神经网络层。你可以在CPU上完成模型的定义、损失计算和基于梯度的优化(虽然速度慢)。这为你扫清了硬件门槛,让你能专注于理解框架和算法本身,而不是在配置CUDA环境的各种版本冲突、驱动问题上耗尽热情。
另一个容易被忽略的场景是部署与轻量级推理。在一些边缘设备或对功耗有严格限制的服务器上,可能只有集成显卡。如果你需要部署一个已经训练好的、模型不大的网络进行推理,PyTorch的CPU版本同样可以稳定工作。这时,一个纯净、正确的PyTorch CPU环境就是必需品。
所以,别再认为“集成显卡=不能玩PyTorch”。恰恰相反,从CPU版本入门,是理解PyTorch底层运作机制最“干净”的路径。等你真正理解了数据如何在CPU内存中流动、计算图如何构建,未来切换到GPU环境时,你才会更清楚性能瓶颈可能出现在哪里,而不是仅仅把GPU当作一个神秘的黑盒加速器。
2. 核心概念澄清:集成显卡、CPU版本与计算后端
在开始动手之前,我们必须把几个关键概念理清楚,这能避免后续很多困惑。
2.1 集成显卡 vs. 独立显卡在PyTorch中的角色
对于PyTorch而言,所谓的“GPU加速”特指利用NVIDIA的CUDA平台进行计算。这需要两个硬性条件:一块NVIDIA的独立显卡(如RTX系列、GTX系列等),以及正确安装的NVIDIA显卡驱动和CUDA Toolkit。
集成显卡(无论是Intel UHD Graphics, Iris Xe,还是AMD Radeon Vega Graphics)在当前的PyTorch官方生态中,无法被直接用于加速张量计算。PyTorch没有为Intel或AMD的集成显卡提供类似CUDA的原生计算后端支持。因此,当我们说“在集成显卡电脑上安装PyTorch”,本质上是指安装PyTorch的CPU版本。所有的计算都将由电脑的中央处理器(CPU)来完成,集成显卡只负责日常的图形显示,不参与PyTorch的任何数学运算。
2.2 PyTorch CPU版本:功能完整的“体验版”
PyTorch的CPU版本并非功能阉割版。它包含了完整的PyTorch框架、TorchVision(计算机视觉库)、TorchAudio(音频处理库)等所有核心组件。你用它写的代码,和GPU版本在API层面是完全一致的。唯一的区别在于,当你创建张量时,默认设备是cpu,而不是cuda。例如:
import torch # 在CPU版本的PyTorch中,这行代码会创建一个CPU张量 x = torch.tensor([1.0, 2.0, 3.0]) print(x.device) # 输出:cpu # 尝试转移到GPU会报错(因为没有GPU) # x = x.cuda() # 这行会抛出 RuntimeError这意味着,所有基于CPU张量的模型定义、训练循环代码都可以无缝运行。只是当数据量或模型复杂度增大时,计算时间会呈指数级增长。但对于学习和小规模验证,这完全不是问题。
2.3 关于“A卡安装PyTorch”与ROCm
在热搜词里看到了“a卡安装pytorch”,这里需要特别说明。对于AMD的独立显卡(如RX系列),PyTorch通过ROCm平台提供了实验性支持。但请注意:
- ROCm主要面向AMD独立显卡,对集成显卡的支持非常有限甚至没有。
- 其安装配置过程比NVIDIA CUDA更为复杂,且不同操作系统、显卡型号的兼容性差异很大,并不适合初学者。
- 对于集成显卡用户(无论是Intel还是AMD),最直接、最稳定的方案依然是安装CPU版本。
因此,本文的解决方案将完全聚焦于为集成显卡环境安装纯净、稳定的PyTorch CPU版本,这是经过验证的最优路径。
3. 环境搭建实战:Anaconda的降维打击
为什么强烈推荐使用Anaconda(或更轻量的Miniconda)?因为在Python包管理,特别是科学计算包的依赖管理上,Conda环境是避免“依赖地狱”的终极武器。PyTorch本身依赖项众多(如NumPy、MKL数学库等),通过Conda安装,可以一次性解决所有系统级依赖,保证环境隔离和纯净。
3.1 第一步:安装Miniconda(轻量之选)
如果你磁盘空间紧张,或者喜欢更干净的环境,我推荐Miniconda。它只包含Conda和Python,其他包按需安装。
- 访问官网:打开 Miniconda官网 ,根据你的操作系统(Windows/macOS/Linux)下载对应的Python 3.9或3.10版本的安装器。对于深度学习,Python 3.7-3.10都是常见支持版本。
- 安装过程:
- Windows:运行
.exe安装程序。关键步骤有两个:一是在“Advanced Options”中,务必勾选“Add Miniconda3 to my PATH environment variable”(这能让你在任意终端使用conda命令);二是选择“Just Me”即可。 - macOS/Linux:打开终端,运行下载的
.sh脚本,按照提示操作即可。通常一路回车,在最后询问“Do you wish to update your shell profile to initialize conda?”时,输入yes。
- Windows:运行
安装完成后,打开一个新的终端(Windows用CMD或PowerShell,macOS/Linux用Terminal),输入conda --version,如果显示版本号,则说明安装成功。
3.2 第二步:创建并激活专属的PyTorch环境
永远不要在base环境里直接安装项目包。为每个项目创建独立环境是专业开发者的基本素养。
# 创建一个名为`pytorch_cpu`的新环境,并指定Python版本为3.9 conda create -n pytorch_cpu python=3.9 # 激活这个环境 # Windows: conda activate pytorch_cpu # macOS/Linux: # conda activate pytorch_cpu (命令相同)激活后,你的命令行提示符前面应该会显示(pytorch_cpu),表示你已经在这个独立的环境中了。接下来所有操作都在这个环境下进行。
3.3 第三步:安装PyTorch CPU版本(核心步骤)
这是最关键的一步。不要去PyTorch官网直接运行那个默认的conda install命令,因为它通常会包含cudatoolkit,而我们不需要。
正确做法是,安装不包含CUDA的PyTorch包。打开激活了pytorch_cpu环境的终端,执行以下命令:
conda install pytorch torchvision torchaudio cpuonly -c pytorch让我们拆解这个命令:
pytorch: 主框架。torchvision: 提供图像数据集、模型架构和变换(Transforms),做CV必备。torchaudio: 音频处理库,按需安装。cpuonly:这个包是关键。它是一个元包(meta-package),它的存在会告诉Conda系统:“我这个环境只需要CPU版本的PyTorch”,从而自动选择不依赖CUDA的PyTorch构建版本。-c pytorch: 指定从PyTorch官方的Conda频道下载,保证版本最新、最稳定。
注意:网上有些教程会教你用
pip install torch torchvision torchaudio,并在后面加--index-url指定源。对于CPU版本,pip安装也是可行的。但Conda安装的优势在于其能更好地管理一些底层C++依赖(如MKL)。如果你遇到pip安装后某些数学运算异常慢的问题,换用Conda安装通常能解决。作为初学者,我强烈建议先用Conda方案,这是最稳妥的。
安装过程会解析依赖并列出将要安装的包,输入y确认即可。安装完成后,千万不要急着关掉终端。
3.4 第四步:验证安装与第一个张量
让我们写几行代码来验证一切是否正常。在当前的(pytorch_cpu)环境下,启动Python解释器:
python然后,在Python交互界面中,逐行输入以下代码:
import torch print(torch.__version__) # 打印PyTorch版本,例如 2.1.0 print(torch.cuda.is_available()) # 关键检查!对于集成显卡/CPU版本,这里必须返回 False x = torch.randn(3, 3) # 创建一个3x3的随机张量 print(x) print(x.device) # 输出张量所在的设备,应该是 cpu y = x + x # 进行一次简单的张量运算 print(y)如果torch.cuda.is_available()返回False,而其他操作都能正常执行,那么恭喜你,一个纯净的PyTorch CPU环境已经配置成功!这正是我们想要的结果。如果这里返回了True,反而说明你可能不小心安装了GPU版本,需要检查之前的安装命令。
4. 集成开发环境(IDE)的配置:以PyCharm为例
在终端里写代码不是长久之计。我们需要一个强大的IDE。PyCharm是Python开发的首选之一,它与Conda环境的集成非常顺畅。
4.1 创建新项目并关联Conda环境
- 打开PyCharm,选择“New Project”。
- 在“Location”选择你的项目路径。
- 最关键的一步:在“Python Interpreter”设置处,点击下拉框,选择“Add Interpreter” -> “Add Local Interpreter”。
- 在弹出的窗口中,选择左侧的“Conda Environment”。在右侧,选择“Use existing environment”,然后通过路径浏览器,找到你刚才创建的
pytorch_cpu环境中的Python解释器。- 通常路径像这样:
- Windows:
C:\Users\<你的用户名>\Miniconda3\envs\pytorch_cpu\python.exe - macOS/Linux:
/Users/<你的用户名>/miniconda3/envs/pytorch_cpu/bin/python
- Windows:
- 通常路径像这样:
- 点击“OK”,PyCharm会加载这个解释器。创建项目后,你可以在PyCharm右下角看到当前使用的解释器名称(
pytorch_cpu)。
4.2 在PyCharm中验证并编写第一个脚本
在项目中新建一个Python文件,例如test_pytorch.py,将刚才的验证代码粘贴进去,然后右键点击运行。你会在PyCharm的“Run”窗口看到输出,同样应该显示CUDA不可用,且张量计算正常。
现在,你可以愉快地在PyCharm中编写和调试你的PyTorch学习代码了。所有通过PyCharm运行的代码,都会自动使用我们配置好的pytorch_cpu环境。
5. 常见“坑点”排查与解决方案
即便按照上述步骤,你可能还是会遇到一些问题。这里我总结几个高频“坑点”。
5.1 坑点一:安装命令输错,导致安装了GPU版本
现象:验证时torch.cuda.is_available()返回True,但你明明没有独立显卡,后续运行涉及CUDA的代码可能会报错。
根因:你可能使用了官网生成的默认安装命令,例如conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia,这个命令包含了CUDA。
解决方案:
- 首先,在当前的Conda环境中彻底卸载PyTorch相关包:
conda remove pytorch torchvision torchaudio cudatoolkit - 然后,确保环境是激活的,再次运行正确的CPU版本安装命令:
conda install pytorch torchvision torchaudio cpuonly -c pytorch
5.2 坑点二:包下载速度极慢或失败
现象:conda install卡在Solving environment或下载进度几乎不动。
根因:默认的Conda源服务器在国外,网络不稳定。
解决方案:为Conda配置国内镜像源(以清华源为例,操作前先备份)。
# 添加清华源通道(一次性添加多个常用频道) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 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/ conda config --set show_channel_urls yes配置后,再次运行安装命令。注意,有时镜像源同步会有延迟,如果找不到最新版本的包,可以暂时去掉-c pytorch,优先从国内源安装。
5.3 坑点三:PyCharm找不到或无法切换Conda环境
现象:在PyCharm的Interpreter列表里,看不到pytorch_cpu环境,或者选择了却无效。
根因:PyCharm没有扫描到所有Conda环境,或者环境路径异常。
解决方案:
- 在PyCharm中,打开“File” -> “Settings” -> “Project: <你的项目名>” -> “Python Interpreter”。
- 点击齿轮图标,选择“Add”。
- 在“Conda Environment”选项卡下,选择“Conda executable”的路径(通常在你的Miniconda安装目录的
Scripts\conda.exe(Win)或bin/conda(Mac/Linux))。 - PyCharm会自动列出所有Conda环境,选择
pytorch_cpu即可。 - 如果还不行,尝试在“Existing environment”中,手动指定
pytorch_cpu环境下的python.exe文件绝对路径(见4.1节)。
5.4 坑点四:运行简单代码也报错或警告
现象:导入PyTorch成功,但运行一些操作时出现UserWarning或RuntimeError。
可能原因与解决:
- 警告关于多线程:你可能会看到类似
[WARNIING] ... OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program.的警告。这通常是因为某些库(如NumPy)链接了不同版本的OpenMP运行时。这个警告在CPU版本中很常见,绝大多数情况下可以忽略,不影响功能。如果实在想消除,可以设置环境变量KMP_DUPLICATE_LIB_OK=TRUE(在运行程序前,或在PyCharm的Run Configuration里添加)。 - 错误关于未实现的函数:极少数非常新的或冷门的函数可能在CPU后端没有完全实现。对于学习和大多数经典模型,你几乎不会遇到。如果遇到,可以尝试搜索该函数是否支持CPU,或者回退到更稳定的PyTorch版本(如LTS版本)。
6. 从CPU起步:你的第一个神经网络训练
环境搭好了,我们来点实际的。既然性能不是首要目标,我们就用一个超小的数据集和模型,来体验完整的PyTorch训练流程。这能让你验证环境,并理解核心概念。
我们将使用经典的Fashion-MNIST数据集(10类衣物图片)和一个简单的多层感知机(MLP)。
import torch import torch.nn as nn import torch.nn.functional as F from torchvision import datasets, transforms from torch.utils.data import DataLoader # 1. 准备数据 transform = transforms.Compose([ transforms.ToTensor(), # 将PIL图像转换为Tensor,并归一化到[0,1] transforms.Normalize((0.5,), (0.5,)) # 归一化到[-1, 1] ]) # 下载训练集和测试集 train_dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform) # 创建数据加载器,批次大小设小一点,适合CPU train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 2. 定义模型 class SimpleMLP(nn.Module): def __init__(self): super(SimpleMLP, self).__init__() self.flatten = nn.Flatten() # 将28x28的图片展平为784维向量 self.fc1 = nn.Linear(28*28, 128) # 全连接层1 self.fc2 = nn.Linear(128, 64) # 全连接层2 self.fc3 = nn.Linear(64, 10) # 输出层,10个类别 def forward(self, x): x = self.flatten(x) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) # 不在这里做Softmax,因为损失函数CrossEntropyLoss自带 return x model = SimpleMLP() print(model) # 3. 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 4. 训练循环(只跑1个epoch作为演示) num_epochs = 1 for epoch in range(num_epochs): running_loss = 0.0 for i, (images, labels) in enumerate(train_loader): # 前向传播 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() # 清空过往梯度 loss.backward() # 反向传播,计算梯度 optimizer.step() # 更新参数 running_loss += loss.item() if i % 100 == 99: # 每100个batch打印一次 print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {running_loss/100:.4f}') running_loss = 0.0 print('训练结束!') # 5. 简单测试(不计算准确率,只做预测演示) model.eval() # 将模型设置为评估模式(关闭Dropout等) with torch.no_grad(): # 关闭梯度计算,节省内存和计算 data, target = next(iter(test_loader)) output = model(data) _, predicted = torch.max(output.data, 1) print('测试集第一个batch的预测结果示例:', predicted[:10]) print('对应的真实标签:', target[:10])把这段代码保存为train_fashionmnist.py并在你的pytorch_cpu环境中运行。你会看到损失在下降,并且程序能正常完成前向传播、反向传播和参数更新。这个过程在CPU上可能会慢一些(一个epoch大概几分钟),但绝对是可以跑完的。这证明了你的PyTorch CPU环境不仅能用,而且能完成从数据加载到模型训练的全流程。
7. 性能调优与学习路径建议
在集成显卡(CPU)上跑PyTorch,性能天花板是显而易见的。但我们依然可以通过一些技巧,让学习体验更顺畅。
7.1 CPU环境下的性能小贴士
- 控制批次大小(Batch Size):这是最重要的参数。在CPU上,过大的批次大小不会带来并行计算优势,反而可能因为单次数据载入量过大导致内存交换(卡顿)。从32、64开始尝试,观察内存占用。使用
torch.utils.data.DataLoader时,可以设置num_workers=0(默认),在Windows下更稳定;在Linux/macOS下可以尝试num_workers=2或4,利用多进程预加载数据,但注意进程数不是越多越好。 - 利用MKL与CPU并行:通过Conda安装的PyTorch通常链接了Intel MKL数学库,它会自动利用CPU的多核进行矩阵运算。你可以通过设置环境变量
OMP_NUM_THREADS来限制使用的CPU核心数,有时避免全部核心占满能让系统响应更流畅。例如在终端运行前设置export OMP_NUM_THREADS=4(Linux/macOS)或在代码中torch.set_num_threads(4)。 - 从简单模型和小数据开始:正如我们上面的例子。先理解LeNet、MLP在Fashion-MNIST或CIFAR-10上的表现,再逐步过渡到更复杂的CNN、RNN。不要一开始就试图在CPU上训练ResNet-50,那会消磨你的耐心。
- 善用
torch.no_grad():在模型推理(验证/测试)阶段,用with torch.no_grad():包裹代码。这会禁用梯度计算和跟踪,大幅减少内存消耗并提升速度。
7.2 未来的升级路径
当你在CPU上熟练掌握了PyTorch的基本语法、数据流和训练流程后,未来升级到GPU会变得水到渠成。届时你需要做的只是:
- 确保有一块NVIDIA独立显卡。
- 根据显卡算力(如RTX 5060需要CUDA 12.x以上),去NVIDIA官网安装对应的显卡驱动和CUDA Toolkit。
- 创建一个新的Conda环境(例如
pytorch_gpu),使用PyTorch官网根据你的CUDA版本生成的安装命令(例如conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia)。 - 将你的代码中,在需要的地方把数据和模型通过
.to(‘cuda’)移动到GPU上。
你会发现,代码主体几乎不需要改动。你之前在CPU上学到的关于张量、模型定义、损失函数、优化器的所有知识,都完全适用。GPU只是让同样的计算变得更快。
所以,在集成显卡上安装和运行PyTorch,绝非权宜之计,而是一条非常务实的学习路径。它帮你绕开了最复杂的GPU环境配置难题,让你能直击框架和算法本身的核心。当你用CPU版本亲手搭建并训练出第一个能工作的神经网络时,那份成就感,和未来在GPU上跑出第一个epoch时的兴奋,并无二致。