M1 Macに機械学習環境を最速で構築してみた (conda, jupyter notebook, tensorflow)


はじめに

M1対応のtensorflowを使うにはApple公式のGithubリポジトリ(Apple/tensorflow-macos)からパッケージをダウンロードして一つ一つインストールするなど面倒だったのですが、conda-forgeにまとまったパッケージがあったのでそれを使ってM1 MacbookにM1対応のtensorflowをjupyter上で実行できる環境を構築する方法をメモします。(1/12/2021 現在)

この記事では

  1. Jupyter Notebook上でM1対応のtensorflowを実行する簡単な方法を紹介します。
  2. 実際にM1のGPUを使って学習してみます。

目次

  1. tensorflowを実行する環境を構築する
  2. tensorflowを使ってみる
  3. 参考文献

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')

参考文献