当前位置: 首页 > article >正文

在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比

1. 安装torch

在官网上可以查看安装教程,Start Locally | PyTorch

作者安装了目前最新的torch版本2.5.1,需要提前安装python3.9及以上版本,作者python版本是python3.11最新版本 

使用conda安装torch,在终端进入要安装的环境,执行如下命令即可,值得一提的是,安装torch的前提条件是需要事先安装对应版本的python,以及annoconda

conda install pytorch torchvision -c pytorch

执行完如上命令后就会出现如下画面,需要等待几分钟,直到安装完毕

2. 安装MPS

使用conda安装mps

conda install torch torchvision torchaudio

3 安装是否成功测试

import torch
# 查看 torch安装是否成功 并查看其版本
print(torch.__version__)
# 查看 mps是否安装成功 是否可用
print(torch.backends.mps.is_available())
# 检查 GPU 是否可用
print(torch.cuda.is_available())  # 对于 MPS,返回 False 是正常的
print(torch.backends.mps.is_available())  # 应该返回 True
# 获取 MPS 设备
mps_device = torch.device("mps")
print(mps_device)  # 输出 "mps"

执行如上代码,能够成功打印出torch版本,证明第一章节的torch安装成功,如果能打印出True证明MPS可用,至于其中的一个False是cuda是否可用,因为作者是Mac电脑,没有安装显卡所以并无法安装cuda加速,固然为false

4 加速对比

总的来说,模型越复杂,其MPS加速越明显,如果模型太简单,只需要几秒钟就能跑完的话,MPS加速反而不如CPU,因为MPS要有一些准备工作,把数据放入图显核心里去,如果算法太简单或者数据量太少,结果运行加速节约的时间还不如数据准备的时间长,看起来就会觉得MPS反而需要更多时间来运行。

如下是作者的测试代码

import torch
import torch.nn as nn
import torch.optim as optim
import time

# 设置训练参数
input_size = 4096  # 输入特征数
hidden_size = 1024  # 隐藏层神经元数
output_size = 10  # 输出类别数(例如 10 类)
num_epochs = 50  # 训练轮数
batch_size = 64  # 批量大小
learning_rate = 0.01  # 学习率

# 定义一个简单的全连接神经网络
class SimpleNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 函数:训练模型并记录训练时间
def train_model(device, num_epochs):
    # 创建数据集
    num_samples = 100000  # 数据集样本数量
    x_train = torch.randn(num_samples, input_size).to(device)
    y_train = torch.randint(0, output_size, (num_samples,)).to(device)

    # 模型、损失函数和优化器
    model = SimpleNN(input_size, hidden_size, output_size).to(device)
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=learning_rate)

    # 开始计时
    start_time = time.time()

    # 训练循环
    for epoch in range(num_epochs):
        for i in range(0, num_samples, batch_size):
            # 获取当前批量数据
            inputs = x_train[i:i+batch_size]
            labels = y_train[i:i+batch_size]

            # 前向传播
            outputs = model(inputs)
            loss = criterion(outputs, labels)

            # 反向传播和优化
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

    # 结束计时
    end_time = time.time()

    # 返回训练时间
    return end_time - start_time

# 主程序
if __name__ == "__main__":
    # 设备列表
    devices = {
        "CPU": torch.device("cpu"),
        "MPS": torch.device("mps") if torch.backends.mps.is_available() else None,
    }

    # 分别测试 CPU 和 MPS
    results = {}
    for device_name, device in devices.items():
        if device is None:
            print(f"\nSkipping {device_name} as it is not available.")
            continue
        print(f"\nTraining on {device_name}...")
        training_time = train_model(device, num_epochs)
        results[device_name] = training_time
        print(f"Training time on {device_name}: {training_time:.2f} seconds")

    # 打印对比结果
    print("\n--- Training Time Comparison ---")
    for device_name, time_taken in results.items():
        print(f"{device_name}: {time_taken:.2f} seconds")

本人运行的机器是Mac Mini M2(8+10)16G+1T ,

3.1 CPU和GPU占用

在使用CPU运行时, 明显看到8核心的CPU,程序几乎占用了4核心一半,GPU没有使用

 在使用MPS运行时,CPU占比下降到较低水平,开始启用GPU运行,10核心的图显也仅仅使用了1颗,感觉加速不是特别明显

3.2 温度对比 

使用CPU运行时,常年保持40度以下的CPU温度也飙升到了65度左右,及时如此也仅是window电脑静默状态的温度了 

 使用MPS运行时,温度稍有回落,在50度左右

3.3 运行时间

如图所示,MPS加速仅仅比CPU花费时间减少一半左右,说实话不是特别满意,和cuda的加速还是有一定差距


http://www.kler.cn/a/452378.html

相关文章:

  • 基于云计算的资源管理系统
  • VS2022 中的 /MT /MTd /MD /MDd 选项
  • 概率论 期末 笔记
  • 如何在centos系统上挂载U盘
  • Linux -- 线程的优点、pthread 线程库
  • CPU算法分析LiteAIServer裸土检测算法如何应用在农田科学管理中?
  • 使用Python探索量子机器学习
  • ByConity BSP 解锁数据仓库新未来
  • Android DRM 技术详解与应用实践
  • HarmonyOS NEXT 实战之元服务:静态案例效果--- 手机一键加速、手机垃圾清理
  • 中阳智能:量化交易助力科技与金融融合
  • 基于LSTM长短期记忆神经网络的多分类预测【MATLAB】
  • 跟我学c++中级篇——C++中的缓存利用
  • 达梦数据库-数据共享集群部署
  • vue3导入excel并解析excel数据渲染到表格中,纯前端实现。
  • CSS 居中技术完全指南:从基础到高级应用
  • SpeedTree For UE5学习笔记
  • 分布式Python计算服务MaxFrame使用心得
  • <代码随想录> 算法训练营-2024.12.25
  • Linux零基础速成篇一(理论+实操)
  • 强力巨彩租赁屏技术更新,适用多种户外应用场景
  • xtu oj 1614 数字(加强版)
  • 【Super Tilemap Editor使用详解】(十一):画笔(Brushes)
  • SSE 流式场景应用 及 方案总结
  • 教育行业 UI 设计基础篇:简洁直观的风格打造
  • 【UE5.3.2】安装metahuman插件