Winsows 10 Homeでwsl2からCUDAを使う


# 環境
- Windows 10 Home
- OSビルド 20206.1000
- ubuntu 18.04
- NVIDIA Container Toolkit for Docker 19.03
- CUDA10.1

pytorchやTensorflowを使いたいのでCUDA toolkit 10.Xが必要(?)
http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/
を見た感じubuntuのバージョンは2004はCUDA11しかないっぽいので1804でやってみる

# 手順
## 準備
  - Windows 10 Insider Preview Buildをインストールしておく
  - wsl1からwsl2にしておく

私は終わっていたので省略

## windows側にGPUドライバインストール
ここからダウンロードしてインストールするだけ  
https://developer.nvidia.com/cuda/wsl/download


## Microsoft storeからubuntu 18.04インストール

```
Installing, this may take a few minutes...

Enter new UNIX username: 
New password:
Retype new password:
```
- 名前とパスワードを設定
- Windows側でWSL2か確認  

```
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         2
```


## CUDA toolkit インストール  
https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-nvidia-drivers
  
これを参考にインストール。  

- 準備

```
$ sudo apt update
$ sudo apt upgrade
```
- インストール

```
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list'
$ sudo apt update
$ sudo apt-get install -y cuda-toolkit-10-1
```



## Nvidia container toolkitインストール
```
$ curl https://get.docker.com | sh
$ 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
$ curl -s -L https://nvidia.github.io/nvidia-container-runtime/experimental/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list

$ sudo apt update

$ sudo apt-get install -y nvidia-docker2
```
- docker 起動

```
$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]
$ sudo service docker status
 * Docker is running
```

動いている様子

## docker run時のエラー

```
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: detection error: stat failed: /dev/dxg: no such file or directory\\\\n\\\"\"": unknown.
```
https://forums.developer.nvidia.com/t/stderr-nvidia-container-cli-initialization-error-driver-error-failed-to-process-request-n-unknown/128871

wslのバージョンが古い可能性がある。Windows側からwslをアップデートする。

```
wsl --update
更新をチェック中...
更新をダウンロード中...
更新をインストール中...
この変更は、次回の WSL 再起動時に有効になります。強制的に再起動するには、' wsl --shutdown ' を実行してください。
カーネル バージョン: 4.19.128
wsl --shutdown
wsl --update
更新をチェック中...
カーネルの更新を受けるには、Windows Update の「Windows の更新時に他の Microsoft 製品の更新プログラムを受け取る」設定をオンにしてください。
詳細については、 https://aka.ms/wsl2kernel.
 を参照してください
```
最初どのバージョンか把握していなかったが、4.19.128になったら上記エラーは出なくなった。

## pytorch を入れてみる
```
$ sudo docker pull pytorch/pytorch

$ sudo docker run -it --gpus all pytorch/pytorch
root@ee5e5884320e:/workspace# python
Python 3.7.7 (default, May  7 2020, 21:25:33)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
```
無事GPUを認識しているようです。

# 忘備録:Windows側のVSCodeからWSL内のContainerにアクセスできない
WSL2でDockerを使いたい場合、Docker Desktop for windowsを使うようにという情報多数あるが、GPUを使いたい場合、wsl側にNVIDIA Container Toolkitを入れる必要がある。
Windows側のVSCodeからWSL内のContainerにアクセスしContainer内の開発を行いたかった…。(できないので解決した人いればコメント下さい)

以下やったことなど。

VSCodeの以下の拡張機能をインストールした。
- Local
　- Remote - WSL
　- Remote - Container
- Remote(WSL:UBUNTU-18.04)
　- Docker

## エラー："connect EACCES /var/run/docker.sock"
![vscode1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326886/d4e509f9-073c-2634-b7be-f529039db24e.png)

これで解決  
https://docs.docker.com/engine/install/linux-postinstall/

```
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker 
```

WSLのDockerを起動しておくと、Docker拡張機能から各Containerの存在は見えるようになった。
![vscode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326886/dce81cd1-9e94-6bb5-1a63-c0b7bc444289.png)

## エラー(未解決)：Docker returned an error. Make sure the Docker daemon is running.
起動したコンテナに対してAttach Visual Studio Codeするとエラーダイアログがでる。


# 参考
- https://qiita.com/ksasaki/items/ee864abd74f95fea1efa#cuda-toolkit-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
- https://docs.nvidia.com/cuda/wsl-user-guide/index.html#getting-started
- https://github.com/microsoft/vscode-docker/wiki/Troubleshooting
- https://www.kouken-party.info/2020/06/19/wsl2%E3%81%A7cuda%E3%82%92%E4%BD%BF%E3%81%86/