Apple silicon M1  MAC 上で機械学習環境 (tensorflow, pytorch, jupyter)を構築する。

勢いで買って、出先用として使っていたM1 macbook air。昨年裏技？みたいな方法でpytorchとjupyterを入れて騙し騙し使っておりました。当然挙動は怪しく、バクが時に起こるのはご愛想と許していたのだけれど、tensorboardとtensorboardX（どちらも表記上は入っている）が動かないコトにキレて環境を作り直すことに。
作り直してびっくり！ここ半年の間に大分環境を良くなっておりました。
今後環境はどんどん良くなっていくので、この内容も古くなると思うのですが、現時点(2021/08)でbetterと思われる方法をメモ代わりに記しておきます。

### 0.5. 前準備
とりあえず、前提としてHomebrewは入れておいて下さい。あと定番の

````shell:zsh
xcode-select --install
````
を叩いて、xcode command line toolsを入れておいて下さい。ここまではintel macと同じです。


### 1.何はともあれMiniforge

以前はpyenvを使ってversionを管理しておりました。理由はConda的なものに関わりたくなかったからです（笑）。Anacondaなんて入れた日には、数GBの必要か不必要なのかよくわからんパッケージがついてくると聞きます。加えて、pip だけじゃなくてcondaでもパッケージが入れれるようになるので、conflictが起こることがあるようです。
ちゃんと、管理ができるような性格の細かい人なら良いのでしょうが、俺みたいな雑な性格な人には無理です。多分、気分でcondaとpipを使います。
それと、環境を切り替えるために毎回　conda activateと打たなくてなりません。これも、複数のshellを同時に使うことが多い自分には無理ですw
がこのconda activateを毎回打たなくてはいけない問題の解決策が見つかったこと、Miniforgeには本当に最小限のパッケージしか入っていないこと、加えてMiniforgeにApple silicon用のディストリビューションが存在していることが決めてとなってpyenvとバイバイして、Miniforgeをネィティブに入れることにしました。
結果これが大正解。早くこれやればよかったよ‥

まずはMiniforgeの公式サイトに行き最新版のインストローラを入手します。
https://github.com/conda-forge/miniforge
![Screen Shot 2021-08-08 at 21.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/321cce54-2434-287b-c355-27212ead463e.png)
上の画像のarm64(apple silicon)ってヤツです。
ダウンロードしたらcd でダウンロードしたディレクトリに行き

````shell:zsh
bash Miniforge3-MacOSX-arm64.sh
````
と叩きます。なんか聞かれたら答えは全てSir!yes Sir!です。ただ、最後の方で「いつもconda立ち上げちゃう？」と聞かれるので、ここだけは後のために断固反対しておいて下さいw勢いで、Sir!yes Sir!とつい答えてしまった押しに弱い諸兄はインストール後にクーリングオフするためにw

````shell:zsh
conda config --set auto_activate_base false
````
と打っておいて下さい。これで、毎回立ち上がってくるウザイc○nd○ともさよならです。

これでMiniforgeはインストール完了です。ユーザディレクトリ直下にminiforgeというフォルダが作られていることが確認できると思います。このディレクトリの階層下に入れたものは入っていきます。

### 2.必要なものを入れる。
tensorflow, pytorch, jupyterを入れていきます。
まず、適当に仮想環境を作ってその中に入ります。仮に仮想環境の名前はtest1とします。

````shell:zsh
conda create --name test1
conda activate test1
````
これでtest1 という仮想環境に入ります。試しにtest1に何が現在入っているかを確かめると‥

````shell:zsh
test1 ❯ conda list
packages in environment at /Users/satoc/miniforge3/envs/test1:
Name                    Version                   Build  Channel

~/Downloads

test1 ❯ pip list
Package    Version
---------- -------
pip        21.2.3
setuptools 51.0.0
wheel      0.36.1
````
ってな感じで本当に最低限のものしか入っていないことがわかります。これなら謎に数GBを略奪される心配もないので入れても安心ですw
いよいよtensorflow, pytorch, jupyterを入れていきます。
僕の環境の問題なのかもしれませんが、condaで入れるのかpipで入れるのか？加えて何気に入れる順番が大事な気がします。
初回はノリで全部pipでtensorflow→pytorch→jupyterの順番で入れたのですが、jupyter notebooやjupyter labを立ち上げると

````shell:zsh
zsh: killed jupyter notebook
zsh: killed jupyter lab
````
という令和のこの時代に許されないレベルの有無を言わせない力強いメッセージが出て立ち上がりませんでした。ペッシの気持ちが味わえます。俺[プロシュートの兄貴](https://dic.nicovideo.jp/a/%E3%80%8C%E3%83%96%E3%83%83%E6%AE%BA%E3%81%99%E3%80%8D%E3%81%A8%E5%BF%83%E3%81%AE%E4%B8%AD%E3%81%A7%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%AA%E3%82%89%E3%83%83%21%E3%81%9D%E3%81%AE%E6%99%82%E3%82%B9%E3%83%87%E3%81%AB%E8%A1%8C%E5%8B%95%E3%81%AF%E7%B5%82%E3%82%8F%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%82%93%E3%81%A0%E3%83%83%21)とこんなところで会えるとは思ってなかったよ‥ The Grateful Dead!

色々いじりましたが直らず。作り直した方が早いと判断して、仮想環境を作り直しました。
結論うまく行ったのは最初にjupyterだけをcondaで入れて、後はtensorflow→pytorch→tensorboardXの順番で入れると全てがうまく動きました。
具体的には以下のように叩いていきます。


````shell:test1
conda install -y jupyter
pip install tensorflow-macos
pip install tensorflow-metal
pip3 install torch torchvision torchaudio
pip instal tensorboardX
````
以上です。俺はこれでマンモーニと罵られることはなく、問題なく全てのパッケージが動きました。

### 3.さようならconda activate
上に書いたようにこのままでは、機械学習を環境を走らせるの毎回conda activate　test1と叩いて仮想環境に入らなくてはいけません。正直やってられません。が、実はこれに対して[エレガントな解法](https://janosh.dev/blog/conda-auto-env)を提示している人を発見！ありがたく使わせてもらっております。この方法を使うとcd でenv(ironment).y(a)ml, requirements.y(a)mlのどれかの名前の.ymlファイルがあるディレクトリに入ると自動でtest1環境に入れるのです。マジで便利です。以下ymlファイルの名前をenvironment.ymlとして、やり方をメモっておきます。
まずtest1設定環境の設定をenvironment.ymlに書き出します。


````shell:zsh
conda activate test1
conda env export > environment.yml
````
できたenvironment.ymlを対象ディレクトリ（移動したらtest1が自動的に立ち上がった欲しいディレクトリ）に移動させます。

このあと一番シンプルなのは、
[リンク先](https://janosh.dev/blog/conda-auto-env)のスクリプトをマルっとコピーして、.zshrcまたは.zprofile に書き込むことです。

俺は、もうちょいスッキリさせたかったので、もう一つの方法を取りました。
まず、適当な場所（俺はリンク先に従って~/scripts/フォルダを作りました）にconda_auto_env.shファイルを作ります。内容は上記のリンク先のスクリプトの内容です。

````shell:zsh
chomd u+x  conda_auto_env.sh
````
で実行権限を変更するのを忘れずに。
次にシンボリックリンクを作ります。以下のコマンドを叩けば良いです。

````shell:zsh
ln -s ~/scripts/conda_auto_env.sh /usr/local/bin
````
これで/usr/local/bin（zshが立ち上がった時に参照するディレクトリ）に、~/scripts/conda_auto_env.shに飛べやオラァというリンクができます。

最後に.zshrcに

````shell:.zshrc
source conda_auto_env.sh
````
と追記すると、上記の魔法が実行されます。
これはマジ便利です。もう全ての環境でpyenvを窓から投げ捨てる時期なのかもわからんね‥

- 参考にさせて頂いた神サイト

- https://github.com/jeffheaton/t81_558_deep_learning/blob/master/install/tensorflow-install-mac-metal-jul-2021.ipynb
- https://janosh.dev/blog/conda-auto-env
- http://blog.wafrat.com/installing-tensorflow-2-5-and-jupyter-lab-on-m1/