Rosetta 2環境下におけるPythonへのTensorFlowの導入

3 min read読了の目安(約3200字

モチベーション

機械学習は大量のデータの特徴を学習することで未知のデータの結果を予測するルール(モデル)を作成する技術です.研究開発が非常に盛んに行われており,顔認識や自動翻訳などさまざまな分野で活躍しています.

プログラミング言語である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行目:

tensorflow/tensorflow/tools/pip_package/build_pip_package.sh
sed -i'.original' -e 's/.python.keras.api._v1/tensorflow/g' ${TMPDIR}/tensorflow/__init__.py

222行目:

tensorflow/tensorflow/tools/pip_package/build_pip_package.sh
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をインストールすることができます.