Docker +NVIDIA countainer toolkit 環境でCUDA tool kit nbody によるGPUストレステスト

## 概要
今流行りのdocker + nvidia container toolkit を用いてGPUの負荷テストが手軽にできないか検証しました。

## ハードウェア構成
- Geforce 
 
## ソフトウェア構成
- OS : Ubuntu22.04.1LTS
- Nvidia Driver:525.85.05インストール済

## dockerインストール
公式ドキュメントに従ってインストールします。
https://docs.docker.com/engine/install/ubuntu/
```
#repository追加
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

#鍵追加（と思われる）
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#追加したリポジトリからインストール
sudo apt-get update -y
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
```
インストールが終了したら、この時点で正常にdockerが起動できるか確認しておくと良いです。

```
#hello world
sudo docker run hello-world
```

## NVIDIA-container-toolkit インストール
これも公式ドキュメントを参考にインストールします。
https://catalog.ngc.nvidia.com/orgs/nvidia/teams/k8s/containers/cuda-sample
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt


```
#鍵追加
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
#リポジトリ追加
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
#追加したリポジトリからインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
```

## dockerでnbody実行
sudoで実行します。-numbodies=XXXXXXXX部分でメモリ使用量を調整します。
```
sudo docker run --rm -it nvcr.io/nvidia/k8s/cuda-sample:nbody nbody  -benchmark -numbodies=65536000

```


<!--
```
Tue Feb 14 11:48:15 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.05    Driver Version: 525.85.05    CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  Off  | 00000000:81:00.0 Off |                  N/A |
| 89%   65C    P2   349W / 350W |   9258MiB / 24576MiB |    100%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:82:00.0 Off |                  N/A |
| 65%   60C    P2   341W / 350W |   9258MiB / 24576MiB |    100%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA GeForce ...  Off  | 00000000:C1:00.0 Off |                  N/A |
| 69%   60C    P2   339W / 350W |   9258MiB / 24576MiB |    100%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      8024      C   /cuda-samples/sample             9256MiB |
|    1   N/A  N/A      7755      C   /cuda-samples/sample             9256MiB |
|    2   N/A  N/A      8283      C   /cuda-samples/sample             9256MiB |
+-----------------------------------------------------------------------------+

```
-->

## 参考

https://www.idnet.co.jp/column/page_158.html
https://qiita.com/tkusumi/items/f275f0737fb5b261a868

## 複数GPUを搭載している場合のGPU指定方法(割と悩んだ)
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html
https://cocoinit23.com/docker-run-multi-gpu/

## 検証の経緯
GPUサーバに負荷を掛けて動作するかテストする際にCUDA toolkitのnbody(https://developer.nvidia.com/cuda-toolkit) を使っています。毎回環境を構築するのがめんどくさいので一度作った環境を色々なマシンに使いまわしていたのですが、しかし当然ながらテストするハードウェアの移り変わりや相性問題などは起こります。その都度、OSやドライバやらCUDAのバージョンを管理・更新するメンテナンスが発生していました。この方法であれば気軽に試せていまのところいい感じです。