本文介绍如何在 Mac 上安装 PyTorch,并利用 Apple 芯片的 Metal 框架进行加速。
1. 安装 PyTorch #
- 参考:
PyTorch 官方安装地址
- 选择合适的环境和相应的配置,然后复制命令去安装
- 或者直接使用以下命令下载默认的版本:
pip3 install torch torchvision torchaudio
2. Apple 芯片加速 #
Apple 的芯片利用其 Metal 框架提供了对 GPU 加速的支持。PyTorch 在 Mac 上可以利用 Metal Performance Shaders (MPS) 后端进行加速,从而显著提高深度学习模型的训练和推理速度。
2.1 测试配置 #
要确认你的环境是否正确配置了MPS后端,可以运行以下代码:
import torch
print(torch.backends.mps.is_available()) # 检查 MPS 是否可用
print(torch.backends.mps.is_built()) # 检查 MPS 是否被编译
如果都返回 True
的话,则代表配置成功。
2.2 使用 MPS 加速 #
在代码中启用MPS后端,可以通过以下方式设置设备:
import torch
# 检查MPS是否可用
if torch.backends.mps.is_available():
device = torch.device("mps")
else:
device = torch.device("cpu")
# 示例模型和数据
model = torch.nn.Linear(10, 1)
model.to(device)
data = torch.randn(5, 10)
data = data.to(device)
output = model(data)
print(output)
2.3 Apple 芯片的优势 #
Apple 的 M 系列芯片采用了以下几种技术优势,使得它们在深度学习任务中表现出色:
- 统一内存架构 (UMA):
- Apple 的 M 系列芯片能使用的显存大小就是电脑的内存大小。
- CPU 和 GPU 共享同一块内存,从而减少了数据在 CPU 和 GPU 之间传输的时间和开销。这对于深度学习任务尤其重要,因为这些任务通常需要频繁地在 CPU 和 GPU 之间传输大量数据。
- 高效的 Metal 框架:
- Metal 框架提供了一种高效的 GPU 计算 API,称为 Metal Performance Shaders (MPS)。
- MPS 专门为高性能计算设计,特别是图形和计算任务。PyTorch 从 1.12 版本开始,增加了对 MPS 后端的支持,使得在 Mac 上的 GPU 加速成为可能。
- 强大的 GPU 性能:
- Apple 芯片内置了高性能的 GPU。例如,M1 系列有 7 或 8 个 GPU 核心,M1 Pro 和 M1 Max 则有更多的 GPU 核心。这些高性能的 GPU 对深度学习任务中的大规模并行计算非常有效。
2.4 实际案例 #
在实际应用中,你可以将深度学习模型和数据加载到MPS设备上,以实现更快速的训练和推理。以下是一个简单的示例,演示了如何在MPS上训练一个线性回归模型:
import torch
import torch.nn as nn
import torch.optim as optim
# 创建数据
x = torch.randn(100, 1)
y = 3 * x + 1 + 0.1 * torch.randn(100, 1)
# 定义模型
model = nn.Linear(1, 1)
if torch.backends.mps.is_available():
device = torch.device("mps")
else:
device = torch.device("cpu")
model.to(device)
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(100):
model.train()
optimizer.zero_grad()
# 前向传播
outputs = model(x.to(device))
loss = criterion(outputs, y.to(device))
# 反向传播和优化
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
print('训练完成')