はじめに
M1対応のtensorflowを使うにはApple公式のGithubリポジトリ(Apple/tensorflow-macos)からパッケージをダウンロードして一つ一つインストールするなど面倒だったのですが、conda-forge
にまとまったパッケージがあったのでそれを使ってM1 MacbookにM1対応のtensorflowをjupyter上で実行できる環境を構築する方法をメモします。(1/12/2021 現在)
この記事では
- Jupyter Notebook上でM1対応のtensorflowを実行する簡単な方法を紹介します。
- 実際にM1のGPUを使って学習してみます。
目次
tensorflowを実行する環境を構築する
anaconda環境をインストール
まずは下のGitHubページの、OS X arm64 (Apple Silicon) Miniforge3-MacOSX-arm64を選び、Miniforgeのインストーラーをダウンロードします。
conda-forge/miniforge
ダウンロードしたMiniforge3-MacOSX-arm64.sh
を使ってターミナルからMiniforgeをインストールします。
$ bash Miniforge3-MacOSX-arm64.sh
必要なパッケージをインストール
# m1用tensorflowを含んだconda環境の作成、起動
$ conda create -n python38 tensorflow-addons tensorflow -c isuruf/label/tf -c conda-forge
$ conda activate python38
# Jupyter notebookのインストール
$ conda install -n python38 -c conda-forge notebook
$ conda install -n python38 -c anaconda ipykernel
# Jupyter Notebookに現在のpython環境をセット
$ python -m ipykernel install --user --name=python38
Jupyter notebookを起動し、pythonファイルからtensorflow
がインポートきれば成功です。
$ jupyter notebook .
import tensorflow as tf
tensorflowを使ってみる
Jupyter上でPythonファイルを作り以下のコードを実行します。
import tensorflow.compat.v2 as tf
mnist = tf.keras.datasets.mnist
import time
tf.enable_v2_behavior()
from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()
from tensorflow.python.compiler.mlcompute import mlcompute
mlcompute.set_mlc_device(device_name='gpu')
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(1024, (3,3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(512, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
start = time.perf_counter()
model.fit(x_train, y_train, epochs=5)
end = time.perf_counter()
print("Elapsed time : {0} s.".format(end-start))
model.evaluate(x_test, y_test)
20分ほどで学習が終わりました。
device_name='gpu'
とするのを忘れるとCPUが使われて遅くなってしまいます。
mlcompute.set_mlc_device(device_name='gpu')