2022 年5月,PyTorch宣布支持M1 Pro的GPU加速,这一消息对于我的M1 Pro Macbook来说是令人激动的。下面,就使用conda安装支持最新Metal加速的PyTorch!

我的电脑相关配置如下:

  • 32GB 统一内存
  • Apple M1 Pro (10 核中央处理器、14 核图形处理器和 16 核神经网络引擎)

1 安装

如图所示,是官方建议的方式:

官方命令

当然,也完全可以使用下面的方式。Python版本大于等于3.7即可。

$ conda create -n torch-nightly python=3.8 

$ conda activate torch-nightly

$ pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu

之后我使用了如下的开源项目:

https://github.com/rasbt/machine-learning-notes/tree/main/benchmark/pytorch-m1-gpu

2 配置

下面配置新的解释器,在PyCharm中进行配置。

Python中配置新解释器

3 LeNet5

3.1 单Epoch

3.1.1 CPU

Epoch: 001/001 | Batch 0000/0421 | Loss: 2.3098 Epoch: 001/001 | Batch 0100/0421 | Loss: 0.2646 Epoch: 001/001 | Batch 0200/0421 | Loss: 0.1437 Epoch: 001/001 | Batch 0300/0421 | Loss: 0.1009 Epoch: 001/001 | Batch 0400/0421 | Loss: 0.0732 Time / epoch without evaluation: 0.18 min Epoch: 001/001 | Train: 97.32% | Validation: 97.77% | Best Validation (Ep. 001): 97.77% Time elapsed: 0.25 min Total Training Time: 0.25 min Test accuracy 97.41% Total Time: 0.27 min

3.1.2 Metal

Epoch: 001/001 | Batch 0000/0421 | Loss: 2.3098 Epoch: 001/001 | Batch 0100/0421 | Loss: 0.2646 Epoch: 001/001 | Batch 0200/0421 | Loss: 0.1437 Epoch: 001/001 | Batch 0300/0421 | Loss: 0.1010 Epoch: 001/001 | Batch 0400/0421 | Loss: 0.0734 Time / epoch without evaluation: 0.13 min Epoch: 001/001 | Train: 97.32% | Validation: 97.77% | Best Validation (Ep. 001): 97.77% Time elapsed: 0.18 min Total Training Time: 0.18 min Test accuracy 97.40% Total Time: 0.20 min

3.2 100 Epochs LeNet5 测试

3.2.1 CPU

在使用CPU进行训练时,CPU监视窗口如下:

CPU监视窗口

结果如下:

Time elapsed: 24.82 min Total Training Time: 24.82 min Test accuracy 98.96% Total Time: 24.84 min

3.2.2 Metal

GPU模式下,GPU使用率如图所示:

GPU可以跑满!

左边较低是使用CPU时的GPU使用率,而使用Metal后,明显看到GPU使用率非常高,基本稳定在85%~90%左右。

可以明显发现,速度提升了很多。

Time elapsed: 13.11 min Total Training Time: 13.11 min Test accuracy 99.02% Total Time: 13.13 min

4 MLP

为了节省时间,本模型仅采用30个Epoch。

4.1 CPU

Time elapsed: 2.60 min Total Training Time: 2.60 min Test accuracy 97.96% Total Time: 2.62 min

4.2 Metal

Time elapsed: 3.13 min Total Training Time: 3.13 min Test accuracy 97.94% Total Time: 3.14 min

可见,这个GPU的速度是不如CPU的。当然,这个网络本身很简单,就是几个线性层,因此GPU不会带来较多改善,甚至会起到反作用。

5 VGG16

下面上一个复杂的网络!VGG16,这是一个很庞大的网络,一般M1 Pro10核CPU单Epoch就需要将近两个小时!而Metal可以缩短接近一半的时间,下面做一下测试。

5.1 CPU

由于CPU单Epoch就需要接近两个小时,因此不自己跑CPU的此次测试了,利用博主的数据:

Time / epoch without evaluation: 110.48 min
Epoch: 001/001 | Train: 30.79% | Validation: 31.50% | Best Validation (Ep. 001): 31.50%
Time elapsed: 152.91 min
Total Training Time: 152.91 min
Test accuracy 31.56%
Total Time: 161.42 min

数据来源:https://sebastianraschka.com/blog/2022/pytorch-m1-gpu.html

5.2 Metal

Epoch: 001/001 | Train: 30.44% | Validation: 30.68% | Best Validation (Ep. 001): 30.68% Time elapsed: 52.47 min Total Training Time: 52.47 min Test accuracy 31.06% Total Time: 54.21 min

这个对比可以说很明显了!至少节省了一个半小时!

6 对比和结论

经过上面的对比,可以明显发现,对于小的模型和小的数据集来说,CPU和Metal差距不大。但是对于庞大的网络,如VGG16,那么提升极其明显,快了一倍多。

当然,与CUDA相比,还是难以望其项背。但是作为一个笔记本电脑,主要用途是搭建原型和验证能够跑通,把调试好的代码丢服务器即可。因此,从这个意义上讲,能够大幅提升工作效率。

这次的升级对于M1 Pro系列芯片来说是非常爽的,在用MacBook调深度学习代码的时候效率有所提升,加之macOS的舒适体验,Mac的整体体验更上层楼。

当然,在早期阶段,速度还不够快、还会有奇怪的报错(虽然没影响最终结果),因此还是要期待继续优化Metal加速的PyTorch,相信能够带来更好的体验。

附上一个奇怪的报错,但并未影响最终结果:

奇怪的报错

本次体验到此结束,感谢阅读!

作者 caiguu

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注