Rosetta 2環境下におけるPythonへのTensorFlowの導入
モチベーション
機械学習は大量のデータの特徴を学習することで未知のデータの結果を予測するルール(モデル)を作成する技術です.研究開発が非常に盛んに行われており,顔認識や自動翻訳などさまざまな分野で活躍しています.
プログラミング言語であるPythonではTensorFlowをはじめとしたライブラリを用いることで機械学習を容易に実装できるため,機械学習を学ぶ上で非常に有用なツールとして活用されています.
M1 Macでは,ARMアーキテクチャ上でAppleが独自にフォークしたTensorFlowを動作させることが可能ですが,2021年1月現在seleniumなどのライブラリをARMアーキテクチャ上で動作させることができないため,今回はRosetta 2環境下で構築したPythonに対してTensorFlowを導入する方法について紹介します.
※ 2021年3月現在,ネイティブ環境下で主要ライブラリの導入が可能になっているため,本記事の情報は古いです.
TensorFlowのインストール
Pythonではpipを用いて以下のコマンドを実行することでTensorFlowをインストールすることができます.
$ pip install tensorflow
Rosetta 2環境下のM1 Macにおいても,上記コマンドでTensorFlowのインストール自体は可能ですが,Pythonプログラム内でimport tensorflow
を実行するとillegal hardware instruction python
のようなエラーメッセージが出力されプログラムが正しく動作しません.
https://github.com/tensorflow/tensorflow/issues/46044
本記事では,
の3本立てで説明を行います.今回はTensorFlowのソースからのビルドというページを参考にインストールを行っていきます.
TensorFlow依存ライブラリのインストール
TensorFlowを導入するために以下のコマンドを実行し,TensorFlow依存ライブラリをインストールします.pyenvなどの仮想環境を用いていない場合は--user
をオプションに指定する必要があります.
$ pip install six numpy wheel setuptools mock future
$ pip install keras_applications --no-deps
$ pip install keras_preprocessing --no-deps
Bazelを用いたTensorFlowのビルド
TensorFlowをビルドするためにはbazelというパッケージが必要です.今回はRosetta 2環境下でTensorFlowをビルドするために,まず以下のコマンドを実行しmacOS上にbazelをインストールします.
Homebrewをインストールしていない場合は以下の記事などを参考にインストールする必要があります.
https://zenn.dev/_lambda314/articles/63b851221a7016
$ arch -arch x86_64 brew install bazel
bazelのインストールが完了した後,以下のコマンドを実行します.
$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ ./configure
./configure
を実行すると,"Pythonバイナリ/ライブラリ"のロケーション,"ROCm/Cuda"のサポート,clangのダウンロードなどについて問われます.Python周りのロケーションについてはデフォルトと異なるものを選ぶ場合はそのように指定します.それ以外は特に必要なければそのまま"Enterキー"を入力し,ビルドの準備を完了させます.
M1 Macではこの状態でビルドを行うとこのままではエラーが発生します.
https://github.com/tensorflow/tensorflow/issues/45434
エラーを回避するために,まずは以下のコマンドを実行しgsedをARMアーキテクチャでインストールします.
$ brew install gsed
gsedのインストールが完了した後,tensorflow/tensorflow/tools/pip_package/build_pip_package.sh
内219行目, 222行目の"sed"を"gsed"に置き換えます.
219行目:
sed -i'.original' -e 's/.python.keras.api._v1/tensorflow/g' ${TMPDIR}/tensorflow/__init__.py
222行目:
sed -i'.original' -e 's/.python.keras.api._v2/tensorflow/g' ${TMPDIR}/tensorflow/__init__.py
上記の修正が完了した後,以下のコマンドを実行しTensorFlowをビルドします.
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
pipを用いたTensorFlowのインストール
bazelによるビルドが完了した後,以下のコマンドを実行することでTensorFlowをインストールすることができます.
今回はTensorFlowのバージョンは以下のように2.5.0でしたが,この箇所は適宜変更する必要があります.
$ pip install /tmp/tensorflow_pkg/tensorflow-2.5.0-cp38-cp38-macosx_11_0_x86_64.whl
上記の操作により,Rosetta 2環境下でPythonにTensorFlowをインストールすることができます.
Discussion