DockerでGPUを活用する方法

Step-by-Step Guide to Leveraging GPU Power within Docker Containers

* 本ページはプロモーションが含まれています

TL;DR 

Docker コンテナ内で GPU(nvidia) を使用したいという要望に応えるため、GPU 対応の Docker 設定を行う必要がある。

通常、Docker コンテナはホストの GPU リソースにアクセスできない。これは、Docker がホストの GPU デバイスをコンテナにパススルーしないからであり、GPU ドライバと CUDA ライブラリがホストとコンテナの間で適切に共有されていないのが原因である。
これを解消するには、nvidia-container-toolkit などのツールで GPU リソースをコンテナにパススルーする必要がある。

GPU確認 

Docker を GPU 対応にする前に、PC の GPU を確認する。

$ lspci -k | grep -i nvidia
65:00.0 VGA compatible controller: NVIDIA Corporation GA104GL [RTX A4000] (rev a1)
	Subsystem: NVIDIA Corporation Device 14ad
	Kernel driver in use: nvidia
	Kernel modules: nouveau, nvidia_drm, nvidia
65:00.1 Audio device: NVIDIA Corporation GA104 High Definition Audio Controller (rev a1)
	Subsystem: NVIDIA Corporation Device 14ad

nvidia toolkitインストール 

Debian 

$ 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/stable/deb/nvidia-container-toolkit.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 update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker

CentOS7 

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://nvidia.github.io/nvidia-docker/centos7/nvidia-docker.repo
$ sudo yum install -y nvidia-container-toolkit
$ sudo systemctl restart docker

AlmaLinux8 

$ sudo dnf config-manager --add-repo https://nvidia.github.io/nvidia-docker/almalinux8/nvidia-docker.repo
$ sudo dnf clean expire-cache
$ sudo dnf install -y nvidia-container-toolkit
$ sudo systemctl restart docker

DockerでのGPU利用方法 

Dockerコマンド 

GPU を使用する Docker コンテナを実行するには、--gpus フラグを使用する。

$ docker run --gpus all <イメージ名>

--gpus フラグには以下のオプションがある。

  • all: 使用可能なすべての GPU を割り当てる。
  • "device=<デバイス ID>": 特定の GPU デバイスを割り当てる(例:“device=1,2”)。
  • "<GPU-UUID>": GPU の UUID に基づいて割り当てる。

docker-compose.yml 

docker-compose.yml内で利用するには、下記のようにサービス配下でデプロイを記述する。

version: "3.8"
services:
  your-service:
    image: <イメージ名>
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

サービスコンテナに 1 つの GPU デバイスが割り当てられる。
count を増やすことで、割り当てる GPU の数を変えられる。
GPU を使用するには、コンテナイメージが GPU 対応である必要があることに注意。