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中进行配置。
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监视窗口如下:
结果如下:
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使用率如图所示:
左边较低是使用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,相信能够带来更好的体验。
附上一个奇怪的报错,但并未影响最终结果:
本次体验到此结束,感谢阅读!