M1Macに #TensorFlow を入れて #Jupyter 環境で動かそうとしたが、どハマりした話

:::note warn
本記事は筆者の仮想環境に対する理解が浅い時に書いたため、一部内容が不正確です。
具体的には```miniforge3```+```conda```の仮想環境でなければ```pip install tensorflow-macos```等できないことを示唆するような書き方をしていますが、**```venv```による仮想環境でもtensorflowはインストールできる**ことがわかりました。

ただし、2022/9/10現在、仮想環境でなければtensorflowでなければ入らず、scikit-learnも通常の```pip install```では入らず、dev.verisonをビルドすることが必要となりますので、MacでPython動かすときは仮想環境の中で動かすことをお勧めします。
:::

前回記事（React + FullCalendar）の進捗について書こうと考えていましたが、その前にタイトルの通りどハマりしたので、忘備録＋これから機械学習を本格化していこうと考えている方向けに記事を書いておきます。
ちなみに前回記事はこちら

https://qiita.com/watanabe-tsubasa/items/12892b4711bf1526051e

## 環境

> macOS Monterey version 12.5
><details><summary>Python, Jupyter, conda, TensorFlowは折りたたみ以下</summary>
><img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/47d2e6ee-a6c5-4f72-05ff-0016cf09c4f1.png' width = 75%>
>
>いまだに真っ白なターミナル使ってるとかドン引きなんだけど・・・とか思わないで😰
</details>  

## TensorFlowについて

世界的に有名な、Google社が開発した機械学習ライブラリです。

<a href='https://www.tensorflow.org/'><img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/9f427a8e-454e-eb83-95eb-ad702f71d99c.jpeg' width = 20%></a href>

みんな大好き```TeachableMachine```のもとですね
<a href='https://teachablemachine.withgoogle.com/'><img src= 'https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/91ab33d4-0bf5-46ac-7d5b-a1ac17c16cd1.png' width=75%></a href>

主にDNNの構築に用いられます。

一昔前はコードが非常に複雑で修得コストが高いという欠点があったようですが、バージョンアップに伴い、同様の機械学習ライブラリ```Keras```と統合されたことで使いやすくなったようです。**演算処理にGPUも利用する**ことで、高速な処理を実現しているそうです。

ちなみに```JavaScript```で実行できる、```TensorFlow.js```もあります。

### Scikit-learnとの違い

こちらも有名な機械学習ライブラリです。
<a href='https://scikit-learn.org/stable/#'><img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/38b360be-9a36-81d5-3070-807160c4a3df.png' width=20%></a href>
**クラスタリング(K-Meansなど)や回帰**のような分野で主に使われています。学習コストが低く、公式ドキュメントも豊富なので非常に使いやすいです。

### PyTorchとの違い
使ったことないです。わかる人は教えてください！！

## 手順の詳細： ライブラリ入れるだけなのに

### 0. Pyenvでのバージョン管理をされている方向け）Pyenvのパスを切る

**この記事の通り、```~/.zshrc```の中にあるPyenvの設定をコメントアウトします**

https://zenn.dev/karaage0703/articles/0ab9e654cfb0ec

Pyenv経由でインストールしたPythonの削除など、実施した方が安全なのかも知れませんが、特に実施しなくとも問題は発生しませんでした。

ターミナルで```which python```と打って、```python not found```と出れば大丈夫です。

::: note info
macOS 11以前は2系のPythonがデフォルトで入っていたため、```user/bin/python```と出るかと思いますが、12以降デフォルトのPythonは入っていません。
~~さらにMac × Python の敷居が上がっていきますね~~
:::

### 1. conda, Miniforge 仮想環境の構築

**Apple Developer 公式記事**

演算処理でGPUを使えるとのことですので、ここからインストールが望ましいと思います。

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

**解説記事**

https://qiita.com/chipmunk-star/items/90931fb5180b8024adcb

#### 1). 公式記事に従ってcondaの仮想環境を構築
<details><summary>記事で言うこの部分</summary>

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/58a47507-c638-f1c5-ca21-49388ecbe08a.png' width=75%>

</details>

**M1 Macでない方は```venv```で仮想環境構築して問題ないと思いますので、以下を実行**
```terminal
python3 -m venv ~/tensorflow-metal
source ~/tensorflow-metal/bin/activate
python -m pip install -U pip
```

:::note warn
私はM1でないMacを所持していないので、venv環境へのtensorflowインストールは試していないです
:::

**公式サイトから```Conda env```をダウンロード**
![スクリーンショット 2022-07-30 14.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/8b102d10-6ad0-9238-b206-aa2e119f786b.png)
これをクリック

**ターミナルで以下を実行**
```terminal
chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh
sh ~/Downloads/Miniforge3-MacOSX-arm64.sh
source ~/miniforge3/bin/activate
```

#### 2). conda仮想環境の中に、実行する仮想環境を作成する

:::note info
1). の手順がうまくいくと、condaの仮想環境が立ち上がるので、ターミナルが```(base)~~```といった表記に変わると思います。この中で、TensorFlowを実行しても良いのですが、今後を想定して専用の実行環境を作り、その中にインストールしていきましょう
:::

**参考記事に従って、condaの中に作っていきます**

<details><summary>記事で言うこの部分</summary>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/6a1b6588-dc96-783c-0712-dcd4f5899c0b.png' width=75%>
</details>

```terminal
conda create -n Py39 python=3.9 # Python version3.9で仮想環境を作成
conda activate Py39 # 作成した仮想環境に切り替え
```
成功していれば、写真のようにターミナルに（）書きで仮想環境名が表示されます。
![スクリーンショット 2022-07-30 14.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/22ee7ec9-6632-57da-1880-2f0f2cfc89f5.png)
~~毎回```Python39```って打つのめんどくさい。短くすればよかった~~

:::note info
```Py39```の部分は好きな名前（わかりやすいもの）でいいです。
```python=```以下でバージョンを指定できます。TensorFlowの対応状況に応じて指定してください。
:::

:::note warn
同様の手順で、local環境にTensorFlowを入れてみましたが、
```Unable to convert function return value to a Pthon type! Ther signature was () -> handle```
とのエラーメッセージが出て実行できませんでした。ですので、0.で実施したPyenvとのパスを切って仮想環境を構築することが必要となりました。
:::

### 2.TensorFlowのインストール

#### 1). 依存関係のあるライブラリのインストール

必要かはわかりませんが、念の為。**ターミナルにて仮想環境がactivateされた状態で実行していください**
```terminal
conda install numpy
conda install six
conda install matplotlib
conda install opencv
```

:::note info
今まで```Python```使っていた方でも、仮想環境にライブラリを入れ直す必要がありますので、このタイミンングで入れてしまいましょう。
私は、```pandas, matplotlib, scikit-learn, sea-born, japanize-matplotlib```を入れなおしました。
:::

#### 2). TensorFlow 及び 依存関係のあるパッケージのインストール

**ターミナル以下実行し、TensorFlowと依存関係のあるパッケージ状況を確認します。**

```terminal
conda search -c apple tensorflow-deps
```
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/346cec4e-4f6c-23d9-4ab0-6fec75b4c114.png' width=75%>

2.9.0が最新のようです

**ターミナルで以下を実行して```TensorFlow```を、インストールします。**
```terminal
conda install -c apple tensorflow-deps==2.9.0
python -m pip install tensorflow-macos # macOSのTensorFlow
python -m pip install tensorflow-metal # TensorFlowでGPUを利用するための拡張機能
```
成功しているかを確認します。Pythonを起動してTensorFlowを```import```してバージョンを確認しましょう。
バージョン確認は```import tensorflow; print(tensorflow.__version__)```

<img src = 'https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/a021132c-48a3-41ea-657e-9bb85541b97a.png' width = 75%>

一番下の行のように表示されれば成功です。
~~タイプミスには気をつけましょう。記事書いてて焦りました~~
お疲れ様でした。😊

### 3.```Jupyter```で```Conda```仮想環境の実行

機械学習する上では、やはり対話型インターフェイスが不可欠と思います。

* 前処理のところで、```pandas```を用いて対話型でデータを確認しながら整形していきたい
* 整形したデータをそのままの環境で利用していきたい
* モデル構築する中でもハイパーパラメータの調整などで、逐次出力を確認したい

このような理由ですね。

以前から```jupyter```を利用されていた方でも、仮想環境へのパスを通しておかないと、仮想環境のカーネルが使えず、せっかくインストールしたTensorFlowがjupyter上で使えませんので、以下の処理を実行していきましょう。

**参考記事**

https://sakizo-blog.com/13/

```conda activate Py39```で先ほどの仮想環境をアクティベートした上で、以下実行してください。

```terminal
pip install ipykernel
pip install jupyter
pip install jupyterlab
python -m ipykernel install --user --name=Py39 # 先ほど追加した仮想環境の名前
```
```jupyter lab```を実行して、以下のようにカーネルが選択できれば大丈夫です。
![スクリーンショット 2022-07-30 16.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/cf394639-0e7f-cacc-c776-50e42068f8bf.png)

作業は以上です。お疲れ様でした。

## 感想

ボタン一つでダウンロードできるようにしてくれ

## tips

### 仮想環境の切り替え

**開始: (base)が立ち上がる**
```terminal
conda activate
```
**指定した仮想環境の立ち上げ**
```terminal
conda activate 名前
```

**仮想環境の終了**
```terminal
conda deactivate
```

### ターミナルを立ち上げた時に仮想環境を自動で立ち上げたり、それをやめたり

condaを導入すると、ターミナルを開いた時に自動で仮想環境が立ち上がるようになります。
```React```で開発しようとした時に仮想環境立ち上がっては面倒ですよね。

```terminal
conda config --set auto_activate_base false
```
これで自動で立ち上がらなくなります。
逆に、trueにすれば自動で立ち上げられます。

その他、細々とした設定を見たいときは
```terminal
conda config --show
```
で色々見られます。

### ```conda```と```pip```の違い

https://qiita.com/toto1310/items/14bdbaccd53bed74715c

この記事がわかりやすかったです。