Windows 上にイケてる python（機械学習入門） 環境を構築する

いいからWindowsは窓から投げ捨てろ！！！

Windows上に機械学習関連の環境を構築するにはどうすればよいですか？と聞かれていたときのつい最近までの俺の本音ですｗ
がこれまた、環境が激変して、すげー簡単にイケてるpython環境が構築できるようになっていました。WSL2 スゲー

## WSL2 の導入
まずは以下のサイトを参考にWSL2を導入します。
https://softantenna.com/blog/how-to-setup-wsl2-wndows-11/
https://chigusa-web.com/blog/wsl2-win11/

ちなみにwindows 11だと大丈夫か？と不安になるくらい簡単です。
管理者権限で power shellを立ち上げて

```winndows powershell
wsl --install
```

と打つだけです。

あとは上記のブログの記事に従ってWSL2でいろいろいじってみてください。

この後は基本的にubuntuを使うのでpower shellが立ち上がった時に設定からubuntuが立ち上がるように変更するとよい感じです。
![スクリーンショット 2022-08-16 164848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/33cd4fe8-fbec-c74d-6186-3349ed9e1ef5.png)
![スクリーンショット 2022-08-16 165135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/56afd63f-df70-e195-456c-3c9ed2106814.png)

## zsh とprezto の導入
Ubuntuのシェルはこの状態だとbashになっています。
シェルってのはPCの（ほぼ）中心のカーネルの外側にあるshell（殻）という意味です。この殻を経由でカーネルさんに色々お願いをします（例どうにかpythonを動かしては貰えませんでしょうか？）このシェルにはbashやらzshやらpower shellやら方言があります。linuxのデフォルト言語はbashで別にこれでもよいのですが、zshの方がより便利で使いやすいのでこっちに変更するのを推奨します。
参考サイト
https://zenn.dev/moroya/articles/0ab24a733e4b7a

zshの導入の方法は
```bash
sudo apt update
sudo apt upgrade

sudo apt install zsh
```

これでzshが入ります。

続いて　preztoを入れます。zshの見た感じを良くしてくれた上にいろいろ便利機能（補完とかをやってくれる）をいれたパッケージです。
入れ方は公式のコマンドをコピーしてターミナルで走らせればよいだけです。

```zsh
zsh #zsh立ち上げ

# preztoをインストール
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

# preztoのセットアップ
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# デフォルトシェルをzshに変更
chsh -s /bin/zsh

# power shell 再起動
```

これでデフォルトがprezto入りのzshに変わっています。
この結果power shellがおしゃれになっていると思いますww
![スクリーンショット 2022-08-16 170623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/fffe449d-81f2-2e06-a1d9-a13e5016a563.png)

## オプションその１　ICEBERGを入れてさらに見やすくする
ここはやらんでもよいのです。ただ、個人的にほかの環境でも似たようなことをやっているのです。やり方は下記を参照。
https://www.lisz-works.com/entry/wt-color-scheme
https://www.lisz-works.com/entry/windowsterminal-tmux-vim-colors
vimへの入れ方
https://note.com/nanigashi/n/n26b295b052f6

# オプションその2 Prezto のプロンプトをpureにして補完とシンタックスハイライトを入れる
これもオプションです。ただ、補完とシンタックスハイライトは入れた方が便利なので、オプション１よりも優先度は高いかも。
参考
https://qiita.com/kinchiki/items/57e9391128d07819c321
上記の記事の
「あとは~/.zpreztorcのプロンプトのテーマをpureにするだけです。:prezto:module:prompt で検索して、プロンプトの設定場所を探してください」
以下に従うと幸せになれます。
mac用の記事ですがやり方は一緒です。

## pythonの導入
ここまでくればあとはpythonをいれるだけです。
色々方法はありあすが、一番簡単のは

