M4Pro MacBook ProのGPUをTensorflowから使う

M4Proチップ搭載メモリ48GBのMacBook Proを買いました。これまで、機械学習をいろいろ試したく開発用にx86_64 Ubuntu + GeForce3060Tiを準備していましたが、M4ProチップはGPUハードウェアリソースが豊富なのでMacBook Proで持ち運べる開発環境を作ってみました。

今回の手順では、ゼロから設定をはじめ、TensorflowからGPUを認識できるところまで紹介しています。なお、本記事は以下のサイトを参照して書いています。

https://medium.com/@kakadechaitanya77/how-to-initialize-tensorflow-environment-on-m4-m4-pro-and-m4-max-macbook-pros-3415f8679e36

### PyTorchを使う手順はコチラ

https://qiita.com/xtrizeShino/items/abe5b9caaadecbd1efd6

## Homebrewをインストールする

まず、macOS上のパッケージを管理できるHomebrewをインストールします。[Homebrew](https://brew.sh/ja/)のサイトにアクセスし、トップページにあるインストールスクリプトを実行すればOK。

![スクリーンショット 2024-11-14 0.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/498a2d4c-cc97-ffd7-3780-cf34c46412af.png)

```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Homebrewをインストールします
$ echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/hoge/.zprofile
# 環境変数が通るように.zprofileに追記します
$ . ~/.zprofile
# .zprofileを読み込みます
```

これで、パッケージマネージャーの準備ができました。

## Anacondaをインストールする

次にPythonの仮想環境を管理するためのAnacondaをインストールします。Pythonの仮想環境とは、Pythonスクリプトを実行するときに、どのパッケージに依存していてるか、どのバージョンのPythonを実行するか、をまとめた箱をイメージしてみてください。

[Anaconda](https://www.anaconda.com/download)のサイトにアクセスします。サクッとインストールしたいので、ここでは`Skip registration`をクリック。

![2024-11-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/612209ec-9d04-edc3-6cd5-aeabb6053b88.png)

M4 Proはnot-Intelなので、`64bit(Apple sillicon) Graphical Installer`版をダウンロードしてください。

![2024-11-13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/a47046a4-5450-ad3f-ac10-fa726db0a1a8.png)

ダウンロードしたパッケージをインストールします。

![スクリーンショット 2024-11-14 0.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6ba5e1a3-196a-6eec-bf27-5bd06ed078a1.png)

![スクリーンショット 2024-11-14 0.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/e078fa6f-434f-556d-05e4-d404e31164f6.png)

これでAnacondaのインストールができました。ただこのままだとターミナルから使えないので、有効化を行います。次の手順を実行しましょう。

### Anacondaを有効化する

macOSのターミナルは基本的にzshと呼ばれるシェルが動いています。zshを選択して`conda init`を実行します。またターミナル開始時に自動的にcondaが有効になるように`conda config --set auto_activate_base true`も実行しておきましょう。

```bash
$ /opt/anaconda3/bin/conda init zsh
# zsh(Mac標準のシェル)でcondaを有効にします
$ source ~/.zshrc
# 設定を読み込みなおします
$ conda config --set auto_activate_base true
# 起動時、自動的にcondaが有効になるよう設定します
```

![スクリーンショット 2024-11-14 0.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/8009c0a7-664e-747a-f476-39e8476c9554.png)

ターミナルを再起動して`(base)`と出ればAnaconda読み込めています。

![スクリーンショット 2024-11-14 0.10.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/d3aaa637-db49-59ce-c800-6fc8306d966c.png)

## Miniforgeをインストトールする

続いて、PythonとPython周りのパッケージを管理できるMiniforgeをインストトールします。まず、[Miniforge](https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh)をダウンロードしましょう。`~/Download`ディレクトリに保存されますので、インストール後、下記のコマンドでインストールします。

```bash
$ chmod +x ~/Download/Miniforge3-MacOSX-arm64.sh
# インストールスクリプトに実行権限を付与します
$ ~/Download/Miniforge3-MacOSX-arm64.sh
# インストールします
$ source ~/miniforge3/bin/activate
# Miniforgeを読み込みます
```

その後、ターミナルを再起動します。

## Tensorflowをインストールする

それではいよいよ、Tensorflowをインストールします。まず、Pythonを実行するための仮想環境を作成し、その中に入ります。下記の例では`macgpubox`という名前の仮想環境を作成しています。ログイン後に`(macgpubox)`と表示されればOKです。

```bash
$ mkdir macgpubox
$ cd ./macgpubox
# 作業ディレクトリを作成します
$ conda create --prefix ./env python=3.8
# Python3.8ベースの仮想環境「env」を作成します
$ conda activate ./env
# 仮想環境にログインします
```

続いてTensorflowと科学技術系のパッケージを次の順番でインストールします。

- `apple tensorflow-deps` apple silliconでPythonを実行するためのパッケージ
- `tensorflow-macos` macOS上でTensorflowを実行するためのパッケージ
- `tensorflow-metal` macOSのCPU/GPUを管理するAPIを叩くパッケージ
- その他：よく使われる科学技術系のパッケージ

```bash
$ conda install -c apple tensorflow-deps
$ python -m pip install tensorflow-macos
$ python -m pip install tensorflow-metal
$ conda install jupyter pandas numpy matplotlib scikit-learn
```

## TensorflowからGPUへアクセスする

以上でMacBook ProのGPUにアクセスする準備ができましたので、早速サンプルコードを実行してみましょう。サンプルコードは以下の通りです。`tf.config.list_physical_devices()`で利用可能なハードウェアリソースを参照します。

```python
$ vi test.py
import numpy as np
import pandas as pd
import sklearn
import tensorflow as tf
import matplotlib.pyplot as plt

# Check for TensorFlow GPU access
print(f"TensorFlow has access to the following devices:\n{tf.config.list_physical_devices()}")

# See TensorFlow version
print(f"TensorFlow version: {tf.__version__}")
```

実行結果は以下の通り！MacBook ProのGPUが見えましたね！

```python
$ python test.py
TensorFlow has access to the following devices:
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
TensorFlow version: 2.13.0
```

これで外出先でも楽々GPUを使ったPythonコードを実装できそうです。