LoginSignup
7

posted at

Kaggle GPU用Win11(HOME)+WSL2+nvidia-dockerの構築(2023.03.18版)

対象範囲

  • 🏃‍♂️ Win初期化された状態からスタート
  • 💻 GPUは3060(Laptop)
  • 🚩 ゴールは、ローカルでKaggle公式のDockerImageでGPUが使えるところまで

[任意]Win初期化-WindowsUpdate

  • 綺麗な状態からスタートしたい方はここからがよいかと思います。
  • Winの初期化は「設定」->「回復」->「PCをリセットする」で可能です
  • 初期化完了後はひたすらWindowsUpdate。

NVIDIA Driverのダウンロード(CUDA)

  • CUDAのバージョンはローカルとKaggleKernelをできるだけ合わせておきたいので、確認します
KaggleKernelのCUDA Versionの確認
本記事投稿時2023.03.18でのKaggleKernelのCUDA Versionは11.4です
ローカルのCUDA Versionの確認
コマンドプロンプトから "nvidia-smi" で確認します ローカルのCUDA Versionは12.0です
PS C:\Users\hoge> nvidia-smi
Sat Mar 18 12:58:39 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 528.49       Driver Version: 528.49       CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A   34C    P0    20W /  95W |      0MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

この環境ではCUDAのVersionが、ローカル12.0と先行しているため、KaggleKernelの11.4に近いバージョンでの環境構築を目指します。


※補足.NvidiaDriverとCUDAの対応表
NvidiaDriverのVersionとCUDAのVersionの対応表は以下のOfficialにあり、NvidiaDriverのVersionは慎重に選ぶ必要があります。

https://docs.nvidia.com/deploy/cuda-compatibility/
スクリーンショット 2023-03-18 134633.png

  • ダウンロードした NVIDIA Driverをポチポチインストールします。(特に設定変更は不要)
  • インストール後にローカルのCUDAのVersionが反映されている事を確認します。
    • CUDA Version: 11.6となっているので期待したVersionが入っています。
PS C:\Users\hoge> nvidia-smi
Sat Mar 18 14:01:17 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 511.79       Driver Version: 511.79       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A   38C    P0    19W /  N/A |      0MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Ubuntu-20.04のインストール

  • PowerShellを管理者権限で実行。
  • 利用可能なディストリビューションの確認
PS C:\Windows\system32> wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
 'wsl --install -d <Distro>'を使用してインストールします。

  NAME                                   FRIENDLY NAME
* Ubuntu                                 Ubuntu
  Debian                                 Debian GNU/Linux
  kali-linux                             Kali Linux Rolling
  Ubuntu-18.04                           Ubuntu 18.04 LTS
  Ubuntu-20.04                           Ubuntu 20.04 LTS
  Ubuntu-22.04                           Ubuntu 22.04 LTS
  OracleLinux_8_5                        Oracle Linux 8.5
  OracleLinux_7_9                        Oracle Linux 7.9
  SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
  openSUSE-Leap-15.4                     openSUSE Leap 15.4
  openSUSE-Tumbleweed                    openSUSE Tumbleweed
  • Ubuntu-20.04をインストール(22.04ではなく20.04である点に注意)
PS C:\Windows\system32> wsl --install -d Ubuntu-20.04
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
[=============             24.0%                           ]
  • インストール完了後に再起動
shutdown -r -t 0
  • 再起動後にインストールしたUbuntuのユーザ名/PWを設定
Ubuntu 20.04 LTS は既にインストールされています。
Ubuntu 20.04 LTS を開始しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
  • Ubuntu上からGPUが見えていることを確認
$ nvidia-smi
Sat Mar 18 15:05:49 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.52       Driver Version: 511.79       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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 Off |                  N/A |
| N/A   40C    P8     8W /  N/A |     10MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A        28      G   /Xwayland                       N/A      |
+-----------------------------------------------------------------------------+
  • メモリの割り当てを変更。
    • .wslconfigを以下のパスに作成する。
    • ファイルは、 Ubuntu上で作成することを推奨(メモ帳等から作ると文字コードやBomなどの関係から反映されない場合があります)
