Windows安定版のDockerでGPUを認識させる

https://qiita.com/advent-calendar/2021/thesense

本記事は the sense アドベントカレンダー2021の7日分です！

# 本記事を書くにあたった経緯

2月に Winsows Insider Preview Dev Channel で Docker に GPU を認識させました。

https://qiita.com/sanbasan/items/d0fbdf4c373d858260f8

それ以降、 Windows の更新に伴って定期的に実行環境が動かなくなり、その都度 Windows のクリーンインストールを繰り返していました。 2021/12/02 に例によって Docker エンジンが立ち上がらなくなり、クリーンインストールをかけました。その際、ついに Windows 安定版でも Docker コンテナに GPU が認識されたので手順、環境を記事にしておきます。

# 実行環境

## ハードウェア

GPU 、マザーボードあたりは動作が依存していると思います。

|  項目  |  型番  |
|  ----  |  ----  |
|  CPU  |  [Ryzen 7 5800X](https://www.amd.com/en/products/cpu/amd-ryzen-7-5800x)  |
|  メモリ  |  [CMK64GX4M2E3200C16](https://www.corsair.com/ja/ja/%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%83%BC/%E8%A3%BD%E5%93%81/%E3%83%A1%E3%83%A2%E3%83%AA/VENGEANCE-LPX/p/CMK64GX4M2E3200C16)  |
|  GPU  |  [GeForce RTX 3070 VENTUS 2X OC](https://jp.msi.com/Graphics-Card/GeForce-RTX-3070-VENTUS-2X-OC)  |
|  マザーボード  |  [B450 GAMING PLUS MAX](https://www.msi.com/Motherboard/B450-GAMING-PLUS-MAX)  |

## ソフトウェア

|  項目  |  バージョン  |
|  ----  |  ----  |
|  [BIOS](https://www.msi.com/Motherboard/B450-GAMING-PLUS-MAX/support#down-bios)  |  7B86vHA  |
|  Windows  |  21H2(22000.348)  |
|  NVIDIA グラフィックスドライバー  |  510.06  |
|  Windows Subsystems for Linux Update  |  5.10.60.1  |
|  Windows Subsystems for Linux WSLg Preview  |  1.0.26  |
|  Docker Desktop  |  4.2.0  |

# 手順

## WSL2のインストールと設定

Microsoft Store で Ubuntu 20.04 LTS をインストールします。

https://www.microsoft.com/ja-jp/p/ubuntu-2004-lts/9n6svws3rx71#activetab=pivot:overviewtab

インストール後、 Ubuntu 20.04 LTS を起動してユーザ名、パスワードの設定まで行います。

Windows の Powershell などで次を実行して「仮想マシンプラットフォーム」を有効にします。「Windows の機能の有効化または無効化」からでも有効化できます。

```powershell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

実行後再起動します。「Windows の機能の有効化または無効化」からの場合は再起動するか聞かれます。

## NVIDIA Driver のインストール

developer.nvidia.com のページから NVIDIA Driver のインストーラをダウンロードします。

https://developer.nvidia.com/cuda/wsl/download

インストーラで「高度な設定」を選んで必要なドライバ以外(一番上のチェックを外せないもの以外全部)のチェックを外さないと余計な NVIDIA のソフトウェア(サウンドドライバなど)がインストールされるので注意してください。

## Docker Desktopのインストールと設定

Docker Desktop for Windowsのインストーラをダウンロードしてきてインストールします。 winget にもあるのでそちらでも大丈夫です。

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

Docker Desktopを起動して 右上のアイコンの設定 > Resources > WSL Integration と進みます。
Enable integration with my default WSL distro のチェックボックスは初期状態でONになっています。
Enable integration with additional distros: の下にあるトグルスイッチをONにしてWSL Integratioを有効化します。この記事の手順だと Ubuntu-20.04 だけがあるはずです。

<img width="550" src="https://camo.qiitausercontent.com/5e8c584f7c49f989fc3caf4bb2d346904daee7ce/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3533373435352f64316135656433322d323737332d323935322d306362622d6339663534653836653261652e706e67">

## 動作確認

ベンチマークテストです。問題なく動けば環境構築は完了です。

```
docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all --rm -it nvcr.io/nvidia/tensorflow:21.08-tf2-py3
```

# まとめ

- Windows **安定版**で Docker が GPU を認識してくれるようになっている
- 必要な手順は基本的にこれまでと変わらない

# 参考記事

https://qiita.com/ksasaki/items/ee864abd74f95fea1efa

https://qiita.com/sanbasan/items/d0fbdf4c373d858260f8#4-docker-desktop%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

https://qiita.com/tacotacorice/items/182e5c9a9d313d46a26a#%E3%82%B9%E3%83%86%E3%83%83%E3%83%970windows-10-insider-preview-build-20150-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB