はじめに
NVIDIA GPUを利用したVulkanのDocker環境構築方法について紹介する。VulkanはOpenGLの後継とされ、UnityやUnreal Engineで採用されている。
動作確認環境
- Ubuntu 22.04 x86_64
- NVIDIA Driver Version: 535.274.02
- CUDA Version: 12.2
- Docker 29.0.2
- nvidia-container-toolkit 1.13.5 / 1.18.0
方法
ホストPCの事前準備
ホスト環境に、NVIDIA DriverとCUDAをインストールしておく(参考)。
次に、DockerとNVIDIA Container Toolkitをインストールする。Dockerのインストールは公式の手順を、また、NVIDIA Container Toolkitは、公式の手順をそれぞれ参照してインストールする。
NVIDIA Dockerの設定をする。
sudo vi /etc/docker/daemon.json
既存の /etc/docker/daemon.json に、以下の "runtimes" セクションを追加(または編集)する。
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
上記の設定は、CUDAなどを使うには現在は不要だが、Vulkanの設定を反映させるために必要。
Dockerイメージの作成
NVIDIA公式のVulkanのDockerイメージは、Vulkan 1.3-470以降更新されていない。
新しいVulkanのバージョンを使いたい場合は、Ubuntu 22.04をベースとするか、CUDAを利用したい場合は、NVIDIA公式のCUDAのDockerイメージをベースとしてDockerfileを作成する。
ホストのCUDA環境より新しいバージョンは動作しないので、ホストのCUDA環境に応じてベースのイメージは変更すること。
例:Ubuntu 22.04+CUDA12.2+Vulkan
FROM nvidia/cuda:12.2.2-cudnn8-devel-ubuntu22.04
# CUDAが不要な場合はこちらを利用
# FROM ubuntu:22.04
# Set environment variables
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES all
# Install OpenGL development libraries
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
libglvnd-dev \
libgl1-mesa-dev \
libegl1-mesa-dev \
libgles2-mesa-dev && \
rm -rf /var/lib/apt/lists/*
# Install GUI + Vulkan dependencies missing from the dev-slim image.
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates \
libasound2 \
libglvnd0 \
libgl1 \
libglx0 \
libglib2.0-0 \
libglu1-mesa \
libgtk-3-0 \
libsm6 \
libx11-xcb1 \
libxcursor1 \
libxi6 \
libxkbcommon-x11-0 \
libxrandr2 \
libxtst6 \
libxext6 \
mesa-utils \
mesa-vulkan-drivers \
libvulkan1 \
vulkan-tools \
x11-apps \
&& rm -rf /var/lib/apt/lists/*
CMD ["/bin/bash"]
Dockerfileをビルドする。
docker build -t {image_name}:{tag_name} .
例: Ubuntu 22.04+CUDA12.2の場合
docker build -t vulkan:cuda12.2-ubuntu22.04 .
動作確認
vulkaninfoコマンドで動作確認する。
例: Ubuntu 22.04+CUDA12.2の場合
docker run --rm --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json \
vulkan:cuda12.2-ubuntu22.04 vulkaninfo | grep NVIDIA
NVIDIAのGPUが使われていることが確認できれば成功。
'DISPLAY' environment variable not set... skipping surface info
WARNING: [Loader Message] Code 0 : terminator_CreateInstance: Failed to CreateInstance in ICD 1. Skipping ICD.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
GPU id = 0 (NVIDIA GeForce RTX 2080 Ti)
GPU id = 0 (NVIDIA GeForce RTX 2080 Ti)
GPU id = 0 (NVIDIA GeForce RTX 2080 Ti)
VK_LAYER_NV_optimus (NVIDIA Optimus layer) Vulkan version 1.3.242, layer version 1:
GPU id = 0 (NVIDIA GeForce RTX 2080 Ti)
NVIDIA GeForce RTX 2080 Ti (ID: 0)
NVIDIA GeForce RTX 2080 Ti (ID: 0):
NVIDIA GeForce RTX 2080 Ti (ID: 0)
deviceName = NVIDIA GeForce RTX 2080 Ti
driverID = DRIVER_ID_NVIDIA_PROPRIETARY
driverName = NVIDIA
driverID = DRIVER_ID_NVIDIA_PROPRIETARY
driverName = NVIDIA
driverID = DRIVER_ID_NVIDIA_PROPRIETARY
driverName = NVIDIA
driverID = DRIVER_ID_NVIDIA_PROPRIETARY
driverName = NVIDIA
エラー、警告メッセージについて
-
'DISPLAY' environment variable not set... skipping surface info- GUIコンテナを起動するオプションを有効にすると解消される
- error: XDG_RUNTIME_DIR not set in the environment.
- X11アプリでは無視して問題ない
- Wayland を使う場合のみ必要
実際に、VulkanのアプリをDockerコンテナで利用する際は、GUIコンテナを起動するオプションを追加する(参考)。
例:
docker run -it --rm \
--runtime nvidia \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
{your_vulkan_image}:{your_vulkan_tag}
まとめ
NVIDIA GPUを利用したVulkanのDocker環境構築方法について紹介した。Vulkanを利用するアプリの環境構築の際に参考にしてほしい。
トラブルシューティング
WARNING: [Loader Message] Code 0 : terminator_CreateInstance: Failed to CreateInstance in ICD 1. Skipping ICD.
原因
NVIDIA以外のVulkanドライバが動作していない警告(無視しても問題ない)。
対策
export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.jsonをして、NVIDIAに限定することで警告は消える。
Cannot create Vulkan instance.
エラーメッセージ
Cannot create Vulkan instance.
This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU that does not support Vulkan.
ERROR at /vulkan-sdk/1.3.204.1/source/Vulkan-Tools/vulkaninfo/vulkaninfo.h:649:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER
原因
Vulkanのランタイム情報がコンテナに渡っていない。
対策
コンテナ起動時に--runtime=nvidiaを指定する。
Code 0 : loader_scanned_icd_add: Could not get 'vkCreateInstance' via 'vk_icdGetInstanceProcAddr' for ICD libGLX_nvidia.so.0 Cannot create Vulkan instance.
エラーメッセージ
ERROR: [Loader Message] Code 0 : loader_scanned_icd_add: Could not get 'vkCreateInstance' via 'vk_icdGetInstanceProcAddr' for ICD libGLX_nvidia.so.0 Cannot create Vulkan instance. This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU that does not support Vulkan. ERROR at ./vulkaninfo/vulkaninfo.h:649:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER
原因
OpenGLのライブラリが不足している。
対策
libegl1をインストールする。
- https://github.com/NVIDIA/nvidia-container-toolkit/issues/191#issuecomment-2022154630
- https://forums.developer.nvidia.com/t/minimal-docker-vulkan-offscreen-setup/242883
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libegl1 \
libxext6 \
ERROR: [Loader Message] Code 0 : loader_get_json: Failed to open JSON file /usr/share/vulkan/icd.d/nvidia_icd.json
原因
/usr/share/vulkan/icd.d/nvidia_icd.jsonがコンテナ内に存在しない(ホストPCには存在する)。
- issue
対策
--runtime=nvidiaをつけてVulkan対応のDockerイメージを起動する。
runtimeの設定がない場合は/etc/docker/daemon.jsonに追記する。
-
/etc/docker/daemon.json- 以下がない場合は追記
/etc/docker/daemon.json
{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } } - 以下が入っている場合は削除
"exec-opts": ["native.cgroupdriver=systemd"]
- 以下がない場合は追記
上記で解決しない場合は、コンテナ起動時に、ホストの/usr/share/vulkan/icd.d/nvidia_icd.jsonをコンテナ内にマウントする。
例:
docker run --rm --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-e VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json \
-v /usr/share/vulkan/icd.d/nvidia_icd.json:/usr/share/vulkan/icd.d/nvidia_icd.json:ro \
vulkan:cuda12.2-ubuntu22.04 vulkaninfo | grep NVIDIA
参考