用适配M1芯片的Anaconda呢,还是继续miniforge?如何让PyTorch 在 M1 芯片上 GPU 加速

2022年5月,Anaconda已经支持Mac M1,官网有Anaconda的原生版本的下载链接,可以选择图形界面或者命令行版本。

  • 64-Bit (M1) Graphical Installer (564 MB)
  • 64-Bit (M1) Command Line Installer (565 MB)

在这里插入图片描述
我目前还用着Miniforge,也还挺好的,一直没去换。不知道大家有没有跑去装原生M1的Anaconda,可以评论区交流下心得。

反正目前支持M1的越来越多,比我刚入手Mac M1的时候面对一堆安装不适配问题好多了。

  • Anaconda支持M1的Mac
  • Pycharm社区版支持选择Apple Silicon版本
  • Pytorch支持M1版本
  • 等等

2022年5月,PyTorch官方宣布已正式支持在M1芯片版本的Mac上进行模型加速。官方对比数据显示,和CPU相比,M1上炼丹速度平均可加速7倍。

此前MacBook M1安装PyTorch只能选择CPU版本,去年PyTorch 1.12发布,正式支持苹果M1芯片GPU加速。那么MacBook M1可以安装GPU版PyTorch,至于效果如何呢,有点不好说。

加速GPU训练是使用Apple的Metal Performance Shaders(MPS)作为PyTorch的后端来实现的。MPS 后端扩展了 PyTorch 框架,提供了在 Mac 上设置和运行操作的脚本和功能,MPS 通过针对每个 Metal GPU 系列的独特特征进行微调的内核优化了计算性能。

目前Pytorch版本已经可以使用MPS加速,安装命令如下:

# MPS acceleration is available on MacOS 12.3+
conda install pytorch torchvision torchaudio -c pytorch

# MPS acceleration is available on MacOS 12.3+
pip3 install torch torchvision torchaudio

在这里插入图片描述
要用在M1上用GPU版PyTorch,你得先升级你的Anaconda不能是Interl版本,得为ARM版本;附带的Python版本不能是X86版本的,否则运行时会通过Rosetta转译,性能损失非常大。还有Python的版本不要求最新,3.11以上没有编译好的PyTorch Wheel支持。你可以检查下你的Python是Intel还是Apple,在Activity Monitor中查看:

在这里插入图片描述

0.配置

你需要:

  • 一台M1芯片的Mac设备(系统12.3+)
  • arm64的Python(3.8及以上)
  • PyTorch(1.12+)

1.安装

首先还是先创建一个新的环境,避免和老版PyTorch冲突。网官推荐的安装方式实际上是直接从GitHub上git到本地再安装。但目前conda已经可以用了,不用再多此一举。

conda create -n torch_nightly_env python=3.8
conda activate torch_nightly_env
conda install pytorch torchvision torchaudio -c pytorch

2.调用

导入方式和其它版本一样,即

# 调用测试
import torch
import torchvision

device = torch.device("mps")

x = torch.randn(128, 128, device=device)
net = torchvision.models.resnet18().to(device)

print(x.device)
print(next(net.parameters()).device)

输出:

mps:0
mps:0

3.使用GPU

与使用 CUDA 加速非常类似,只是将 “cuda” 改为 “mps” 。

之前使用GPU需要调用cuda,设置device='cuda',不过M1中调用方式不同了,改为:device='mps'
或者使用to(‘mps:0’)即可转入MPS进行计算。
如下需要在tensor里加入参数device='mps'

x = torch.ones((1024 * 12, 1024 * 12), dtype=torch.float32, device='mps')
# Pytorch GPU测试1
import torch
img = torch.randn(64, 10, 64, 64)
dev = 'mps:0'
img_dev = img.to(dev)
conv = torch.nn.Conv2d(10,10,3).to(dev)
%timeit conv(img_dev)
dev = 'cpu'
conv = torch.nn.Conv2d(10,10,3).to(dev)
%timeit conv(img)

4.测试

你可以打开Jupyter Notebook来测试下:

import torch
img = torch.randn(64, 10, 64, 64)
dev = 'mps:0'
img_dev = img.to(dev)
conv = torch.nn.Conv2d(10,10,3).to(dev)
%timeit conv(img_dev)
dev = 'cpu'
conv = torch.nn.Conv2d(10,10,3).to(dev)
%timeit conv(img)

输出是:

126 µs ± 73.1 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
10.8 ms ± 446 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

这个简单的例子看的出MPS比CPU快20倍左右。
当然可以更全面的测试,比如用Bert做一些文本分类任务,一些经典卷积神经网络如VGG16,ResNet来做图像分类,你会发现:

在MacBook M1上运用Pytorch进行深度学习开发,将device显式的指定为’mps’就可以使用加速GPU了。

通过测试来看,在mps上的速度是cpu上速度的二十多倍,这个速度已基本满足日常小模型测试和Debug的需求,只能方便学习使用,但是对于工作肯定还需服务器和其他算力支持。

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。

猜你喜欢

转载自blog.csdn.net/u012744245/article/details/129764682