$ cd /mnt/c/Users/[ユーザ名]
$ vi .wslconfig
[wsl2]
memory=32GB
  • PowershellからUbuntuの再起動を行い、メモリの割り当てが反映されていることを確認
PS C:\Windows\system32> wsl -t Ubuntu-20.04
この操作を正しく終了しました。

PS C:\Windows\system32> wsl.exe
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
  • メモリの割り当てを確認する
    • このマシンの例では、元々15Gの割り当てが、31Gになっているので問題ないです
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           31Gi       326Mi        30Gi       2.0Mi       143Mi        30Gi
Swap:         8.0Gi          0B       8.0Gi
# ---------------------------------------------- #
# メモリ割り当て変更前
# ---------------------------------------------- #
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       336Mi        14Gi       2.0Mi       175Mi        14Gi
Swap:         4.0Gi       0.0Ki       4.0Gi

nvidia-docker2のインストール

  • Dockerのインストール
sudo curl https://get.docker.com | sh
  • Repositoryとgpgkeyの設定
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
  • nvidia-docker2のインストール
sudo apt-get update
sudo apt-get install -y nvidia-docker2
  • dockerの再起動
$ sudo service docker stop
 * Docker already stopped - file /var/run/docker-ssd.pid not found.
$ sudo service docker start
 * Starting Docker: docker

nvidia-docker2でのGPUの動確

  • docker上でcudaが認識できているか確認します。
$sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
  • 実行結果として、以下のようにGPU情報が出力されていれば問題ありません。
Unable to find image 'nvidia/cuda:9.0-base' locally
9.0-base: Pulling from nvidia/cuda
61e03ba1d414: Pull complete
4afb39f216bd: Pull complete
e489abdc9f90: Pull complete
999fff7bcc24: Pull complete
280cc4937d8b: Pull complete
bd4da60b84d7: Pull complete
3f54977ba563: Pull complete
c2cffbbbe321: Pull complete
Digest: sha256:c8faefab71dabdffa31dcf411bd6df072e3d9a4a54d49d46a993b4a945b9d37f
Status: Downloaded newer image for nvidia/cuda:9.0-base
Sat Mar 18 06:56:28 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.52       Driver Version: 511.79       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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 Off |                  N/A |
| N/A   38C    P8     9W /  N/A |     10MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A        22      G   /Xwayland                       N/A      |
+-----------------------------------------------------------------------------+
  • "sudo"が面倒ですので、不要で実行できるようにユーザグループに追加しておきます。
# ユーザグループがあることを確認
$ cat /etc/group | grep docker
docker:x:999:

# ユーザグループに追加
$ sudo gpasswd -a [ユーザ名] docker
Adding user [ユーザ名] to group docker
# Dockerの再起動
$ sudo service docker stop
 * Stopping Docker: docker                                                                                                                                                            [ OK ]
$ sudo service docker start
 * Starting Docker: docker
# Ubuntuへログアウト/ログイン
$ exit
logout
PS C:\Windows\system32> wsl.exe

# sudoが不要になっていることを確認
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Kaggle Kernelの構築

  • kaggleのdokcer imageを取得します(40GBのDLですので結構時間かかります)
docker pull gcr.io/kaggle-gpu-images/python:latest
参考.KaggleKernelのImageの確認方法
Kaggleで利用されているdockerのimageは、以下のように公開されています。

https://console.cloud.google.com/gcr/images/kaggle-gpu-images/global/python

また、Kaggle上で使われているdockerのimageのVersionは、Kaggle上から確認ができます。


  • imageがダウンロードできていることを確認します
$ docker images
REPOSITORY                        TAG        IMAGE ID       CREATED         SIZE
gcr.io/kaggle-gpu-images/python   latest     2670d08e5aa5   3 weeks ago     40.2GB
nvidia/cuda                       9.0-base   0bedd0dfd4cb   20 months ago   152MB
  • Kaggleのimageからコンテナを構築します
    • 今回は大まかに以下の条件(オプション)で構築します
      • メモリサイズは32GB(--shm-size=32g)
      • GPUはすべて使用する(--gpus all)
      • ドライブはDドライブにマウント(-v /mnt/d/docker_work_dir/test_dir)
