2022/10/09 Updated by

Docker on Windows (GPU)


[Up] Japanese English

前提条件


インストール手順

Enable NVIDIA CUDA on WSL (06/28/2022) によると、手順は次の4ステップである。
  1. Install Windows11 or Windows 10, version 21H2
  2. 手元のPCではこの条件を満たしている。

  3. Install the GPU driver
  4. ホストOSである Windows に CUDA と cuDNN ドライバをインストールする。 実際の手順の記録は 「CUDA 11.2 + cuDNN 8.1 の場合」。

    個々のコンテナに CUDA + cuDNN ドライバをインストールする必要はない。

    インストールするドライバについては、以下の情報を参考にするらしい。

  5. Install WSL
  6. enable WSL install a glibc-based distribution (Ubuntu or Debian) を行う」と記述されているが、docker のインストール時にWLS 2 はインストールされるのでいらないようだ。 ([Oct/09/2022 注記] https://learn.microsoft.com/en-us/windows/wsl/install によれば wsl --install コマンドで wslを導入できるようだ。デフォルトでは Ubuntu がインストールされるが -d オプションでdebianに変更できるとのこと。 今回はwslの設定なしで Windows Store から Ubuntu 20.04.5 LTS をインストールしてみたが wsl 関係のエラーが起きて動作しない。。)

    現時点では WSL の kernel のバージョンが古いようだ。wsl cat /proc/version の出力は以下の通り。

    nitta@gtune:/mnt/c/Users/nitta$ cat /proc/version
    Linux version 4.4.0-19041-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #1237-Microsoft Sat Sep 11 14:32:00 PST 2021
    
    5.10.43.3 以降が必要だそうだ。「Windows Update で、"Receive updates for other Microsoft products when you update Windows" をenabled にしておく」と自動的にupdateされるようだ。管理者として起動したコマンドプロンプトで "wsl --update" としても、アップデートされるそうだ。

    [個人のメモ] 以下の2通りの方法で表示される、WSL の kernel のバージョンが異なるのは何故だろう?

    [管理者として起動した「コマンドプロンプト」上で]
    C:\WINDOWS\system32>wsl cat /proc/version
    Linux version 4.4.0-19041-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #1237-Microsoft Sat Sep 11 14:32:00 PST 2021
    
    C:\WINDOWS\system32>wsl --update
    更新をチェック中...
    利用できる更新はありません。
    カーネル バージョン: 5.10.102.1
    
  7. Get started with NVIDIA CUDA

Docker Desktop を Windows10上にインストールする。

  1. docker の英語版公式サイトの Install Docker Desktop on Windows を元にインストールする。 日本語版は情報が古いので読んではいけない(少なくともSep/13/2022時点ではSystem requirements に "WSL 2 backend" の情報はない)。
  2. WSL 2 backend の Sytem requirements は以下の通り。
  3.   Windows 11 64-bit: Home / Pro / Enterprise / Education ( どれも 21H2 以降 )
      Windows 10 64-bit: Home / Pro (21H1 build 19043 以降)。Enterprise / Education (20H2 build 19042以降)
      WSL2 feature on Windows を enable する。
      WSL2 を Windows10 or Windows 11 で動かすための必要条件。
        64-bit CPU
        4GByte RAM
        BIOS レベルの hardware virtualization support.
      Linux kernel update package をダウンロードする。
    
  4. 公式サイトから Docker Desktop for Windows をダウンロードする。Docker Desktop Installer.exe
  5. ダウンロードしてきた Docker Desktop Installer.exe を実行する。
  6.   Configuration
        (x) Use WSL 2 instead of Hyper-V (recommended) <-- どちらも選択する
        (x) Add shortcut to desktop                    <-- どちらも選択する
    




  7. installが終了するとWindowsが再起動される。
  8. 「WSL 2 がインストールされていない」というメッセージが表示される。

  9. https://aka.ms/wsl2kernel の指示にしたがってカーネルを更新する。
    1. linux kernel update program package wsl_update_x64.msiをダウンロードする。
    2. wsl_update_x64.msi 実行する




  10. それから Restart ボタンをクリックする。


  11. Windows が再起動されて、dockerが起動する。もしもここでエラーが起きた場合は「Dockerを初期状態にリセットする」を選んで、もう一度 Windows を再起動する。
  12. Windows が起動すると、Docker も自動的に起動されて、チュートリアルが始まる。




















  13. docker ウィンドウの右上の歯車アイコン「設定」を選んで、WSL 2 が有効になっていることを確認する。



WSL 2 での CUDA ユーザガイド

  1. 公式の CUDA Toolkit Documentation の CUDA on WSL User Guide を参照しながら手順をすすめる。
  2. Windows 用の 「NVIDIA Windows GPU ドライバー」が、ホストOS (Windows) にインストールされていることを確認する。 ゲストOS (Linux) 用の 「NVIDIA GPU Linux ドライバー」をインストールしてはいけないので注意
  3. コマンドプロンプトから wsl.exe を実行して、WSL を起動する。
  4. 古い GPG キーを削除する。
  5.   sudo apt-key del 7fa2af80
    
  6. WSL-Ubuntu パッケージを使用して Linux x86 CUDA Toolkit をインストールする (← 推奨されている方法)
  7. CUDA WSL-Ubuntu ロカールインストーラーには NVIDIA Linux GPU ドライバが含まれていないため、UDAツールキットのみを取得してWSLにインストールできる。 (下記は cuda 11.7 の場合。他のバージョンは https://developer.nvidia.com/cuda-downloads からダウンロードする。Ubuntu-20.04 用を取ってくる。)
    wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
    sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
    wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.deb
    sudo dpkg -i cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.deb
    sudo apt-get update
    sudo apt-get -y install cuda
    
    メタパッケージを使用してインストールする方法(推奨されていない)で Linux x86 CUDA Toolkit をインストールする場合は、ドライバをインストールしないように注意すること。 CUDA Toolkit のインストール手順は、各インストーラのダウンロードページに記述されている。 しかし、"cuda", "cuda-11-7", "cuda-drivers" meta-packages under WSL 2 などはドライバを含んでいるため選択してはいけないので注意。cuda-toolkit-11-x" meta-package だけをインストールすること。

Docker 上の Ubuntu を WSL 1 から WSL 2 へ変換する。

  1. Microsoft Store から Ubuntu をインストールしたが、なぜか WSL 1 用に設定されてしまったので WSL2 用に変換する。
  2. Docker Desktop WSL 2 backend の Enabling Docker support in WSL 2 distors にしたがって以下の作業を行う。
  3. コマンドプロンプトを起動する。
  4. WSL モードを調べる。
  5. C:\Users\nitta> wsl -l -v
      NAME                   STATE           VERSION
    * Ubuntu-20.04           Stopped         1
      docker-desktop-data    Running         2
      docker-desktop         Running         2
    
  6. Ubuntu を WSL 2 へ変換する。
  7. C:\Users\nitta> wsl.exe --set-version Ubuntu-20.04  2
    変換中です。この処理には数分かかることがあります...
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    変換が完了しました。
    
  8. WSL 2 に変換されたことを確認する。
  9. C:\Users\nitta> wsl -l -v
      NAME                   STATE           VERSION
    * Ubuntu-20.04           Stopped         2
      docker-desktop-data    Running         2
      docker-desktop         Running         2
    

Docker 上にGPUを使うコンテナを用意する

  1. 公式の Installing Docker and the Docker Utility Engine for nVidia GPUs を参考にする。
  2. docker で WSL2 を有効にする。
  3. Microsoft Store で "Ubuntu 20.04.4 LTS" をインストールする。
  4. "Ubuntu 20.04.4 LTS" を起動し次の操作を行う。
  5. $ sudo apt-get update
    $ sudo apt-get install -y apt-transport-https
    $ sudo apt-get install -y ca-certificates 
    $ sudo apt-get install -y curl 
    $ sudo apt-get install -y gnupg-agent
    $ sudo apt-get install -y software-properties-common
    
  6. Docker's official GPG key を入手する
  7. $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  8. fingerprint をチェックする。
  9. $ sudo apt-key fingerprint 0EBFCD88
    
  10. stable repository をセットアップする。
  11. $ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    
  12. docker の「設定」 → "Resoruces" → "WSL Integration" → 一覧に "Ubuntu-20.04" がリストされているのでトグルスイッチを on にする。



  13. ここで "Docker Desktop" と"WSL2 の Ubuntu" を再起動する。
  14. "WSL2 の Ubuntu" にDocker Engine をインストールする。
  15. $ sudo apt-get update
    $ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    
  16. "WSL2 の Ubuntu" のDocker Engine をテストする。
  17. $ sudo docker run hello-world
    
  18. "WSL2 の Ubuntu" から、Docker を使用して GPU が利用できる環境を構築する。
  19. $ docker run --shm-size=1g \
       --ulimit memlock=-1 \
       --ulimit stack=67108864 \
       --gpus all \
       -p 8888:8888 \
       -it nvcr.io/nvidia/tensorflow:21.08-tf2-py3
    
    1行で書くと次の通り。
    docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all -p 8888:8888 -it nvcr.io/nvidia/tensorflow:21.08-tf2-py3
    
  20. "Docker Desktop" の Containers から "eager_northcutt" を選択して、"GPU 対応版 Ubuntu" を起動できる。 起動後、"Docker Desktop" の "eager_northcutt" Image を選択してから、Dockerウィンドウの右上にある "CLI" を選択すると、 Command Line Interface で shell にアクセスできる。
  21. root@22d367464908:/workspace# nvidia-smi
    Mon Sep  5 02:31:03 2022       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.65.01    Driver Version: 516.94       CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA GeForce ...  On   | 00000000:01:00.0  On |                  N/A |
    | N/A   56C    P0    27W /  N/A |    929MiB /  8192MiB |      1%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    root@22d367464908:/workspace# 
    
    
    
  22. "WSL2 の Ubuntu" からも docker にアクセスできる。
  23. nitta@galleria:~$ docker --version
    Docker version 20.10.17, build 100c701
    nitta@galleria:~$ docker version
    Client: Docker Engine - Community
     Cloud integration: v1.0.29
     Version:           20.10.17
     API version:       1.41
     Go version:        go1.17.11
     Git commit:        100c701
     Built:             Mon Jun  6 23:03:17 2022
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    
    Server: Docker Desktop
     Engine:
      Version:          20.10.17
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.17.11
      Git commit:       a89b842
      Built:            Mon Jun  6 23:01:23 2022
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.6.8
      GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
     runc:
      Version:          1.1.4
      GitCommit:        v1.1.4-0-g5fd4c4d
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    nitta@galleria:~$ docker --version
    Docker version 20.10.17, build 100c701
    nitta@galleria:~$ docker version
    Client: Docker Engine - Community
     Cloud integration: v1.0.29
     Version:           20.10.17
     API version:       1.41
     Go version:        go1.17.11
     Git commit:        100c701
     Built:             Mon Jun  6 23:03:17 2022
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    
    Server: Docker Desktop
     Engine:
      Version:          20.10.17
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.17.11
      Git commit:       a89b842
      Built:            Mon Jun  6 23:01:23 2022
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.6.8
      GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
     runc:
      Version:          1.1.4
      GitCommit:        v1.1.4-0-g5fd4c4d
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    nitta@galleria:~$ docker ps
    CONTAINER ID   IMAGE                                     COMMAND                  CREATED          STATUS          PORTS                                        NAMES
    22d367464908   nvcr.io/nvidia/tensorflow:21.08-tf2-py3   "/usr/local/bin/nvid…"   29 minutes ago   Up 26 minutes   6006/tcp, 6064/tcp, 0.0.0.0:8888->8888/tcp   eager_northcutt
    
  24. ターミナルソフト (teraterm とか cygwin とか) から ssh で接続できる。
  25. $ ssh -D 6006 nitta@localhost
    
  26. コンテナ内で venv を用いて jupyter notebook を利用する。