Apple Silicon(M1) Mac+tensorflow-macosでディープラーニングする

9 min read読了の目安(約8200字 2

M1 Macでディープラーニングしてみる

M1 MacBook Airに一通り開発環境をセットアップしました。

https://zenn.dev/karaage0703/articles/665e0cbdbd69f0

ただ、ディープラーニング関係はセットアップできていなかったので、とりあえずTensorFlowを入れて、色々AI関係のソフト動かして遊んでみました。一通り動いてそれなりに遊べたのですが、色々ハマったことで知見も得られたので簡単にまとめておきます。

まず、分かったことは以下です。

  • M1 MacでもTensorFlowは普通に使える
  • PyenvとかHomebrewで入れたPythonは使わない(消した)方が良い
  • MiniForgeがtensorflow-macosを入れられる上に関連パッケージも比較的インストールできてよい(公式の方法だとpipがまだOpenCVとかに対応していない)
  • M1 MacBook AirでiMac(3.6GHz クアッドコア Intel Core i7)相当の速度が出ている

参考にしたサイトなどは、本記事の最後にまとめました。先人にめっちゃ助けられました。

本記事の流れは以下です。

  1. Python環境の構築
  2. TensorFlowのインストール
  3. AI(ディープラーニング)で遊んでみる

ディープラーニングに関しては、推論のみで学習は実施していません。ご了承ください。

Python環境の構築

Python環境の構築ですが、私は、最初に紹介したセットアップ記事の通り、PyenvやHomebrewのPythonなどをインストールしていたのですが、現状これらはTensorFlowに対応していないため、それらを削除するところからはじめました。

まっさらな環境の人は、以下を実行しておくだけで次に進んでOKです。

$ xcode-select --install

Pyenvが入っている場合は、~/.zshrcからpyenv関係の設定を次のようにコメントアウトします。

#export PYENV_ROOT="$HOME/.pyenv"
#export PATH="$PYENV_ROOT/bin:$PATH"
#eval "$(pyenv init -)"
#eval "$(pyenv virtualenv-init -)"
#export PYENV_VIRTUALENV_DISABLE_PROMPT=1

続いて、HomebrewのPythonを以下コマンドでアンインストールしました。

$ brew uninstall --ignore-dependencies python3

以下の通り、Python3のバージョンが3.8(3.9は現状NG)で、Python3のパスが/usr/bin/python3/になっていればOKです。

$ python3 -V
Python 3.8.2
$ which python3
/usr/bin/python3

TensorFlow for macOSのインストール

macOS対応のTensorFlowのインストールです。公式の方法だと、pipで関連パッケージ(OpenCV)を現状入れられないので、MiniForgeで入れる方法が良いです(現状一択)。

公式の方法で入れる必要のある人は、ベンチマークするガチ勢かPythonのM1対応を推し進める勇者だけだという理解です。

MiniForgeを使ったインストール方法

推奨の方法です。まずは、MiniForgeをインストールします。

$ wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
$ bash Miniforge3-MacOSX-arm64.sh

途中色々聞かれたら、Yes or Enterを入力してください。

続いて、MiniForgeにPython3.8環境を構築します。

$ conda create --name python38 python=3.8

Python3.8環境をアクティベートします。これでPython3.8の仮想環境が使えるようになりました。

$ conda activate python38

このアクティベートされた状態で、事前に必要なライブラリをインストールします。

$ conda install numpy
$ conda install six
$ conda install matplotlib
$ conda install opencv

以下コマンドでTensorFlowをインストールします。

$ wget https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha2/tensorflow_macos-0.1alpha2.tar.gz
$ tar xvzf tensorflow_macos-0.1alpha2.tar.gz
$ env="$HOME/miniforge3/envs/python38"
$ libs="$PWD/tensorflow_macos/ar
m64/"
$ pip install --upgrade -t "$env/lib/python3.8/site-packages/" --no-dependencies --force "$libs/grpcio-1.33.2-cp38-cp38-macosx_11_0_arm64.whl"
$ pip install --upgrade -t "$env/lib/python3.8/site-packages/" --no-dependencies --force "$libs/h5py-2.10.0-cp38-cp38-macosx_11_0_arm64.whl"
$ pip install --upgrade -t "$env/lib/python3.8/site-packages/" --no-dependencies --force "$libs/tensorflow_addons_macos-0.1a2-cp38-cp38-macosx_11_0_arm64.whl"
$ conda install -c conda-forge -y absl-py
$ conda install -c conda-forge -y astunparse
$ conda install -c conda-forge -y gast
$ conda install -c conda-forge -y opt_einsum
$ conda install -c conda-forge -y termcolor
$ conda install -c conda-forge -y typing_extensions
$ conda install -c conda-forge -y wheel
$ conda install -c conda-forge -y typeguard
$ pip install wrapt flatbuffers tensorflow_estimator google_pasta keras_preprocessing protobuf
$ 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"

インストールできたか確認しましょう。以下のようにコマンド実行してTensorFlowをインポートできていればOKです。

$ python3
Python 3.8.6 | packaged by conda-forge | (default, Jan 25 2021, 22:55:00)
[Clang 11.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__
'2.4.0-rc0'

公式のインストール方法

TensorFlow for macOSの公式のインストール方法です。先ほど書いた通り、こちらは推奨ではありません(OpenCVなどがpipで入れられない)が、一応書いておきます。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/apple/tensorflow_macos/master/scripts/download_and_install.sh)"

途中色々聞かれますが、基本 yes(y)かデフォルト設定(そのままEnter)でOKです。

以下でvenvにより仮想環境をアクティベートします。

$ source /Users/<username>/tensorflow_macos_venv/bin/activate

バージョンを確認しましょう。

$ python3
>>> import tensorflow as tf
>>> tf.__version__
'2.4.0-rc0'

TF-Agentsをインストールする方法

強化学習などで、TF-Agentsが必要な場合は、以下コマンド実行すればインストールできます。強化学習が不要ならここは飛ばしてもOKです。

$ conda install bazel
$ pip install tf_agents

PyTorchをインストールする

ついでにPyTorchをインストールする方法も紹介します。condaやpipだとインストールできませんが、優しい人が簡単にインストールできるPythonパッケージ(.whl)ファイルを用意してくれています。以下リンク先の右上のダウンロードボタンでダウンロードしましょう。

PyTorchのApple Silicon Mac対応のPythonパッケージダウンロード

ダウンロードしたら、以下コマンドを実行するとPyTorchをインストールできます。

$ pip install ~/Downloads/torch-1.8.0a0-cp38-cp38-macosx_11_0_arm64.whl

以下は参考にした記事です。

https://qiita.com/onkyo14taro/items/6ce72982ae5a43fdee63

AI(ディープラーニング)で遊ぶ

せっかくTensorFlowが入ったので、色々動かしてみます。

Object Detection APIによる物体検出

拙作の「object_detection_tools」を使用すると、簡単に物体検出できます。詳細は以下記事参照ください。

https://qiita.com/karaage0703/items/8c3197d11f61812546a9

とにかく一刻も早く動かしたい!という人は、以下コマンドうてばOKです。

$ conda activate python38
$ git clone https://github.com/karaage0703/object_detection_tools
$ cd object_detection_tools/models
$ ./get_efficientdet_d0_coco17_tpu-32.sh
$ cd ..
$ python3 scripts/object_detection_tf2.py -l='./models/coco-labels-paper.txt' -m='./models/efficientdet_d0_coco17_tpu-32/saved_model/'

実行結果のイメージです。以下はiMac(Intel)でEfficientDetモデルを実行した画像ですが、ほぼ同じFPSで動きました。

Deep写輪眼

続いてDeep写輪眼という高橋かずひとさん作の物体検出の応用ソフトを動かしてみます。詳細は以下参照ください。

https://karaage.hatenadiary.jp/entry/2020/10/16/073000

とにかく動かしたいせっかちな方は以下実行ください。

$ conda activate python38
$ git clone https://github.com/Kazuhito00/NARUTO-HandSignDetection
$ cd NARUTO-HandSignDetection
$ python Ninjutsu_demo.py --score_th=0.5

以下は実際にM1 MacBook Airで実行した様子です。

EfficientDetモデルで4FPS程度出ていますね。

姿勢推定

続いては、姿勢推定です。姿勢推定技術に関しては、拙作の書籍「とにかく楽しいAI自作教室」を参照いただけましたら幸いです。

https://amzn.to/3qzpEwt

必要なライブラリをインストールします。

$ conda activate python38
$ brew install swig
$ pip install tqdm
$ pip install slidingwindow
$ pip insall tf_slim
$ conda install scipy
$ pip install pycocotools

ソフトをダウンロードしてセットアップします。

$ git clone -b tf2 https://github.com/karaage0703/tf-pose-estimation
$ cd tf-pose-estimation/tf_pose/pafprocess
$ swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace
$ cd ../../

ソフトを動かします(tf-pose-estimationディレクトリ直下)で実行ください。

$ python3 run_webcam.py --model=mobilenet_v2_small --resize=320x176

以下はイメージ画像です。

上のはJetson Nanoで動かしているので4fps程度ですが、M1 MacBook Airだと15fps程度出ました。

リポジトリは、私が無理矢理TensorFlow2.xに対応するため魔改造したものを使っていますが、以下のリポジトリとかの方がちゃんとTensorFlow2.xに対応していて素直かもしれません。

https://github.com/gsethi2409/tf-pose-estimation

まとめ

M1 MacBook AirとTensorFlow for macOSでディープラーニングして遊んでみました。かなり対応すすんでいて、画像込みのデモとかもある程度は動かせそうな感じですが、色々やろうとするとハマるかもしれません(pygame入れたかったのですが、現状pipでもcondaでも入れられませんでした)。

今は過渡期なので、そのうちpipで簡単にインストールできるようになると思いますが、もうしばらくかかりそうですね。

速度に関しては、2017年モデルのiMac(Intel Core i7)と同等でした。十分凄いんですけど、ちょっと期待が大き過ぎたので感動はなかったです(笑)ひょっとしたら私の使い方が悪いだけかもしれません。もし、もっと速くなる方法とかあればぜひ教えてください。

宣伝「からあげ先生のとにかく楽しいAI自作教室」

AIの初心者向け本「からあげ先生のとにかく楽しいAI自作教室」を執筆しました。Google Colaboratoryを使って、実際に動かしながらAIを学べる本になっています。

この記事では実践していない、ディープラーニングの学習も学べますので、書籍をもとに自分で学習したモデルをM1 Macで動かすみたいなこともできます。よろしければ是非。以下、本の紹介記事へのリンクです。

https://karaage.hatenadiary.jp/entry/2020/12/11/073000

https://amzn.to/3qzpEwt

参考リンク

M1 MacとTensorFlowで機械学習をやろう

https://github.com/apple/tensorflow_macos

https://qiita.com/forest1988/items/4b6bb63e3438dea0c832

https://qiita.com/tomoyaeibu/items/46f2f3384a370df71d5e

https://braveam.com/archives/1409

https://braveam.com/archives/1411

https://medium.com/gft-engineering/macbook-m1-tensorflow-on-jupyter-notebooks-6171e1f48060

関連記事

https://zenn.dev/karaage0703/articles/f3254b14898b4d

この記事に贈られたバッジ