docker run --name testcontainer-9998 -v /mnt/d/docker_work_dir/test_dir:/work -w=/work -it --gpus all --shm-size=32g -p 9998:9998 2670d08e5aa5 jupyter notebook --no-browser --port 9998 --ip="0.0.0.0" --notebook-dir=/work --allow-root
  • 起動後に以下のようにNotebookのURLが表示されているのでブラウザアクセスし、Notebookが表示されればOKです。
[C 08:36:22.076 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://b37dfe8eb576:9998/?token=ef9d97c2ea13ce3e5b7adfcc92c7e427fe5510036544e769
     or http://127.0.0.1:9998/?token=ef9d97c2ea13ce3e5b7adfcc92c7e427fe5510036544e769

Notebook上でのGPUの動確

  • NotebookからGPUが見えていることを確認します。
!nvidia-smi
  • TorchでのGPUの動確
!pip install torch==1.13.0+cu116 torchvision==0.14.0+cu116 torchaudio==0.13.0 --extra-index-url https://download.pytorch.org/whl/cu116
参考.torchのcudaバージョン
今回の構築ではCUDAを11.6で組んでいるため、"cu116"版のTorchを入れなおします。

(pullしたKaggleのimageではCUDA11.4であるため)

その他のCUDAのバージョンは以下のTorchのオフィシャルドキュメントにあります。
https://pytorch.org/get-started/previous-versions/


  • ベンチマークの実行
    • エラー出力なく計算結果が出ていれば問題ありません。
    • また、新たにコンソールをあげておき、GPUを確認することでより安心できると思います。
import timeit
import torch
import datetime

def batched_dot_mul_sum(a, b):
    return a.mul(b).sum(-1)

def batched_dot_bmm(a, b):
    a = a.reshape(-1, 1, a.shape[-1])
    b = b.reshape(-1, b.shape[-1], 1)
    return torch.bmm(a, b).flatten(-3)

"""
    GPU
"""
GPU_ID = '0'
device = torch.device("cuda:{}".format(GPU_ID))

x = torch.randn(10000, 1024, device=device)
t0 = timeit.Timer(
stmt='batched_dot_mul_sum(x, x)',
setup='from __main__ import batched_dot_mul_sum',
globals={'x': x})
t1 = timeit.Timer(
stmt='batched_dot_bmm(x, x)',
setup='from __main__ import batched_dot_bmm',
globals={'x': x})

# Ran each twice to show difference before/after warmup
print(f'mul_sum(x, x):  {t0.timeit(100) / 100 * 1e6:>5.1f} us')
print(f'mul_sum(x, x):  {t0.timeit(100) / 100 * 1e6:>5.1f} us')
print(f'bmm(x, x):      {t1.timeit(100) / 100 * 1e6:>5.1f} us')
print(f'bmm(x, x):      {t1.timeit(100) / 100 * 1e6:>5.1f} us')
mul_sum(x, x):   32.6 us
mul_sum(x, x):   18.1 us
bmm(x, x):      27282.6 us
bmm(x, x):       22.4 us
  • また、コンテナをrunしているターミナルは、停止して、起動で問題ないです。
# 起動中のコンテナを「ctrl」+「c」で停止
[I 09:06:30.874 NotebookApp] Saving file at /Untitled.ipynb
[I 09:06:30.878 NotebookApp] Saving Untitled.ipynb
^C[I 09:18:52.857 NotebookApp] interrupted
Serving notebooks from local directory: /work
1 active kernel
Jupyter Notebook 6.5.2 is running at:
http://b37dfe8eb576:9998/?token=ef9d97c2ea13ce3e5b7adfcc92c7e427fe5510036544e769
 or http://127.0.0.1:9998/?token=ef9d97c2ea13ce3e5b7adfcc92c7e427fe5510036544e769
Shutdown this notebook server (y/[n])? y

# コンテナのIDを確認
$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                          PORTS     NAMES
b37dfe8eb576   2670d08e5aa5   "/entrypoint.sh jupy…"   44 minutes ago   Exited (0) About a minute ago             testcontainer-9998

# コンテナの起動
$ docker start b37dfe8eb576
b37dfe8eb576

🚩これにて構築完了です。それではよりよいKaggleライフを。


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7