Apple M1的AI环境搭建

date
Sep 9, 2021
slug
Apple_M1_AI_environment_construction
status
Published
tags
M1
data
summary
本文环境搭建的基础是Python3.9, 因为M1为ARM架构,所以放弃了Anaconda,使用Miniforge3。包括Tensorflow, xgboost, Lightgbm, Numpy, Pandas, Matplotlib, NGBoost等。当然,因为是Python3.9, 所以有些库实在是无法使用。
type
Post
URL
本文环境搭建的基础是Python3.9, 因为M1为ARM架构,所以放弃了Anaconda,使用Miniforge3。包括Tensorflow, xgboost, Lightgbm, Numpy, Pandas, Matplotlib, NGBoost等。当然,因为是Python3.9, 所以有些库实在是无法使用。

Homebrew

作为Mac的包管理神器,首先当然要先从Homebrew开始。Homebrew已经支持了ARM架构,可以直接进行安装,当然,如果你电脑里以前存在X86的brew支持,请先卸载干净。

Homebrew 卸载

/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/uninstall.sh>)"

Install ARM Homebrew

/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"
执行完毕后,Homebrew安装在/opt/homebrew路径下;在安装完毕后,命令行后会提示执行命令设置环境变量,当然,以防万一,这里也提供一下:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
如果是bash shell, 则:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.bash_profile
eval "$(/opt/homebrew/bin/brew shellenv)"
记得source ~/.zprofile

Install X86 Homebrew

arch -x86_64 /bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"
X86版本的安装执行完成后命令行未提示添加环境变量。

alias 支持多版本

在终端执行:
alias brew='arch -arm64 /opt/homebrew/bin/brew'
alias ibrew='arch -x86_64 /usr/local/bin/brew'
这里可以看出两者路径区别

设置镜像

中科大源

# brew
git -C "$(brew --repo)" remote set-url origin <https://mirrors.ustc.edu.cn/brew.git>

# core
git -C "$(brew --repo homebrew/core)" remote set-url origin <https://mirrors.ustc.edu.cn/homebrew-core.git>

# cask
git -C "$(brew --repo homebrew/cask)" remote set-url origin <https://mirrors.ustc.edu.cn/homebrew-cask.git>

brew update

清华大学源

# brew
git -C "$(brew --repo)" remote set-url origin <https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git>

# core
git -C "$(brew --repo homebrew/core)" remote set-url origin <https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git>

# cask
git -C "$(brew --repo homebrew/cask)" remote set-url origin <https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git>

brew update

恢复默认源

# brew
git -C "$(brew --repo)" remote set-url origin <https://github.com/Homebrew/brew.git>

# core
git -C "$(brew --repo homebrew/core)" remote set-url origin <https://github.com/Homebrew/homebrew-core.git>

# cask
git -C "$(brew --repo homebrew/cask)" remote set-url origin <https://github.com/Homebrew/homebrew-cask.git>

brew update

Homebrew 其他相关

设置bottles镜像

# bottles for zsh
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottles' >> ~/.zprofile
source ~/.zprofile

# bottles bash
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottles' >> ~/.bash_profile
source ~/.bash_profile

cask

目前cask是从GitHub上读取软件源,而GitHub Api对访问有限制,如果使用比较频繁的话,可以申请Api Token,然后在环境变量中配置到HOMEBREW_GITHUB_API_TOKEN
echo 'export HOMEBREW_GITHUB_API_TOKEN=yourtoken' >> ~/.zprofile
source ~/.zprofile

Install Miniforge3

首先需要下载安装包: Download
请下载arm64(Apple Silicon)版本:
notion image
下载完成后进入到文件目录,比如我是在~/Download/内,执行:
bash Miniforge3-MacOSX-arm64.sh
整个执行过程会有大概三次填写yes并回车确定,最后一次会询问你是否执行conda init, 会自动在~/.zshrc内添加环境变量,如果未执行的,可以将下面语句加入文件末尾:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/xx/miniforge3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/Users/xx/miniforge3/etc/profile.d/conda.sh" ]; then
        . "/Users/xx/miniforge3/etc/profile.d/conda.sh"
    else
        export PATH="/Users/xx/miniforge3/bin:$PATH"
    fi
fi
unset __conda_setup

conda activate tf
# <<< conda initialize <<<
记得自行更改/Users/xx/内的用户名
等待Miniforge3安装完成,然后设置一个专供学习Tensorflow的虚拟环境
conda create -n tf python=3.9.5
conda activate tf # 将这句添加到~/.zshrc内,每次打开shell都会自动执行
关于conda切换环境的命令,建议自行Google学习一下,很有用。

Install Tensorflow

目前网上流传的Tensorflow安装基本是两个版本,一个是安装一大堆的支持和依赖,一个是使用yml文件提前准备好环境库一键完成环境创建,比如environment.yml
conda env create --file=environment.yml --name=tf
其实这一步也很简单,Apple为了大力推广自家的ARM,已经为大家做好了这部分准备,我们只需要安装就行了。
假设目前在tf环境内
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal
好了,结束!
可以自行利用下面一段代码测试下:
from tensorflow.keras import layers
from tensorflow.keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
notion image
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)
test_acc
notion image
执行过程中可以在资源管理器中看到GPU的占用:
notion image

其他

Lightgbm

conda install Loghtgbm
一句代码解决,完全靠谱。

xgboost

xgboost稍微有点麻烦,我测试了最稳妥的安装方式,还是自行编译,那这个时候我们就需要用到brew安装并设置编译环境了:
注意,我用的都是brew而非ibrew, 目前都是在ARM环境下完成操作。
brew install gcc
brew install cmake
brew install libomp
然后下载源码并执行
git clone git@github.com:dmlc/xgboost.git
cd xgboost
mkdir build
cd build
CC=gcc-11 CXX=g++-11 cmake ..
cd ../python-package
/Users/xx/miniforge3/envs/tf/bin/python setup.py install
然后就OK了。
至于其他的,Numpy在安装Tensorflow的时候就自动作为依赖安装了,Pandas, Matplotlib, NGBoost等,执行下方:
conda install -c conda-forge pandas
conda install -c conda-forge matplotlib
conda install -c conda-forge ngboost
如果conda内实在没有的,再试试pip安装,再不行,就只能自行下载源码编译了。
目前在当前环境下解决不了的几个库:
  1. CatBoost
  1. Cairo -> Pycairo
  1. GraphEmbedding
  1. CV2
  1. igraph
在整个过程中,可能会遇到各种各样的问题,大家要习惯于使用Google和查阅官方文档;

参考


© Hivan Du 2021 - 2022