GitHub热门项目PyTorch:在Apple Silicon M1环境下的安装与使用

云信安装大师
90
AI 质量分
4 5 月, 2025
3 分钟阅读
0 阅读

GitHub热门项目PyTorch:在Apple Silicon M1环境下的安装与使用

引言

PyTorch作为当前最热门的深度学习框架之一,在GitHub上拥有超过70k的star数。对于使用Apple Silicon M1系列芯片(M1/M2/M3)的开发者来说,如何正确安装和配置PyTorch是一个常见问题。本文将详细介绍在M1芯片Mac上的完整安装流程和使用方法。

准备工作

在开始之前,请确保你的设备满足以下条件:

  • 搭载Apple Silicon M1/M2/M3芯片的Mac电脑
  • macOS 12.3 (Monterey) 或更高版本
  • 已安装Homebrew包管理器
  • Python 3.8或更高版本(推荐使用conda管理Python环境)

📌 注意:虽然PyTorch官方提供了ARM64版本的wheel包,但某些功能可能仍在优化中。建议定期查看PyTorch官方文档获取最新信息。

第一步:安装Miniforge(推荐)

由于原生conda对M1的支持不够完善,我们推荐使用Miniforge来管理Python环境:

代码片段
# 下载Miniforge3 (适用于M1芯片)
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh"

# 运行安装脚本
bash Miniforge3-MacOSX-arm64.sh

# 按照提示完成安装后,初始化conda
source ~/miniforge3/bin/activate

🔍 原理说明:Miniforge是专为ARM架构优化的conda发行版,能更好地支持M1芯片的硬件特性。

第二步:创建并激活conda环境

代码片段
# 创建一个名为pytorch_env的新环境
conda create -n pytorch_env python=3.9

# 激活环境
conda activate pytorch_env

第三步:安装PyTorch及其依赖

对于Apple Silicon设备,PyTorch提供了专门的ARM版本:

代码片段
# 安装基础依赖
conda install -y numpy pandas matplotlib jupyterlab

# 使用pip安装PyTorch (官方推荐的M1版本)
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu

⚠️ 注意事项:
--extra-index-url参数指定了PyTorch的nightly构建仓库,这是目前官方推荐的M1安装方式
– PyTorch团队正在持续优化M1支持,未来可能会有更稳定的发布渠道

第四步:验证安装

创建一个简单的Python脚本来测试PyTorch是否正常工作:

代码片段
import torch

# 检查PyTorch版本和是否可用
print(f"PyTorch版本: {torch.__version__}")
print(f"MPS后端可用: {torch.backends.mps.is_available()}")

# 创建一个简单的张量并执行计算
x = torch.rand(5, 5, device='mps')
y = torch.rand(5, 5, device='mps')
z = x * y + x ** y

print("\n计算结果:")
print(z)

运行结果应该类似于:

代码片段
PyTorch版本: x.x.x+nightly.cpu.mps.mac.x86_64.arm64.xxxxxx
MPS后端可用: True

计算结果:
tensor([[0.1234, ...]], device='mps:0')

🔍 MPS(Metal Performance Shaders)是Apple提供的GPU加速框架,PyTorch通过它利用M1芯片的GPU进行加速计算。

PyTorch在M1上的性能优化技巧

1. 确保使用MPS后端

代码片段
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
model = YourModel().to(device)
data = data.to(device)

2. batch size调整建议

由于M1的统一内存架构(UMA),可以尝试比传统GPU更大的batch size:

代码片段
# M1上可以尝试更大的batch size以获得更好性能
batch_size = max(32, min(256, your_data_size))

3. DataLoader优化

代码片段
from torch.utils.data import DataLoader

loader = DataLoader(dataset, 
                   batch_size=batch_size,
                   num_workers=4,    # M1性能核心数量为4个
                   pin_memory=True) # UMA架构下pin_memory效果更好

Jupyter Notebook中的使用示例

以下是一个完整的MNIST分类示例:

代码片段
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
        self.fc1 = nn.Linear(1600, 128) # MPS后端需要精确计算输入维度

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), kernel_size=2))
        x = F.relu(F.max_pool2d(self.conv2(x), kernel_size=2))
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        return x

    def num_flat_features(self, x):
        size = x.size()[1:] # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

device = torch.device("mps")
model = Net().to(device)

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

train_dataset = datasets.MNIST('./data', train=True, download=True,
                              transform=transform)
train_loader = DataLoader(train_dataset,
                         batch_size=128,
                         shuffle=True,
                         num_workers=4)

optimizer = optim.SGD(model.parameters(), lr=0.01)

def train():
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output.log(), target)
        loss.backward()
        optimizer.step()

train() # MPS上训练速度明显快于CPU模式!

FAQ与常见问题解决

Q: PyTorch无法识别MPS设备怎么办?

A:

代码片段
# Step1:确认macOS版本至少为12.3+
sw_vers -productVersion 

# Step2:更新所有依赖项和系统软件包:
pip install --upgrade --force-reinstall \
    --extra-index-url https://download.pytorch.org/whl/nightly/cpu \
    torch torchvision torchaudio

# Step3:重启Python内核或终端会话再试一次    

Q: GPU利用率不高是什么原因?

A:
– Metal API的性能分析工具可以帮助诊断:

代码片段
/Applications/Xcode.app/Contents/Developer/usr/bin/metal-system-profiler <br>
   

– Xcode > Instruments > Metal System Trace可以提供详细分析

Q: TensorBoard无法正常工作怎么办?

A:

代码片段
pip install tensorboard-macosx-arm64 # ARM专用版本 

tensorboard --logdir=runs --bind_all # macOS Monterey+需要--bind_all参数 

PyTorch生态工具兼容性说明

工具名称 兼容性状态 备注
torchvision ✅完全支持 无需额外配置
torchaudio ✅完全支持 无需额外配置
TensorBoard ⚠️部分支持 需使用ARM专用版本
ONNX Runtime ⚠️部分支持 需从源码编译
FastAI ✅完全支持

PyTorch在M系列芯片上的未来展望

苹果公司正在持续优化其Metal框架对机器学习的支持。根据2024年WWDC的信息,即将发布的macOS Sonoma将带来以下改进:

  • Metal API新增更多ML专用指令集优化
  • CoreML与PyTorch的互操作性增强
  • MPS后端性能预计提升30%以上

建议关注PyTorch官方博客获取最新进展。

PyTorch与CoreML的协同工作流

对于希望将模型部署到iOS设备的开发者,可以使用以下工作流:

代码片段
import coremltools as ct 

model.eval() # PyTorch模型切换到评估模式 

example_input = torch.rand(10).to('mps') 
traced_model = torch.jit.trace(model.cpu(), example_input.cpu()) 

mlmodel = ct.convert(
    traced_model,
    inputs=[ct.TensorType(name="input", shape=(10))],
)

mlmodel.save("MyModel.mlpackage") 

这个转换后的模型可以直接集成到Xcode项目中。


通过本文的介绍,你应该已经掌握了在Apple Silicon Mac上安装和使用PyTorch的全部流程。随着苹果生态对机器学习支持的不断加强,相信未来会有更多令人兴奋的功能推出!

原创 高质量