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 対応である必要があることに注意。