WSL2,docker,Cudaで比較的ハマらないメモ

# 動機
Windows環境でDockerのCudaコンテナを操作の練習をしたかった。
だけどいろんな所の手順書が古すぎて対応できずにしかもGPUの認識すら出来なかった為メモしておく。
（・・・[[gpus]]ってエラー文もう見飽きた)

## 更新履歴
2020/09/12 : 一部のシェルコマンドでsudoの入れ忘れ対応
2020/10/17 : 「Windowsの機能を有効化」にするコマンドの修正・追加。


# 動作環境（Insider Preview前)
- Windows 10 Pro 1903ぐらいだったかな
- Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz   2.81 GHz
- NVIDIA GeForce RTX2060
- Dockerは入っているバージョンは忘れた。
 

# Windows手順
以下の各項目を行う。
##「Windows の機能の有効化または無効化」から以下の項目をチェックが入っている事を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/53589fd7-9d8b-b497-ce93-027a0d4db4f6.png)


- 「Hyper-V」
- 「Windows Subsystem for Linux」
- 「仮想マシンプラットフォーム」

## コマンドで「Windowsの機能を有効化」を行う場合
```bash
# 「Hyper-V」の有効化
>dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestart

# 「Windows Subsystem for Linux」の有効化
>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 「仮想マシンプラットフォームのオプションコンポーネント」を有効化
>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

## wslのデフォルトバージョンを変更
なんかメッセージ来るが気にしなくていい。

```
>wsl --set-default-version 2
```

## windows 10 Insider Previewへアップデート
1. スタートメニューから「設定」を選択
2. 「更新とセキュリティ」を選択
3. 「Windows Insider Program」を選択
4. 「Devチャネル」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/21af0d7c-7041-01ea-b5e8-8fdcf5d21040.png)

    
## wslのアップデート
1. 「Windows Update の設定」から「詳細オプション」を選択。
2. 「Windowsの更新時にほかのMicrosoft製品の更新プログラムを受け取る」を有効化。
3. 「Windows Update の設定」から「更新プログラムのチェック」を行いアップデート。
4. 再起動後、以下のコマンドを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/d1433ab6-f6b3-1ea0-872f-adfc0590bd94.png)


```
>wsl --update
```
## WSL用のNvidiaのドライバーをインストール
一応wslをシャットダウンする

```
>wsl --shutdown
```

-   [Driver](https://developer.nvidia.com/cuda/wsl/download)インストール。

## Ubuntuをインストール
1. マイクロソフト・ストアを開く
2. 検索からUbuntuを検索
3. お好みのバージョンをインストールする(今回は20.04にした)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/0023c7e4-a112-fe17-2a59-df8da83207b9.png)


## WindowsのDocker設定
WSL2の項目がチェックされていると色々とうまくUbuntu上でうまく動作してくれない為外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243161/6bfba34f-da7f-751b-4179-57e80675716d.png)


# Ubuntu手順(WSL2上)
ubuntuの初期起動を済ませる。
（ユーザー名を決めるときにそのままウィンドウを閉じるとルートになるのかな？)

## CUDAドライバーをインストール
以下のスクリプトを任意の場所に保存し実行する。

```
#!/bin/sh

# gccとかのインストール
sudo apt -y install build-essential

# 以下のコードはCUDAの公式インストールを行う
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-0-local/7fa2af80.pub
sudo apt-get update -y
sudo apt-get upgrade -y

# ここだけ cuda-toolkit を選択する。
sudo apt-get install -y cuda-toolkit-11-0

# 正直ここはいるのかよくわからない。コマンド成功していないみたいなのでいらないかも。（要検証）
echo "set -x PATH /usr/local/cuda-11.0/bin \$PATH" >> .config/fish/config.fish
echo "set -x LD_LIBRARY_PATH /usr/local/cuda-11.0/lib64 \$LD_LIBRARY_PATH" >> .config/fish/config.fish
source .config/fish/config.fish
```

## CUDAの動作確認
以下のコマンドを入力し問題なく動作すればほぼ完了みたいなもの。（これすら出来なかった；；）

```
cd /usr/local/cuda/samples/4_Finance/BlackScholes
sudo make
./BlackScholes
```

## dockerのインストール
以下のスクリプトを実行

```
#!/bin/sh
# ここでdockerをインストールする
curl https://get.docker.com | sh

# マウントのエラーが出た為以下のコードで対応した。
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
```

## nvidia-container-toolkitのインストール
dockerの--gpusのオプション機能のやつかな？
以下のスクリプトを実行.

```
#!/bin/sh

sudo apt update
sudo apt upgrade

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo service docker restart

```


## 動作確認
以下のコマンドを実行しdockerにnvidiaのコンテナが実行できるかを検証する

```
>sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
```
そうすると以下のような結果が得られる。

```
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
MapSMtoCores for SM 7.5 is undefined.  Default to use 64 Cores/SM
GPU Device 0: "GeForce RTX 2060" with compute capability 7.5

> Compute 7.5 CUDA device: [GeForce RTX 2060]
30720 bodies, total time for 10 iterations: 51.151 ms
= 184.497 billion interactions per second
= 3689.949 single-precision GFLOP/s at 20 flops per interaction
```

# 所感
windows11になってWSL2のGPUドライバー安定して動作してくれてよかった。。