Metal优化M系列Mac芯片机器学习(Tensorflow)
Primo Pan

Intro

早就听说M卡自带的GPU跑机器学习模型也还是可以的,但是一直没试,今天折腾了一下;发现时至2023年,Tensorflow和Pytorch都已经通过安装Metal插件来使用M系列芯片的GPU加强运算速度了。因为最近做的项目还是用的TF,先折腾了一下TF端的优化。效果还是挺感人的。

Preparation

因为针对M卡优化的那个环境用的是MiniForge,平常用的Anaconda,得先把conda环境切到MiniForge。

1
$ conda env list

先看一下自己conda的环境,如果现在是Anaconda,需要切到MiniForge,上面那段我本地打出来是这样

1
2
3
4
5
# conda environments:
#
/Users/primopan/anaconda3
base * /Users/primopan/miniforge3
tfm1 /Users/primopan/miniforge3/envs/tfm1

如果想swift一下Anaconda和MiniForge,假设现在咱们在Anaconda环境下,你需要复制一下上面MiniForge的地址,然后

1
2
$ /Users/primopan/miniforge3/conda init zsh
$ /Users/primopan/miniforge3/conda init bash

Terminal会显示no change,但是没关系,关掉终端再开一下,检查环境,就已经切换过来了。然后我们开一下环境。

1
2
$ conda create --name tfm1 python==3.9
$ conda activate tfm1

接着安装预制环境和tf的macos和metal插件

1
2
3
$ conda install -c apple tensorflow-deps
$ pip install tensorflow-macos
$ pip install tensorflow-metal

理论上装完了就可以了。我们terminal 开个Python 试一试能不能调用GPU

1
2
3
4
5
>>> import tensorflow as tf
>>> tf.__version__
'2.12.0'
>>> tf.config.list_physical_devices()
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

可以看到输出的那一坨设备里面有GPU的话就说明可以调用GPU了,废话不多说,开一个最简单的图像分类训练模型试一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import tensorflow as tf

cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.ResNet50(
include_top=True,
weights=None,
input_shape=(32, 32, 3),
classes=100,)

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=64)

跑了5个epoch,每个epoch差不多1分钟左右的样子。我们deactivate一下当前的环境,用只有CPU的环境跑,一个epoch差不多要380s,是开GPU的六倍多。下午刚去入了一个3060Ti,明天看看M1和CUDA环境下的3000块钱左右的卡PK能获得什么成绩吧。