LoginSignup
11
13

More than 1 year has passed since last update.

[M1Mac]TensorFlow実行環境の構築

Last updated at Posted at 2021-10-29

はじめに(+背景)

今回の記事の内容は、タイトルの通りM1 MacTensorFlowを実行するための環境構築です。
筆者の場合はBert(Keras Bert)を使いたかったのですが、KerasのバックエンドとしてTensorFlowが動くため先ずはTensorFlowを使えるようにする必要がありました。
しかし、未だにM1 Mac上での環境構築は引っかかる点が多く今回も大変苦労しました。
四苦八苦しながらも、一通り問題なく使える環境構築が出来たので今回はそちらをこの記事にまとめます。

目次

  • 使用機器&前提条件(Pre Requirements)
    • 使用Macのスペック&OSのバージョン
  • TensorFlowをインストールするための仮想環境の構築
    • pyenvの導入
    • miniforgeの導入
    • miniforgeを利用した仮想環境の構築
  • TensorFlowのインストール
    • TensorFlow-MacOSの設置
  • その他+テスト
    • その他主要ライブラリの設置
    • MNIST Datasetを利用してモデルの訓練
    • 訓練における性能の確認、Google Colabとの比較

使用機器&前提条件(Pre Requirements)

使用Macのスペック&OSのバージョン

  • Macのスペック
    • MacBook Pro(13-inch, M1, 2020)
    • Chip: Apple M1
    • Memory: 16GB
  • OS
    • macOS Monterey: Version 12.0.1

今回は発表されたばかりのMontereyを使っています。
発表直後のOSを使うことに抵抗のある人も多いと思います。
筆者の場合はこの環境構築直前に一度初期化をしていること、Appleの公開しているドキュメントではOS RequirementsとしてmacOS 12.0+が記載されている為、このような条件下での構築となりました。

TensorFlowをインストールするための仮想環境の構築

pyenvの導入

次の項目にて再度触れますが、筆者は今回pyenvを使ってminiforgeを導入します。
pyenvについては、

1. pythonのバージョン管理が容易にできる点
2. condaとpipを併用することによるリスクの最小化の為
3. pyenvを利用したminiforgeの導入が簡単

という目的で使用することにしました。
詳しくは、下記資料などをご参考ください。
Managing Multiple Python Versions With pyenv
condaとpip:混ぜるな危険

では、導入の手順について説明していきます。
まずは、Homebrewを使ってpyenvをインストールします。
*Homebrewが未インストールという方は、下記資料などを参考にインストールして下さい。
Homebrewのインストール

$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
$ echo 'eval "$(pyenv init -)"' >> ~/.zprofile
$ source ~/.zprofile

次にpyenvを使ってpythonのインストールとバージョンの変更をします。
この記事を書いている現在では最新のバージョンは3.10.0ですが、今回は参考にした多くの資料で3.9系を使用していた為、3.9.7を使用します。

$ pyenv install 3.9.7
$ pyenv global 3.9.7

これで、pyenvのインストールからpythonのバージョン変更までが完了しました。

miniforgeの導入

次にminiforgeの導入をします。
先述した通り、pyenvを使ってインストールをします。
まずは、pyenvでインストールできるバージョンを確認します。

$ pyenv install -l
#出力
#省略
  miniforge3-4.9.2
  miniforge3-4.10
  miniforge3-4.10.1-1
  miniforge3-4.10.1-3
  miniforge3-4.10.1-5
  pypy-c-jit-latest
  pypy-dev
#省略

今回はこの中からminiforge3-4.10.1-5をインストールし有効にします。

$ pyenv install miniforge3-4.10.1-5
$ source ~/.pyenv/versions/miniforge3-4.10.1-5/bin/activate

# 出力
(base) someone@SomeonenoMacBook-Pro %

このように(base)という仮想環境に入ってる状態になれば成功です。

miniforgeを利用した仮想環境の構築

