在 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 和 MPSresults = {}for device_name, device in devices.items():if device is None:print(f"\nSkipping {device_name} as it is not available.")continueprint(f"\nTraining on {device_name}...")training_time = train_model(device, num_epochs)results[device_name] = training_timeprint(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的加速还是有一定差距

相关文章:
在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比
1. 安装torch 在官网上可以查看安装教程,Start Locally | PyTorch 作者安装了目前最新的torch版本2.5.1,需要提前安装python3.9及以上版本,作者python版本是python3.11最新版本 使用conda安装torch,在终端进入要安装的环境&…...
生成式人工智能在生产型企业中的应用
生成式人工智能(Generative AI)是指使用人工智能来创建新内容,如文本、图像、音乐、音频和视频等。生成式人工智能在生产型企业中的应用涵盖了内容创作与自动化、数据分析与决策支持、生产流程优化、产品设计与开发、客户服务与沟通、员工培训…...
Linux逻辑卷管理
目录 实验要求 实验操作 1、 为Linux新添加一块SCSI磁盘/dev/sdc,容量为1024MB。在该磁盘上创建三个分区sdc1、sdc2、sdc3,大小为128MB,标识为Linux native分区。 2、 在三个分区上创建物理卷;将三个物理卷加入VolGroup00卷组&…...
机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效
机器人加装电主轴进行铣削、钻孔、打磨、去毛刺等作业,展现出显著的优势,并能实现高效加工。 1. 高精度与高效率 电主轴特点:高速电主轴德国SycoTec的产品,转速可达100000rpm,功率范围广,精度≤1μm&#…...
opencv sdk for java中提示无stiching模块接口的问题
1、问题介绍 安卓项目中有新的需求,在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时,出现大量报错,如下截图所示 实际上,其他opencv的接口函数 例如 core dnn等都能正常使用,直觉上初步怀疑 ope…...
今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福
1、朋友相伴,友谊真诚永不变!彼此扶持绿树荫,共度快乐雨后天!一同分享的表情,愿我们友情长存,一生相伴永相连! 2、人生几十年,苦累伴酸甜,风华不再茂,雄心非当…...
五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO
在操作系统中处理输入/输出(IO)操作的过程中,存在多种方式,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。这些方式在操作系统实现和应用程序编写时有着不同的适用场景和性能特征。接下来,我将逐一介绍它们…...
Vscode GStreamer插件开发环境配置
概述 本教程使用vscode和Docker搭建Gstreamer2.24的开发环境,可以用于开发调试Gstreamer程序或者自定义插件开发。 1. vscode依赖插件 C/C Extension Pack(ms-vscode.cpptools-extension-pack):该插件包包含一组用于 Visual St…...
flask基础
from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时,Flask 会调用对应的视图函数来处理请求 def index():return …...
Java日志框架:log4j、log4j2、logback
文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…...
鸿蒙-expandSafeArea使用
应用未使用setWindowLayoutFullScreen()接口设置窗口全屏布局时,默认使能组件安全区布局。可以使用expandSafeArea属性扩展安全区域属性进行调整 扩展安全区域属性原理 布局阶段按照安全区范围大小进行UI元素布局。布局完成后查看设置了expandSafeArea的组件边界&…...
【es6复习笔记】Spread 扩展运算符(8)
在现代前端开发中,JavaScript 的扩展运算符(Spread Operator)是一个非常有用的特性,它允许你将数组或对象展开,以便在函数调用、数组拼接、对象复制等场景中更方便地处理数据。扩展运算符(spread࿰…...
第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目
#知识点 1、信息收集-Web应用-开发框架-识别安全 2、信息收集-Web应用-安全组件-特征分析 一、ICO图标: 1、某个应用系统的标示,如若依系统有自己特点的图标;一旦该系统出问题,使用该系统的网站都会受到影响; 2、某个公…...
后端-redis
Redis RedisString类型String类型的常用命令 Hash类型Hash类型的常用命令 List类型List类型的常用命令 Set类型Set类型的常用命令 SortedSet类型SortedSet类型的常用命令 Redis序列化缓存更新策略缓存穿透缓存雪崩缓存击穿 Redis Redis是一个key-value的数据库,key…...
开发场景中Java 集合的最佳选择
在 Java 开发中,集合类是处理数据的核心工具。合理选择集合,不仅可以提高代码效率,还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点,帮助你在实际开发中找到最佳解决方案。 一、List:有序存…...
golangci-lint安装与Goland集成
golangci-lint安装与Goland集成 1.golangci-lint概述2.golangci-lint安装3.Goland 中集成 golangci-lint4.golangci-lint 的使用5.排除代码检查 1.golangci-lint概述 golangci-lint是用于go语言的代码静态检查工具集 官网地址:golangci-lint 特性: 快…...
金仓数据库安装-Kingbase v9-centos
在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…...
条款6:auto推导若非己愿,使用显式类型初始化惯用法
一、代理类 所谓的代理类就是以模仿和增强一些类型的行为为目的存在的类 class MyArray { public:class MyArraySize{public:MyArraySize(int size) : theSize(size) {}int size() const { return theSize; }operator int() const { return theSize; }private:int theSize;};…...
蓝桥杯物联网开发板硬件组成
第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产,该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计,芯片提供了25…...
视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
随着5G技术的广泛应用,各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据,并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而,随着数字化建设和生产经营管理活动的长期开展࿰…...
Cesium实战:手把手教你用四元数搞定飞行模型朝向,告别极点旋转Bug
Cesium实战:四元数驱动飞行模型朝向的终极解决方案 想象一下,你正在开发一个全球飞行模拟系统,当飞机接近北极点时,模型突然像失控的陀螺一样疯狂旋转——这不是特效,而是许多Cesium开发者遇到的经典痛点。传统欧拉角在…...
龙芯k - 走马观碑组MPU驱动移植霸
先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)…...
AI FUTURE北京亦庄AI未来大会在京启幕
4月8日,AI FUTURE北京亦庄AI未来大会在北京经济技术开发区(简称“北京经开区”,又称“北京亦庄”)北京智慧电竞赛事中心正式启幕。这场为期两天的人工智能盛会,以“让每个人看AI的另一面”为主题,集高端论坛…...
避坑指南:当你的bed文件在hg38分析中报错时,可能缺了这步liftover预处理
基因组坐标转换实战:当hg38遇到旧版bed文件的高阶解决方案 临床数据分析师小张最近遇到了一个棘手问题——团队传承下来的hg19版bed文件在新项目中使用hg38参考基因组时频繁报错。GATK流程抛出"Invalid interval"警告,IGV可视化时靶向区域完全…...
DMA技术解析:提升嵌入式系统性能的关键
1. DMA技术概述:解放CPU的搬运工 DMA(Direct Memory Access)直接存储器访问技术,是现代嵌入式系统中提升性能的关键设计。我第一次在STM32项目中使用DMA传输时,实测发现ADC采样率从500kHz提升到2.1MHz,CPU占…...
TVS二极管
TVS引起的两起事故案例1:整机在打ESD静电的时候,出现通信异常。通过排查,最后定位在如下图左边的通信接口处,右边是咱们的主芯片。之所以产品会被打挂,主要原因是TVS布局未靠近接口处放置,TVS放置位置距离接…...
新质生产力水平测算(版本3,2010-2023年)
1、搜数据皮皮侠,编号14172、使用兑换码0447220m6ZHB006826sU14Vv数据来源《中国统计年鉴》、《中国能源统计年鉴》、《中国工业统计年鉴》、《中国环境统计年鉴》、能源统计局、省级统计年鉴。时间跨度2010-2023年区域跨度全国31个省市自治区(不含港澳台…...
运维进阶!Zabbix 高可用集群部署实战指南,从零搭建企业级监控系统
1. 为什么需要Zabbix高可用集群? 在企业生产环境中,监控系统的稳定性直接关系到整个IT基础设施的可观测性。想象一下,当你的监控系统突然宕机,所有服务器、网络设备、应用程序的运行状态瞬间"失明",这种场景…...
3步释放20GB空间:DriverStore Explorer的系统驱动优化方案
3步释放20GB空间:DriverStore Explorer的系统驱动优化方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer(简称RAPR)是一款轻量…...
光伏逆变器测试避坑:派能协议下电流值5倍偏差的修复实录
光伏逆变器测试实战:派能协议电流值异常分析与精准修复指南 光伏系统集成测试中,协议解析环节往往成为数据异常的"重灾区"。去年某分布式光伏项目中,我们遭遇了逆变器显示电流值异常放大5倍的典型案例——BMS实际发送95A电流数据&a…...