```zsh
sudo apt-get install python3
```
と打ち込むことです。参考
https://docs.aws.amazon.com/ja_jp/parallelcluster/latest/ug/install-linux-python.html
ただ、今後のことを考えるとpythonの仮想環境を入れてversion切り替えができるのが便利そうです
そこで、M1 macでも導入したminiforgeを使って仮想環境の導入(python のversionの切り替え）ができるようにします。何でこんなことをやるのかというと、使いたいpythonのpackageが特定のversionのpackageの組み合わせじゃないとうごかないこと(tensor-flow federatedお前のことだぞ。公式のcolabが動かんとか意味がわからん）があるからです。
以下以前書いたM1 macの記事とかなりかぶりますが流れを書いておきます。

## 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)
上の画像のMiniforge3-Linux-x86_64ってヤツです。
ダウンロードしたらcd でダウンロードしたディレクトリに行き

````shell:zsh
bash Miniforge3-Linux-x86_64.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とします。pythonのversionは3.9です。2022年8月現在だと3.9が安パイです。tensorflowだと3.10が必要だった気がします。

````shell:zsh
 conda create -n test1 python==3.9
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
いよいよpandas,skleran, jupyter,jupyter-lab(ちょっと便利なjupyter) を入れていきます。


````shell:test1
conda install pandas
conda install scikit-learn
conda install jupyter
conda install jupyterlab

conda install pandas scikit-learn jupyter jupyterlab #上記のスクリプトを一気にやる。めんどくさがり用

````
以上です。俺はこれでマンモーニと罵られることはなく、問題なく全てのパッケージが動きました。
conda で仮想環境を作る場合packageの入れ方は大きくわけてcondaとpipの２種類があります。
色々な説がありますが、俺は基本condaで入れてうごかねーとか、ないときにpipを今は使っています（ガチ勢の方怒らないで）。これが正しいのかわからんのですが今のところ問題が起こる率が少ない気がしています（conflictはcondaでいれたpackage間では基本起こらないはずなので）。正しい方法を知る識者の意見を求めていおります。

## jupyter 立ち上がらない問題の解決
それでは夢と希望をもってコンソールに
````shell:test1
jupyter notebook
jupyter lab #labを使いたい人はこっち
````
と打ってみてください。はいjupyer が自動でたちがりませんねw
これはなにが起こっているかというと、WSLを経由しない等の別の方法でpythonをいれた場合は自動でデフォルトのブラウザ上にjupyter で走ります。が、WSLを使った場合はこの起動が自動でおこりません。
参考サイト
https://qiita.com/yusuke_konishi/items/0e1a136a6c9331290986
実は裏でちゃんと走っているのでいちいちurlを打てばよいのです。が、そんなことめんどくさくてやってられません。
ので、以下の手順で解決します。以下はjupyter notebookでの例です。labも基本は一緒です。
##### 1.jupyter の設定ファイルを作る。
##### 2.作ったjupyter の設定ファイルを書き換える。
です。順番に説明します。

##### 1.jupyter の設定ファイルを作る。
まずターミナルで
```zsh
jupyter notebook --generate-config
```
と打ってください。
こうすることでjupyterの設定ファイルができます。
場所はhome/ユーザー名/.jupyter/jupyter_notebook_config.py
です。俺の場合を晒すとしたの様な感じになります。
![スクリーンショット 2022-08-17 122056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/73f5aab5-2b39-cb6a-7342-61ee264d3a6d.png)
俺の場合はlabの設定ファイルも作っているのでlabのやつもありますが、上記のコマンド打っただけだとjupyter_notebook_config.pyしかできていないはずです。
次にこれを書き換えていきます。

##### 2.作ったjupyter の設定ファイルを書き換える。
こういうときプロはvimを使いがちですが、正直覚えなくてはいけないことが多すぎていきなりだと使いづらいです。
ので、慣れてないうちはvs codeとかで開く方が簡単です。要はの設定ファイルを書き換えればよいだけのです。以下はvscodeで開く場合のスクショです。
![スクリーンショット 2022-08-17 122927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/fca9baf4-3b32-5d9c-5007-a36c531b91f8.png)
ファイル右クリックがドラッグアンドドロップをしてください。
別にvscodeでなくてもよいですが、激しい宗教戦争の結果現在vscodeがほぼ一強の世界になっています。今後のことを入れておくと入れておくのが無難かと思います。
次にvscode上でuse_redirect_fileという文字列を検索してください。
そうすと下記のような感じでヒットします。
この#c.NotebookApp.use_redirect_file = True
ってところを
![スクリーンショット 2022-08-17 150033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/07e5b8c4-1806-f86d-f86a-e8e3fa802030.png)

c.NotebookApp.use_redirect_file = False
に書き直してください。
![スクリーンショット 2022-08-17 150104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194156/fcff6e14-7d04-1575-c437-420d5d2b283d.png)

python の場合だと#が先頭についているとコメントアウトとされます。つまり#が打った後は機械に話しかけているわけではなく、プログラマが独り言をつぶやいているわけですｗ
上記の操作は独り言を変更して機械への命令に変更した上で、設定を逆にしていということになります。これでコンソールで

````shell:test1
jupyter notebook
````
とたたけばjupyter notebookが立ち上がるはずです。labも同じながれできます。
余裕があったらやってみてください。

### 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/


### 4.GPUをつかう
WSL２上でGPUを使うためのwork flowwも書いておきます。
基本的には公式様のいう通りにしておけば大丈夫です。
https://docs.nvidia.com/cuda/wsl-user-guide/index.html#getting-started-with-cuda-on-wsl

注意点としては
1.NVIDAのGPU driverはWindows上だけにいれこと(**WSL側には入れない
2.CUDAはOption 1: Installation of Linux x86 CUDA Toolkit using WSL-Ubuntu Package - Recommendedでいれる。https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local
3.Ubuntu22.04で入れるとcuda12なってしまうがこれは良いのか？(pytorch11.8まで動いているはっぽいが）
4.nvcc -V が効かないのはPATHとライブラリがとおっていないから。https://qiita.com/Soleiyu/items/2b379da52c56aaa68c0c
.zshrcに
````
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
````
を追記しておく。