Install PyTorch on Mac M1

Mac M1 的兼容性问题还是要多多完善啊……QVQ 打工人着实不容易了。
要干的事情可真真真多呀,我这么愚钝哪里学得了这么多!

现在常用的两种深度学习框架:Tensorflow 和 PyTorch

  • Tensorflow 更偏向于工业界应用
  • PyTorch 更适用于研究

两者在M1上都有兼容问题,总之能折腾出来就行。

Tensorflow 与 M1 暂时不太兼容,解决方法同学提供如下,未尝试
https://developer.apple.com/metal/tensorflow-plugin/

需要 osx 12 和 brew installed python 3.8(没测试3.9,但是应该可行

我之前都用 colab……

PyTorch

官网上给的方法不能直接成功
参考 https://betterprogramming.pub/how-to-install-pytorch-on-apple-m1-series-512b3ad9bc6

1
2
3
$ conda create --name pytorch_m1 python=3.8
$ conda activate pytorch_m1
$ conda install -c pytorch pytorch

在 Jupyter 上测试

1
$ conda install -c conda-forge jupyter jupyterlab

下面这个代码同样来源于链接,用梯度下降法拟合一个函数。

Mac 上面似乎是不支持 gpu 的……否则可以安装cuda,device 那行可以改成 device = torch.device("cuda").

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import torch
import math
dtype = torch.float
device = torch.device("cpu")

# Create random input and output data
x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)

# Randomly initialize weights
a = torch.randn((), device=device, dtype=dtype)
b = torch.randn((), device=device, dtype=dtype)
c = torch.randn((), device=device, dtype=dtype)
d = torch.randn((), device=device, dtype=dtype)

learning_rate = 1e-6
for t in range(2000):
# Forward pass: compute predicted y
y_pred = a + b * x + c * x ** 2 + d * x ** 3

# Compute and print loss
loss = (y_pred - y).pow(2).sum().item()
if t % 100 == 99:
print(t, loss)

# Backprop to compute gradients of a, b, c, d with respect to loss
grad_y_pred = 2.0 * (y_pred - y)
grad_a = grad_y_pred.sum()
grad_b = (grad_y_pred * x).sum()
grad_c = (grad_y_pred * x ** 2).sum()
grad_d = (grad_y_pred * x ** 3).sum()

# Update weights using gradient descent
a -= learning_rate * grad_a
b -= learning_rate * grad_b
c -= learning_rate * grad_c
d -= learning_rate * grad_d


print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')

在 Activity Monitor 上检查,其确实在 Apple 上运行,非 Intel
image.png

torchvision

安装 torchvision,注意版本,直接 conda安装默认的最新版本会出错

1
2
>>> print(torch.__version__)
1.11.0

有建议安装 0.9 版本,确实是能成功安装的,但是 load MNIST dataset 会报错。

1
conda install torchvision==0.9

urllib.error.HTTPError: HTTP Error 502: Bad Gatewayfor downloading MNIST dataset

大概还是版本问题,当时也没查看 conda 安装的版本是什么,这里 pip安装 0.12 的版本是可以的。

1
2
pip uninstall torchvision
pip install torchvision
1
2
3
4
5
6
7
8
>>> import torchvision
>>> print(torchvision.__version__)
0.12.0
# try it
train_dataset = torchvision.datasets.MNIST(root='./data',
train=True,
transform=torchvision.transforms.ToTensor(),
download=True)

TensorBoard

TensorBoard 提供机器学习实验所需的可视化功能和工具。它是 tensorflow 下面的工具,折腾不要紧,能安装成功就谢天谢地了。

pip直接安装 tensorboard报错

1
2
3
4
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> grpcio

意思是grpcio安装失败了
安装grpcio,也不能直接 pip安装,参考https://github.com/grpc/grpc/issues/25082#issuecomment-778392661

先设置环境变量再安装

1
2
3
4
5
export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1

pip install grpcio
pip install tensorboard

后面说TensorFlow installation not found是这样的,我们没有安装。

1
2
3
4
5
tensorboard --logdir=runs

TensorFlow installation not found - running with reduced feature set.
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.8.0 at http://localhost:6006/ (Press CTRL+C to quit)

写入一些东西,将原来的 plt.show()展示到 tensorboard上面

1
2
3
4
5
6
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter('runs/mnist1')
# ...
img_grid = torchvision.utils.make_grid(example_data)
writer.add_image('mnist_images', img_grid)
writer.close()

image.png

用来做一些可视化

image.png