2024年4月11日木曜日

Ubuntu22.04でPytorchのDockerイメージでGPUを使う

こんばんわ。 なんだか暗号みたいですね。。。

今回の記事は誰かに何かを伝えようと言うわけではなく、自分の覚書のつもりということと、実はよくわかっていないので、すごくいい加減に書かれていますのであまり参考にしないでください。

ガレリアにUbuntuをセットアップして、NVIDIAのドライバを入れて、PytorchのDockerイメージを使って、GPUを利用した計算をしてみたいというメモです。Ubuntuのセットアップは省略です。

はじめに、ubuntu環境にNVIDIAのドライバをインストールします。

aptコマンドでインストールしたり、NVIDIAからパッケージをダウンロードする方法もあるようなのですが、「ソフトウエアとアップデート」というアプリケーションに「追加のドライバー」という項目があり、その中でインストールできるようだったのでやってみました。

インストールが終了すると、再起動を求められるので、再起動を行います。恐ろしく簡単です。以前やったときは、標準のドライバをblacklistに入れるだとか、GRUBを変更して、Kernelオプションを変更するだとかなんだか難しかった覚えがあるのですが、とても簡単でした。この後トラブルが待っているかもしれませんが。。。 

再起動を行ったら次のおまじないを唱えて、nvidia-container-toolkit のレポジトリを登録します。詳細は、NVIDIAの「Installing the NVIDIA Container Toolkit」を参照してください。

 

# 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

上記のコマンドを実行すると、/etc/apt/sources.list.d/nvidia-container-toolkit.list というファイルが、以下のような内容で作成されます。

 deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/$(ARCH) /
deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/$(ARCH) /
#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/experimental/deb/$(ARCH) /
#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/$(ARCH) /

レポジトリを追加したら、以下のコマンドを実行して、nvidia-container-toolkitをインストールします。

# apt update

# apt install nvidia-container-toolkil

 

 インストールしたら、コンテナランタイムを認識させるために以下のようにコマンドを実行します。

# sudo nvidia-ctk runtime configure --runtime=docker

以下のように表示されれば成功のようです。正しく表示されなかったときはどうすれば良いのかは分かりません。


INFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted. 

上記のように実行すると、/etc/docker/daemon.jsonが作成されます。内容は以下のようになります。うまく作成されなかった場合は手動で作成してしまって良いようです。

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

 

設定が終わったら、dockerデーモンを再起動します。

# systemctl restart docker

 

実際にDockerのイメージをpullして、dockerの中でnvidiaが利用できるかどうか確認します。まず、以下のようにコマンドを実行して、NVIDIAのGPUのドライバや、pytorchがセットアップされているイメージをpullします。

docker pull nvcr.io/nvidia/pytorch:24.03-py3

イメージの作成が終わったら、


docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:24.03-py3

として、コンテナを起動します。すると、コンテナのコマンドラインが表示されるので、そこで nvidia-smiと実行して、以下のように表示されれば、コンテナ内でGPUが利用できるようになっているようです。

 # nvidia-smi


+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 2070 ...    Off | 00000000:01:00.0  On |                  N/A |
| N/A   46C    P8              10W /  30W |     54MiB /  8192MiB |      4%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+


次に、PythonからGPUへアクセスできるかどうか確認します。


# python

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import torch

>>> print(torch.cuda.get_device_name())

NVIDIA GeForce RTX 2070 with Max-Q Design

>>> exit()


ちゃんとGeForce RTX 2070 with Max-Q Design と出てます。

あまり引っかからずにどんどんできてしまいました。トラブったりすると色々と余計な経験がが身についたりするものですが、あまりうまく行ってしまうとトラブルが起きた時に対応できないかも。。。

ubuntuを動かすまでの方が、うまくブートできなかったりして、よほど時間がかかった気がします。 


0 件のコメント:

USB Type-A Type-C 変換ケーブルを買いました

 こんばんわ 先日、Hynix Tube T31 のスティック型のSSDを購入したのですが、コネクタがType-Aです。普段Type-Aのコネクタを使っているので別に問題ないといえば問題ないのですが、Type-Cで使うこともあるかもしれません。今、こんなことを書いていてふと思い出...