LoginSignup
8
11

More than 1 year has passed since last update.

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

Posted at

対象範囲

  • 🏃‍♂️ 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ライフを。


8
11
0

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
  3. You can use dark theme
What you can do with signing up
8
11