其实Mac M1版本的大部分软件都已经兼容,包括docker,pallalels虚拟机安装windows,chorme arm版本,firefox,pycharm的arm版本,体验感不恨错,而且安装IOS应用也很简单。
下面我们就NLP的几个包进行简单演示。
我们要安装python arm64版本的环境和tensorflow 2.4.0rc0和torch 1.8.0,以及transformers 4.4.2最新版。
一、常用的命令
- 检查你安装的软件的python 架构版本, file命令
# file /Users/admin/miniforge3_arm/envs/tf_macos/bin/python
/Users/admin/miniforge3_arm/envs/tf_macos/bin/python: Mach-O 64-bit executable arm64
2. 查看CPU的架构
/usr/sbin/sysctl -n machdep.cpu.brand_string
Apple M1
3. 查看当前的终端zsh或bash的架构, 这里是一个坑,如果你从老得电脑用迁移助手迁移过来的话,终端大部分不是arm64而是x86_64,所以请确保你的终端一直是arm64的架构下运行。
# uname -m
arm64
二、安装arm64 版本的python
- 下载miniforge版本的conda, conda-forge/miniforge , 下载这个版本就可以。
OS X arm64 (Apple Silicon) (**) Miniforge3-MacOSX-arm64
2. 安装很简单,确保你在arm64的终端下运行, 一路确认
chmod a+x Miniforge3-MacOSX-arm64.sh
./Miniforge3-MacOSX-arm64.sh
3. conda 默认的base是python3.9的,我们使用python3.8的版本,所有安装包都会安装到这个环境,大部分conda-forge 提供的包都是可以使用的了。
conda create --name py38 python=3.8
conda activate py38
# conda search scikit-learn && conda install scikit-learn matplotlib #例如搜索sklearn包,然后安装
三、安装tensorflow
- 下载链接 apple/tensorflowmacos,这个tensorflow是专门用于macos的,里面包含2种架构的安装包,有arm64和x86_64, 我们要,所以要确保你的终端环境是arm64的。安装tensorflow前,请确保安装了xcode,可以去app store上搜xcode安装或运行如下命令。可以顺便把Rosetta 2也安装上,方便以后运行x86_64位程序。
# xcode-select --install
#softwareupdate --install-rosetta
I have read and agree to the terms of the software license agreement. A list of Apple SLAs may be found here: http://www.apple.com/legal/sla/
Type A and press return to agree: A
2021-03-22 17:17:03.890 softwareupdate[58473:811175] Package Authoring Error: 071-14757: Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute
Install of Rosetta 2 finished successfully
由于github不太稳定,而且tensorflow安装包很大,建议采用下载后安装的方式
# curl -fLO https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha2/tensorflow_macos-0.1alpha3.tar.gz
# tar xvzf tensorflow_macos-0.1alpha3.tar.gz
# cd tensorflow_macos
# 注意安装时选择环境要选择conda建立好的那个环境的路径,绝对路径, 例如我的环境是/Users/admin/miniforge3/envs/py38
# ./install_venv.sh --prompt
安装完成后确认下tensorflow版本,确定是arm64版本的
# pip freeze | grep tensorflow
grpcio @ file:///var/folders/mw/rssk_hx97dsdq43_5cxlxpj40000gn/T/tmp.TzdTlUj4/tensorflow_macos/arm64/grpcio-1.33.2-cp38-cp38-macosx_11_0_arm64.whl
h5py @ file:///var/folders/mw/rssk_hx97dsdq43_5cxlxpj40000gn/T/tmp.TzdTlUj4/tensorflow_macos/arm64/h5py-2.10.0-cp38-cp38-macosx_11_0_arm64.whl
tensorflow-addons-macos @ file:///Users/admin/git/tensorflow_macos/scripts/arm64/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
tensorflow-estimator==2.3.0
tensorflow-macos @ file:///Users/admin/git/tensorflow_macos/scripts/arm64/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
2. 测试下tensorflow是否正常
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
#测试一个样本的训练
predictions = model(x_train[:1]).numpy()
tf.nn.softmax(predictions).numpy()
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], predictions).numpy()
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
res = model.evaluate(x_test, y_test, verbose=2)
print(res)
四、 安装pytorch
- miniforge的conda默认已经支持pytorch了,直接安装即可
conda install pytorch
2. 安装完成测试:
# conda info pytorch
pytorch 1.8.0 cpu_py38h179404b_0 #支持的是cpu版本,mac m1的gpu版本尚未支持
简单示例
# -*- coding: utf-8 -*-
import random
import torch
import math
class DynamicNet(torch.nn.Module):
def __init__(self):
"""
In the constructor we instantiate five parameters and assign them as members.
"""
super().__init__()
self.a = torch.nn.Parameter(torch.randn(()))
self.b = torch.nn.Parameter(torch.randn(()))
self.c = torch.nn.Parameter(torch.randn(()))
self.d = torch.nn.Parameter(torch.randn(()))
self.e = torch.nn.Parameter(torch.randn(()))
def forward(self, x):
y = self.a + self.b * x + self.c * x ** 2 + self.d * x ** 3
for exp in range(4, random.randint(4, 6)):
y = y + self.e * x ** exp
return y
def string(self):
"""
Just like any class in Python, you can also define custom method on PyTorch modules
"""
return f'y = {self.a.item()} + {self.b.item()} x + {self.c.item()} x^2 + {self.d.item()} x^3 + {self.e.item()} x^4 ? + {self.e.item()} x^5 ?'
#定义x和y
x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)
#使用自定义的模型
model = DynamicNet()
# 构造损失函数和优化器
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-8, momentum=0.9)
for t in range(30000):
#前向网络,训练30000步
y_pred = model(x)
#打印损失
loss = criterion(y_pred, y)
if t % 2000 == 1999:
print(t, loss.item())
#反向传播,更新梯度
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'计算出求出y的公示: {model.string()}')
五、安装transformers
1. 开始安装transformers, transformers主要依赖tokenizers,安装tokenizers依赖rust,所以需要先安装rust。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
conda install -c conda-forge tokenizers
conda install -c conda-forge transformers==4.4.2
#如果需要还可以安装huggeface的datasets,安装方法如下
conda install -c conda-forge pyarrow
conda install -c conda-forge datasets
2.测试transformers正常运行。
python -c "from transformers import pipeline; print(pipeline('sentiment-analysis')('we love you'))"
Downloading: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████| 629/629 [00:00<00:00, 178kB/s]
Downloading: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 268M/268M [00:38<00:00, 6.88MB/s]
Downloading: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████| 232k/232k [00:00<00:00, 260kB/s]
Downloading: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| 48.0/48.0 [00:00<00:00, 8.46kB/s]
[{'label': 'POSITIVE', 'score': 0.9998704791069031}]