下記資料にまとまっていますが、miniforgeというのはconda-forgeをデフォルトのチャネルとして使うminicondaと考えると分かりやすいです。
なので、基本的に仮想環境の構築の際に使うコマンドは一般的なcondaコマンドとなります。
What is the difference between miniconda and miniforge?

$ conda create --name test python=3.9.7
$ conda activate test
# 出力
(test) someone@SomeonenoMacBook-Pro %

このように仮想環境名が(base)から変更されていれば成功です。
test の部分は仮想環境名なので、各々好きな名前に設定して下さい。
また、pyenvと同様にpythonのバージョンは3.9.7にします。

TensorFlowのインストール

まずは、TensorFlowの依存関係をインストールします。

$ conda install -c apple tensorflow-deps

次にTensorFlow-MacOSの本パッケージをインストールします。

$ pip install tensorflow-macos

最後にMacGPUを利用して学習スピードを上げる為、metalプラグインをインストールします。

$ pip install tensorflow-metal

インストールされているパッケージを下記同様に確認できれば成功です。

$ conda list

# 出力
# 省略
tensorflow-deps           2.6.0                         0    apple
tensorflow-estimator      2.6.0                    pypi_0    pypi
tensorflow-macos          2.6.0                    pypi_0    pypi
tensorflow-metadata       1.4.0                    pypi_0    pypi
tensorflow-metal          0.2.0                    pypi_0    pypi
# 省略

その他+テスト

その他主要ライブラリの設置

今回はとりあえず、この後のテストの為にpandasとjupyterだけを入れておきます。

$ conda install -c conda-forge -y pandas jupyter

MNIST Datasetを利用してモデルの訓練

参考文献How To Install TensorFlow on M1 Mac (The Easy Way)内で紹介されているコードを利用してテストをします。
まず、データセットをインストールしてJupyter Notebookを開きます

$ mkdir test
$ cd test
$ pip install tensorflow_datasets
$ jupyter notebook

新しいnotebookファイルを作成して下記コードを書きます。

import tensorflow as tf

print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

# 出力
Num GPUs Available:  1

%%time
import tensorflow.compat.v2 as tf 
import tensorflow_datasets as tfds 

tf.enable_v2_behavior() 

from tensorflow.python.framework.ops import disable_eager_execution 

disable_eager_execution() 
(ds_train, ds_test), ds_info = tfds.load( 
    'mnist', split=['train', 'test'], 
    shuffle_files=True, 
    as_supervised=True, 
    with_info=True, 
) 

def normalize_img(image, label):
    """Normalizes images: `uint8` -> `float32`.""" 
    return tf.cast(image, tf.float32) / 255., label 

batch_size = 128 

ds_train = ds_train.map( 
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(batch_size)
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)

ds_test = ds_test.map( 
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE) 
ds_test = ds_test.batch(batch_size) 
ds_test = ds_test.cache() 
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)

model = tf.keras.models.Sequential([ 
    tf.keras.layers.Conv2D(32, kernel_size=(3, 3),
                           activation='relu'),
    tf.keras.layers.Conv2D(64, kernel_size=(3, 3),
                           activation='relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
# tf.keras.layers.Dropout(0.25),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
# tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(10, activation='softmax') ])
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy'],
) 
model.fit(
    ds_train, epochs=12,
    validation_data=ds_test, )

訓練における性能の確認、Google Colabとの比較

上記コードを今回作成した環境で動かした場合の結果は以下の通りです。
Screen Shot 2021-10-29 at 14.18.40.png

次に、同じコードをGoogle Colab(Hardware accelerator : GPU)で動かした場合は以下の通りです。Screen Shot 2021-10-29 at 14.35.19.png

今回作成した環境: 2min 41s
Google Colab(Hardware accelerator : GPU): 4min 24s

以上でTensorFlow実行環境の構築と性能比較テストに関する記事を終えます。

参考

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13