はるなし[医学・プログラミング]のblog

こんにちは!機械学習・プログラミングをやる医学生です。情報発信、アウトプットによるよりよい理解、に使っていきたいと思っています。

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で動かそうとすると色々噛み合わなくて困るわけです。

参考(動画めちゃわかりやすい)

youtu.be


note.com

 

※ほんとはCPUが変わったというよりコンピューターを動かす上でのCPUとかいろんなものをひっくるめた設計(アーキテクチャ)が変わっている

 

 ちょっとこの辺確認してみます。Rosettaはすでに入っている前提です※2。

 まず、アプリケーション→ターミナルを開いて

 

uname -m

 

というコマンドを打ちます。システムの情報を教えてくれるコマンドです。

f:id:harunaishina:20210420012432p:plain

arm 64ってのが「M1で動いてますよ」という意味です

次にアプリケーション→ターミナルを右クリックして情報を見る→Rosettaを使用して開く、にチェックします。

f:id:harunaishina:20210420012707p:plain

で、もういっかいターミナル開き直して uname -m を入力すると

f:id:harunaishina:20210420012919p:plain

x86_64に変わっています。Rosettaが有効になっているので、ホントはM1だけど、インテルのCPUとして認識できてますよ、という意味です。

なんとなくイメージ湧きますでしょうか。

参考

oku.edu.mie-u.ac.jp

 

※2 Rosettaが必要なアプリを使おうとすると「Rosetta入れますね」と自動でやってくれます。僕はANKIというアプリを入れたらRosettaが入りました。

 

あと、事前知識として必要なのは

コマンドラインの基礎

prog-8.com

PATHってなに??

reffect.co.jp

ビルドってなに?(イメージ)

https://wa3.i-3-i.info/word12775.html

 などなどです。目を通しておくと「ちょっとわかる」になる。

 

2,HomeBrew導入

 ここが非常にわかりやすかったです

kkkw.hatenablog.jp

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

 

f:id:harunaishina:20210420014457p:plain

PATHを通します。

シェルはzshなので.zshrcを編集します。

ホームディレクトリに戻る

cd

touch .zshrc
で設定ファイルを作る

ls -a
で確認

f:id:harunaishina:20210420014748p:plain

ファインダーから確認。

.zshrcは隠しファイルなので表示されていない場合は
shift+command+. で表示

f:id:harunaishina:20210420014956p:plain

.zshrcに

export PATH=/opt/homebrew/bin:$PATH

を追加します。

f:id:harunaishina:20210420015130p:plain

再びターミナル

brew --version 
brew update

バージョン確認、最新にアップデートしておく。

f:id:harunaishina:20210420015303p:plain

x86版のhomebrewをインストール

Rosettaを使用して開く、にチェックしてターミナルを開き直す。

f:id:harunaishina:20210420012919p:plain

/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にx86homebrewが入っている

参考

note.com

3,MiniForgeでtensorflow-macosを動かす

 

やっとこさ本題。

この記事を参照。ありがたや。

やってることおなじなのですが、一応書かせてください。

zenn.dev

 

MiniForge(Anacondaの軽量版みたいなもの)を入れます。

arm64で

 

brew install wget

 

f:id:harunaishina:20210420015955p:plain

 

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

f:id:harunaishina:20210420020242p:plain

自動で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)


環境指定すると右上の実行ボタンから実行できる。
ターミナルからも。

f:id:harunaishina:20210420020840p:plain

f:id:harunaishina:20210420021001p:plain

動きましたー!めでたし。

 

4,XGBoostによるビルドでCMakeで動かす

 

Cmakeなるものを使ってビルドします。

これはあんましわかっていないのでなにか変なことをしているかも。

参考

discuss.xgboost.ai

zhuanlan.zhihu.com

 

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のパスを調べて、

f:id:harunaishina:20210420021632p:plain

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)

 

実行すると・・・

f:id:harunaishina:20210420022017p:plain

こんなかんじで動きます。

 

やったー。

 

M1での環境構築、本当に地獄でした。いまはpipで入らない、とかいろいろありますがそのうち解消されるのでしょう。いろんな方の記事を参考にしてどうにか自分でやりきることができました。ありがとうございます。

PATHってなに?とかコマンドってなんで実行できるの?とかいろいろと勉強にはなりました。この記事が誰かの役に立ったなら幸いです。