M1 Macで機械学習ってNVIDIA GPUと比べてどうなの? Tensorflow_macosの環境構築(Miniconda使用)

スポンサーリンク
Tensorflow_macos

自前のPCで機械学習しようとするとPC環境はNVIDIA GPU搭載の一択状態で、OSはWindowsかLinuxになると思います。(2022年4月現在)

ただ、Apple社も機械学習には力を入れてきており、M1チップではGPUとニューラルエンジンを一体化してサードパーティ製GPUを排除し、ソフト面でもM1チップに最適化されたTensorflow_macosを打ち出してきました。

これにより、機械学習分野におけるNVIDIA GPUの牙城を崩せるのか?が気になるところですよね。

本記事では、Miniconda環境をベースに、M1チップ用に最適化されたTensorflow_macos環境を構築する方法を紹介します。

また、初代M1搭載の13-inch MacBook ProとM1 Pro搭載の14-inch MacBook Proを使用し、MNISTの機械学習を実行して、NVIDIA GPU搭載マシンと実行時間を比較しました。

M1用に最適化したTensorflow_macosで、Macでの機械学習の道が開かれるかと期待していたのですが、NVIDIA GPUの性能には及ばす、やはり機械学習分野がNVIDIA GPUの独壇場であることについては、いまだ覆らないと思いました。

2022年4月現在、AnacondaがM1に未対応のため、M1に対応したMinicondaを使用します。

本記事の内容は以下の動画にも収めていますので参考にしてください。

使用環境

12
PCMacBook Pro 13-inch 2020MacBook Pro 14-inch 2021
OSmacOS Monterey 12.3macOS Monterey 12.3
CPUM1 8-Core CPU(4 performance, 4 efficiency)M1 Pro 10-Core(8 performance, 2 efficiency)
GPUM1 8-Core GPUM1 Pro 16-Core GPU

環境構築

Minicondaインストール

wget(Webからファイルをダウンロード)をインストールしていない場合は以下のコマンドでインストールします。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install wget

xcode-selectをインストールします。

xcode-select --install

MinicondaのGitHubから、ファイル名にarm64の付いたM1 Mac用のインストーラをダウンロードします。

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh

以降の処理で、Minicondaがデフォルトの場所($HOME/miniforge3)にインストールされていることを前提にしています。

別のディレクトrにインストールした場合は、以降で使用するinstall_M1_tf_macos.sh中のファイルパスを修正する必要がありますのでご注意ください。

~/.zshrcに自動的にMiniconda用の設定が追記されるので、sourceして有効にします。

source ~/.zshrc

Python 3.8を指定したtfという仮想環境を作成し、アクティベートします。

conda create -n tf python=3.8
conda activate tf

Tensorflow_macos環境構築

インストール用シェルスクリプトとMNIST実行ファイルをダウンロードします。

git clone https://github.com/tak6uch1/cuda-tensorflow.git
cd cuda-tensorflow

GitHubリポジトリ名にcudaが入っていますが、この記事ではCUDAは関係ありません。

他のマシン用のインストールスクリプト等もまとめて登録しているリポジトリのため、このような名称にしてあります。

Tensorflow_macosをインストールします。

./install_M1_tf_macos.sh

Tensorflowバージョンを確認します。

python
>>> import tensorflow as tf
>>> print(tf.__version__)
'2.4.0-rc0'
>>> exit()

上記のように-rc0が付いたバージョンになっていれば大丈夫です。

動作確認

MNISTの実行確認をします。

cd work
time python mnist_cnn_M1.py

mnist_cnn_M1.py中の以下の部分は、any(おまかせ), cpu(CPUのみ), gpu(GPUのみ)の3つを指定できます。

mlcompute.set_mlc_device(device_name="any")

私の試行では、anyとcpuは同様でCPUのみが使われ、gpuを指定した場合にアクティビティモニターでGPUの使用が確認できました。

まとめ

M1 Mac用に最適化されたTensorflow_macos環境を立ち上げ、MNISTサンプルを実行することに成功しました。

device_name="any"を指定するとCPU/GPU/ニューラルエンジンが最適に使用され、最も高速になることを期待していたのですが、anyの場合においてもCPUのみが使われ、gpuを指定した場合に実行時間が短くなりました。

アクティビティモニターでCPUとGPUの使用率は確認できましたが、ニューラルエンジンの使用率を確認する方法はわかりませんでした。

ニューラルエンジンがTensorflow_macosにおいて使われているのかどうかは不明です。

今はまだ使われていないということであれば、今後の躍進に期待が持てます。

ニューラルエンジンの使用率が確認できるアクティビティモニターがほしいですね。

こちらの記事に他のマシンとの実行時間の比較を載せており、NVIDIA GeForce RTX3060の実行時間と比べてM1 MacBook 13-inch 2020は4倍程度遅く、M1 Pro MacBook Pro 14-inch 2021は2倍以上遅いという結果でした。

RTX3090は、この中で圧倒的に高速でした。

ML Execution Time

M1用に最適化したTensorflowを開発して、ソフト面の環境を整えたことは評価に値します。

M1 MacはIntel CPU時代のMacより、はるかに高速に機械学習できるようになりました。

しかし、32コアGPU搭載のM1 Maxで試したとしても、上記16コアGPUの結果の半分の実行時間にはならないと予想され、RTX3060には及ばない結果になると推測します。

MNISTの学習パラメータは短時間で終わるものとなっているため、演算量の多い学習をさせると結果が変わることが予想されます。

M1はチップ内にCPUとGPUがあり、CPU-GPU間のデータのやり取りは高速と考えられるため、学習自体の演算量が少なく、データ転送が頻繁に発生する今回の評価は、M1に有利に働いているはずです。

重い学習をさせる場合、学習の演算量が多くなればなるほど、データ転送の比率は下がり、学習自体の処理能力が効いてきて、よりNVIDIA GPUに有利になると考えられ、M1との差が広がることが予想されます。

処理性能に対する消費電力については比較できていないのですが、少なくとも処理性能のみで考えると、やはり機械学習分野がNVIDIA GPUの独壇場であることについて、いまだ覆らないと思いました。

書籍紹介

人気ブロガーからあげ先生のとにかく楽しいAI自作教室

実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

この本は、機械学習の仕組みを学ぶのにとても良い本だと思います。

Tensorflow/Kerasなどの既存プラットフォームを使うのではなく、基本的な仕組みを丁寧に説明し、かんたんなPythonコードで実装していく手順を紹介してくれます。

機械学習のコードがどのような処理をしているのか、想像できるようになります。

参考文献

タイトルとURLをコピーしました