2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VulkanのDocker環境構築方法【NVIDIA GPU利用】

Posted at

はじめに

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" セクションを追加(または編集)する。

/etc/docker/daemon.json
{
    "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をインストールする。

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には存在する)。

対策

--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

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?