M1 Macにtensorflowをインストールするまでの苦労話

Others

機械学習を始めようとM1 Macにtensorflowをインストール完了するまでにかなり色々苦労したので、他の方の参考になればと思い、インストールできるまでの過程を残しておきます。私は、macOS 12.2.1を使用しています。

GitHub - apple/tensorflow_macos: TensorFlow for macOS 11.0+ accelerated using Apple's ML Compute framework.
TensorFlow for macOS 11.0+ accelerated using Apple's ML Compute framework. - GitHub - apple/tensorflow_macos: TensorFlow for macOS 11.0+ accelerated using Appl...

tensorflowインストール(失敗編)

失敗① pip install

pyenvでpython3.8の仮想環境を用意し、下記を実行しました。

% pip install --upgrade --force --no-dependencies https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
ERROR: tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl is not a supported wheel on this platform.

失敗② offline install

同じくpyenvのpython3.8の環境で、下記を実行してみました。

% curl -fLO https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1alpha3.tar.gz
% tar xvzf tensorflow_macos-0.1alpha3.tar.gz
% cd tensorflow_macos
% ./install_venv.sh --prompt
##############################################################

ERROR: TensorFlow with ML Compute acceleration is only available on macOS 11.0 and later.

macOSのバージョンチェックで12.2.1を使っているのにエラーが発生するので、OSチェックの箇所をコメントアウトしてみました。

% vi install_venv.sh
# Do a software version check.
<< COMMENTOUT
if [[ $(sw_vers -productName) != macOS ]] || [[ $(sw_vers -productVersion) != "11."* ]] ; then
  error_exit "TensorFlow with ML Compute acceleration is only available on macOS 11.0 and later."
fi
COMMENTOUT

インストールできた!!でもimportしてみると下記エラーが、、コレもダメみたいです。

% python
>>> import tensorflow
ImportError: dlopen(/Users/****/Documents/test1/myenv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 0x0006): tried: '/Users/****/Documents/style_transfer/myenv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/usr/local/lib/_pywrap_tensorflow_internal.so' (no such file), '/usr/lib/_pywrap_tensorflow_internal.so' (no such file)

失敗③ x86_64版の強制インストール

incompatible cpu-subtype error #34を参考に確認してみると、pythonがx86_64版になっており、ここがarm64になっていないと正常にインストールできないようでした。

% file $(which python)
/Users/****/Documents/test1/myenv/bin/python: Mach-O 64-bit executable x86_64

ダメ元で、install_venv.shの中身を下記のように書き換えて、x86_64版のtensorflowをインストールしてみました。

#arch=$(uname -m)
arch=x86_64

インストールはできるものの動かなかったです、、やっぱりダメそう、、

% python
>>> import tensorflow
zsh: illegal hardware instruction  python

tensorflowインストール(成功編)

できるだけ今の環境を崩さずに、、と横着していましたが、皆がうまく行っている方法でやるのが一番良さそうということで、下記のリンク先を参考にさせて頂き、再度インストールをしてみました。

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

pyenvのuninstall

pythonの複数バージョンの切り替えにpyenvを使いたかったのですが、tensorflow for macOSとは相性が悪いようなので、アンインストールしました。

% arch -x86_64 brew uninstall pyenv
Uninstalling /usr/local/Cellar/pyenv/2.2.5... (877 files, 2.9MB)

pyenv関係の設定のコメントアウト

他にも設定されているものがある方もいると思いますが、pyenv関係の設定は全てコメントアウトし、ターミナルを開き直します。

% vi ~/.zprofile
# eval "$(pyenv init --path)"
%
% vi ~/.zshrc
export PATH="/opt/homebrew/bin:$PATH"
# eval "$(pyenv init -)"
%

python環境の整備 (これは不要かも)

HomebrewのPythonはインストールしていなかったので、スキップしました。ただ、過去にPython 3.10.3を利用したく、無理やり色々と変更をしていたので、こちらを参考にデフォルトのPython 3.8を実行するように変更しました。これは特に不要と思います。

 % python3 --version
Python 3.10.3

% which python3
/usr/local/bin/python3

% /usr/bin/python3 --version
Python 3.8.9

% echo $PATH
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

/usr/local/binが/usr/binより優先されているので、3.10.3が使用される形になっていました。PATHを変更しても良いと思いますが、今回はシンボリックリンク/usr/local/bin/python3を変更しました。

% ls -ltr /usr/local/bin/python3
lrwxr-xr-x  1 root  wheel  70 Mar 17 02:49 /usr/local/bin/python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.10/bin/python3
%

% ln -nfs /usr/bin/python3 /usr/local/bin/python3

% ls -ltr /usr/local/bin/python3
lrwxr-xr-x  1 ****  admin  16 Apr  2 01:49 /usr/local/bin/python3 -> /usr/bin/python3
%

% python3 --version
Python 3.8.9
%

% which python3
/usr/local/bin/python3

Homebrewの再インストール

x86_64版のhomebrewがインストールされているようだったので、arm64版を使えるよう、こちらを参考に再インストールしました。

%/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

%/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

MiniForgeのインストール

MiniForgeとは、Anacondaが現状M1 Macに対応していないため、M1 Macでよく使われるパッケージマネージャで、tensorflowをインストールする際にも使われているようです。

・M1 Macで機械学習用のPython環境構築によく使われるパッケージマネージャ.
・Condaみたいな感じで,複数のConda環境(仮想環境)を作成できる.

https://www.ailab.ics.keio.ac.jp/b4_induction_training/docs/devops/miniforge.html

wgetをインストール後、MiniForgeをインストールし、ターミナルを開き直しました。

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

開き直した際、(base)****@****is-MacBook-Pro ~ %という形でプロンプト表示が変更されていれば、conda環境が有効になっています。

conda環境(仮想環境)の作成

conda createでpythonバージョンを指定して、仮想環境を作成します。

% conda create --name python38 python=3.8

% conda info -e
# conda environments:
#
base                  *  /Users/****/miniforge3
python38                 /Users/****/miniforge3/envs/python38

%

conda activateで作成した仮想環境を有効にします。無効化したい場合は、conda deactivateで無効化できます。

% conda activate python38
% conda info -e
# conda environments:
#
base                     /Users/****/miniforge3
python38              *  /Users/****/miniforge3/envs/python38
% python --version
Python 3.8.13

tensorflowのインストール

参考リンクでは、tensorflow_macos-0.1alpha2.tar.gzをダウンロードしていますが、tensorflow_macos-0.1alpha3.tar.gzがリリースされていたので、こちらをダウンロードしています。それに伴い、変更した箇所は緑色にしています。envは上記のconda info -eの出力を参考にパスを指定しました。

$ wget https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1alpha3.tar.gz
$ tar xvzf tensorflow_macos-0.1alpha3.tar.gz
$ env="$HOME/miniforge3/envs/python38"
$ libs="$PWD/tensorflow_macos/arm64/"
$ 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.1a3-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.1a3-cp38-cp38-macosx_11_0_arm64.whl"

無事にインストールできました!!

% python
>>> import tensorflow as tf
>>> tf.__version__
'2.4.0-rc0'

【余談】vscodeでcondaの仮想環境を使う

vscodeでconda環境を利用するまでに少し手こずったので、それは下記に記載しています。もし同じく困っている方がいましたら、是非ご覧ください。

最後に

やっぱり横着するとよくないですね。。皆がやっている方法を素直に実行するのが、一番の近道だと改めてわかりました。。これから機械学習ガンガンやっていきたいと思います!

コメント

タイトルとURLをコピーしました