M1 MacにTensorFlowをインストールする



「生成Deep Learning」のサンプルコードを試すためにM1 MacにTensorFlowをインストールしました。
2022年5月14日の情報です。tensorflow 2.10のインストールついての補足を追加（2022年9月19日）。

https://www.oreilly.co.jp/books/9784873119205/

Appleのページにインストール方法があります。

https://developer.apple.com/metal/tensorflow-plugin/

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

上のAppleのページからMiniforge3-MacOSX-arm64.shをダウンロード（「Conda env:」をクリック）し、インストールします。

```
% chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh
% sh ~/Downloads/Miniforge3-MacOSX-arm64.sh
```

python環境をactivateします。base環境が起動します。

```
% source ~/miniforge3/bin/activate
(base) %
```

## TensorFlowのバージョンを確認する

必要なモジュールはtensorflow-deps, tensorflow-macos, tensorflow-metalの３つ。うちTensorFlowのバージョンと対応するのは最初の２つ。tensorFlow-metalはバージョンを指定せずにインストールします。

- tensorfow-deps は conda でインストールします。condaはsearchでインストール可能なバージョンを調べることができます。
```
(base) % conda search -c apple tensorflow-deps
Loading channels: done
# Name                       Version           Build  Channel             
tensorflow-deps                2.5.0               0  apple               
tensorflow-deps                2.5.0               1  apple               
tensorflow-deps                2.6.0               0  apple               
tensorflow-deps                2.7.0               0  apple               
tensorflow-deps                2.8.0               0  apple
```

- tensorflow-macosは pip でインストールします。pipはバージョン指定を空にして実行すると、エラーが出ますが、インストール可能なバージョンがわかります。
```
(base) % pip install tensorflow-macos==
ERROR: Could not find a version that satisfies the requirement tensorflow-macos== 
(from versions: 2.5.0, 2.6.0, 2.7.0, 2.8.0)
ERROR: No matching distribution found for tensorflow-macos==
```

最新の2.8.0にします。

## TensorFlow用の仮想環境を作成する

モジュールをインストールした際に環境が壊れることが多々あるので、専用の仮装環境を作成します。
仮装環境名は、TensorFlowのバージョンからtf28とします。

```
(base) % conda create -n tf28 pytho=3.9
```

作成した仮装環境に切り替えます。

```
(base) % conda deactivate
% conda activate tf28
(tf28) %
```

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

```
(tf28) % conda install -c apple tensorflow-deps==2.8.0
(tf28) % python -m pip install tensorflow-macos==2.8.0
(tf28) % python -m pip install tensorflow-metal
```

pythonを起動し、TensorFlowをimportできれば成功です。

```
(tf28) % python
Python 3.9.12 | packaged by conda-forge | (main, Mar 24 2022, 23:25:14) 
[Clang 12.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> 
```

## Jupyterlabとmatplotlibをインストールする

「生成Deep Learning」のサンプルを試すにはJupyterlabとmatplotlibが必要です。
pipでインストールします。
私が試した際は、condaでインストールすると、環境が壊れました。TensorFlowをimportできなくなりました。

```
(tf28) % python -m pip install jupyterlab
(tf28) % python -m pip install matplotlib
```

## base環境が自動で起動しないように設定する

termnalを起動するとbase環境が自動で起動します。
気になるので、自動で起動しないように設定します。

```
(tf28) % conda config --set auto_activate_base false
```

## 生成Deep Learningのサンプルを試す

サンプルコードをダウンロード（clone）し、

https://github.com/davidADSP/GDL_code/tree/tensorflow_2

ターミナルを起動し、

- ダウンロードしたフォルダへ移動
- 仮装環境を起動
- jupyter labを起動

```
% cd GDL_code
% conda activate tf28
(tf28) % jupyter lab
```

ノートブックを開いて、実行するとGPUに関するエラーが出ます。

```
2022-05-16 00:16:09.624189: I tensorflow/core/common_runtime/pluggable_device/pluggable_device
_factory.cc:305] Could not identify NUMA node of platform GPU ID0, defaulti
ng to 0. Your kernel may not have been built with NUMA support.
```

ただし、アクティビティモニターを見るとGPUが動いています。結果も出ますのでOKとします。

![スクリーンショット 2022-05-16 0.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666456/29c87e00-7979-c1d5-eeca-dd1ce621ad96.png)

## （補足1）tensorflow 2.10をインストールする

同じ方法で問題なくインストールできました。
まず仮想環境を作成します。名前はtf210とします。

```
% conda create -n tf210 pytho=3.9
% conda activate tf210
(tf210) %
```

tennsorflowをインストール

```
(tf210) % conda install -c apple tensorflow-deps==2.10.0
(tf210) % python -m pip install tensorflow-macos==2.810.0
(tf210) % python -m pip install tensorflow-metal
```
jupyterlabとmatplotlibをインストール

```
(tf210) % python -m pip install jupyterlab
(tf210) % python -m pip install matplotlib
```

## （補足2）pythonのバージョンを上げる

pythonのバージョンを上げたいときはconda createで新しく仮想環境を作成すれば良いです。
miniforgeをインストールし直す必要はありません。

```
% conda create -n test python=3.9
```
とすれば、3.9.xのxの部分が最新のバージョンがインストールされます。5月に2.8をインストールしたときはpython 3.9.12でしたが、先ほど2.10をインストールしたときは3.9.13に上がっていました。

その他の指定もできます。
3.9.xのx（マイクロバージョン）を指定することも可能。
```
% conda create -n test python=3.9.13  # 3.9.xのx（マイクロバージョン）
% conda create -n test python=3.10    # 異なるマイナーバージョン
```