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

スポンサーリンク
Tensorflow_macos

(2023/2/11追記)以前の手順では動かなくなっていることに気づき、Tensorflow-macos環境構築のコマンドを一新しました。

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

ただ、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を使用します。

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

使用環境

項目内容
PCMacBook Pro 13-inch 2020
OSmacOS Monterey 12.6.1
CPUM1 8-Core CPU(4 performance, 4 efficiency)
GPUM1 8-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のサイトから、ファイル名にarm64の付いたM1 Mac用のインストーラをダウンロードします。

Miniconda Download
bash ~/Downloads/Miniconda3-latest-MacOSX-arm64.sh

インストール先の確認はそのままEnterとすると~/miniconda3にインストールされます。

それ以外で入力待ちになった場合はyesを選ぶことで良いです。

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

source ~/.zshrc

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

conda create -n tf python=3.9
conda activate tf

Tensorflow_macos環境構築

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

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

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

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

Tensorflow-macosとよく使うパッケージをインストールします。

conda install -c apple tensorflow-deps
pip install tensorflow-macos
pip install tensorflow-metal
conda install notebook
pip install numpy --upgrade
pip install pandas --upgrade
pip install matplotlib --upgrade
pip install scikit-learn --upgrade
pip install scipy --upgrade
pip install plotly --upgrade

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

python tf_version.py 

以下のように表示されます。

Python Platform: macOS-12.6.1-arm64-arm-64bit
Tensor Flow Version: 2.11.0
Keras Version: 2.11.0

Python 3.9.16 (main, Jan 11 2023, 10:02:19) 
[Clang 14.0.6 ]
Pandas 1.5.3
Scikit-Learn 1.2.1
SciPy 1.10.0
GPU is available

最後がGPU is availableとなっていれば、GPUが使える状態になっています。

動作確認

MNISTの実行確認をします。

cd work
time python mnist_cnn_M1.py

以下のように表示されます。(末尾のみ)

  :
Epoch 12/12
469/469 [==============================] - 9s 20ms/step - loss: 0.9024 - accuracy: 0.7420 - val_loss: 0.6935 - val_accuracy: 0.8471
python mnist_cnn_M1.py  51.63s user 23.70s system 64% cpu 1:57.09 total

アクティビティモニターでGPUの使用が確認できました。

Activity Monitor

まとめ

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

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

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

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

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

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

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

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をコピーしました