M1 MacBookでTensorFlowとXGBoostを動かす!!
M1がすごい、ということでsurfaceからmacbookに乗り換えました。大学の勉強関係で使うには素晴らしいのですが、プログラミングの環境構築に関しては悪夢でした。文字通り悪夢でした。
悪夢を乗り越えどうにかこうにかtensorflowとxgboostを動かしたので、mac初心者、環境構築なんもわからん、の環境構築を紹介したいと思います。
何もわからんまま環境構築、ではなく少しわかって環境構築したいので僕が勉強したこともちょいちょい挟んで書きます。
メニューは
1,最初の確認
2,HomeBrew導入
3,MiniForgeでTensorFlow-MacOSを動かす
4,CMakeによるビルドでXGBoostを動かす
です。いろんな方の記事を参考にしました。いろいろ間違っていることも書くかもしれないので、指摘してくださると幸いです。(とくに用語に関してひどいと思いますが、簡単を優先するのである程度お許しを。)
1,最初の確認
すばらしきM1 MacBookですが、インテルのCPU→アップル製CPUに変わった※ことでいろいろとめんどくさい事が起こります。
かんたんには、従来のアプリやパッケージはインテル向けに作られているので、それをM1で動かそうとすると色々噛み合わなくて困るわけです。
参考(動画めちゃわかりやすい)
※ほんとはCPUが変わったというよりコンピューターを動かす上でのCPUとかいろんなものをひっくるめた設計(アーキテクチャ)が変わっている
ちょっとこの辺確認してみます。Rosettaはすでに入っている前提です※2。
まず、アプリケーション→ターミナルを開いて
uname -m
というコマンドを打ちます。システムの情報を教えてくれるコマンドです。
arm 64ってのが「M1で動いてますよ」という意味です
次にアプリケーション→ターミナルを右クリックして情報を見る→Rosettaを使用して開く、にチェックします。
で、もういっかいターミナル開き直して uname -m を入力すると
x86_64に変わっています。Rosettaが有効になっているので、ホントはM1だけど、インテルのCPUとして認識できてますよ、という意味です。
なんとなくイメージ湧きますでしょうか。
参考
※2 Rosettaが必要なアプリを使おうとすると「Rosetta入れますね」と自動でやってくれます。僕はANKIというアプリを入れたらRosettaが入りました。
あと、事前知識として必要なのは
コマンドラインの基礎
PATHってなに??
ビルドってなに?(イメージ)
https://wa3.i-3-i.info/word12775.html
などなどです。目を通しておくと「ちょっとわかる」になる。
2,HomeBrew導入
ここが非常にわかりやすかったです
arm64(M1)版とx86(Rosetta経由)版両方を入れます。入れる場所が違います。
arm版を入れる
ターミナルをRosettaから開く、のチェックを外してから開く
arm版は/opt以下に入っていないといけないので、場所を指定してインストールする
cd /opt
sudo mkdir homebrew
sudo chown $USER /opt/homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
PATHを通します。
シェルはzshなので.zshrcを編集します。
ホームディレクトリに戻る
cd
touch .zshrc
で設定ファイルを作る
ls -a
で確認
ファインダーから確認。
.zshrcは隠しファイルなので表示されていない場合は
shift+command+. で表示
.zshrcに
export PATH=/opt/homebrew/bin:$PATH
を追加します。
再びターミナル
バージョン確認、最新にアップデートしておく。
x86版のhomebrewをインストール
Rosettaを使用して開く、にチェックしてターミナルを開き直す。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
これで入ります。
export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH
をzshrcに追加。
確認↓
opt/にarm版のhomebrew
usr/localにx86版のhomebrewが入っている
参考
3,MiniForgeでtensorflow-macosを動かす
やっとこさ本題。
この記事を参照。ありがたや。
やってることおなじなのですが、一応書かせてください。
MiniForge(Anacondaの軽量版みたいなもの)を入れます。
arm64で
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh
なんか色々聞かれるが全部enterかyes
miniforgeのPATHの確認↓
echo $PATH
自動でconda環境にならないようにする
conda config --set auto_activate_base false
以下、上で紹介した記事(Apple Silicon(M1) Mac+tensorflow-macosでディープラーニングする)と全く同じなので割愛します。
conda create --name python38 python=3.8
conda activate python38
から
・・・
pip install tensorboard
pip install --upgrade -t "$env/lib/python3.8/site-packages/" --no-dependencies --force "$libs/tensorflow_macos-0.1a2-cp38-cp38-macosx_11_0_arm64.whl"
をひたすら打ち込みます。
VSCodeからtensorflowが動くか確認
(VSCodeはuniversal版を入れました)
tf_test.py
とか作る。Pythonの拡張は言われたやつを適当に入れとく。
実際に学習してみる
tf_test.py
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(),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
環境指定すると右上の実行ボタンから実行できる。
ターミナルからも。
動きましたー!めでたし。
4,XGBoostによるビルドでCMakeで動かす
Cmakeなるものを使ってビルドします。
これはあんましわかっていないのでなにか変なことをしているかも。
参考
VSCodeから作業ディレクトリに入って
さっきのconda環境に入る。
以下コマンドを実行していく。
git cloneで左にxgboostのディレクトリが出てくるので、ディレクトリの構造を参照しながら進めてください。
brew install cmake
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
mkdir build
cd build
cmake ..
make -j4
cd ..
cd python-package
ここで、python3をフルパスで指定できるように
which python3
でPythonのパスを調べて、
python3のパスのあとに
setup.py install
で実行する。
これで準備OK
sklearnを入れる。
conda install scikit-learn
サンプルコード
import xgboost as xgb
print(xgb)
print('OK!!)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
dataset = datasets.load_breast_cancer()
X, y = dataset.data, dataset.target
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
shuffle=True,
random_state=42,
stratify=y)
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
xgb_params = {
'objective': 'binary:logistic',
'eval_metric': 'logloss',
}
bst = xgb.train(xgb_params,
dtrain,
num_boost_round=100,
)
y_pred_proba = bst.predict(dtest)
y_pred = np.where(y_pred_proba > 0.5, 1, 0)
acc = accuracy_score(y_test, y_pred)
print('Accuracy:', acc)
実行すると・・・
こんなかんじで動きます。
やったー。
M1での環境構築、本当に地獄でした。いまはpipで入らない、とかいろいろありますがそのうち解消されるのでしょう。いろんな方の記事を参考にしてどうにか自分でやりきることができました。ありがとうございます。
PATHってなに?とかコマンドってなんで実行できるの?とかいろいろと勉強にはなりました。この記事が誰かの役に立ったなら幸いです。