我的目标是能够使用 Nvidia Container Toolkit 在 Docker 容器中运行 Vulkan 应用程序。理想情况下在主机和容器中运行 Ubuntu 22.04。
我创建了一个 git 存储库,以允许其他人更好地重现此问题:https://github.com/rickyjames35/vulkan_docker_test 自述文件解释了我的发现,但我会在这里重申它们。
对于此测试,我在主机和容器中运行 Ubuntu 22.04
FROM ubuntu:22.04
。对于此测试,我发现 vulkaninfo
找到的唯一设备是 llvmpipe
,它是基于 CPU 的图形驱动程序。我还发现,在 Ubuntu 22.04 的容器和主机上运行 vkcube
时,llvmpipe 无法渲染。这是 vkcube
的容器输出:
Selected GPU 0: llvmpipe (LLVM 13.0.1, 256 bits), type: 4
Could not find both graphics and present queues
在我的主机上,我可以告诉它使用
llvmpipe
:
vkcube --gpu_number 1
Selected GPU 1: llvmpipe (LLVM 13.0.1, 256 bits), type: Cpu
Could not find both graphics and present queues
正如你所看到的,他们有同样的错误。有趣的是,如果我将容器交换到
FROM ubuntu:20.04
,那么 llvmpipe
就可以渲染,但这是没有意义的,因为我不希望进行 CPU 渲染。这里的主要问题是,当使用 Nvidia Container Toolkit 以及 NVIDIA_DRIVER_CAPABILITIES=all
和 NVIDIA_VISIBLE_DEVICES=all
时,Vulkan 无法从容器内检测到我的 Nvidia GPU。我也尝试过使用 nvidia/vulkan。当在此容器中运行 vulkaninfo
时,我得到:
vulkaninfo
ERROR: [Loader Message] Code 0 : vkCreateInstance: Found no drivers!
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.236.0/source/Vulkan-Tools/vulkaninfo/vulkaninfo.h:674:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER
我怀疑这与我在主机上运行 Ubuntu 22.04 有关,尽管 docker 的重点是主机操作系统通常不应该影响容器。
在上面的测试中,我使用的是
nvidia-driver-525
我尝试过使用不同版本的驱动程序,但结果相同。此时,我不确定我是否做错了什么,或者 Nvidia Container Toolkit for Ubuntu 22.04 是否不支持 Vulkan,尽管它声称支持。
22.04 上的 vulkan 驱动程序为 1.1 版本,如果您使用 ubuntu:23_04,您将获得 vulkan 1.3 驱动程序,我能够让它与以下内容一起使用
FROM ubuntu:23.04
ARG DEBIAN_FRONTEND=noninteractive
ENV NVIDIA_DRIVER_CAPABILITIES compute,graphics,utility
# Install Vulkan
RUN apt-get update \
&& apt-get install -y \
libxext6 \
libvulkan1 \
libvulkan-dev \
vulkan-tools
COPY nvidia_icd.json /etc/vulkan/icd.d
您还需要这个 nvidia_icd.json
{
"file_format_version" : "1.0.0",
"ICD": {
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.3"
}
}
然后在新容器中,您可以运行
vulkaninfo --summary
并查看您的 nvidia 卡。
我让它一路工作,无需复制
nvidia_icd.json
。伊恩·珀顿(Ian Purton)您的回答对于寻找答案非常有帮助。它引导我来到这里 https://github.com/NVIDIA/nvidia-container-toolkit/issues/16 这表明 Ian Purton 发布的内容在解决此问题的 NVIDIA Container Toolkit v1.12.0 之前是必需的。我已经用修复程序更新了我的存储库。 https://github.com/rickyjames35/vulkan_docker_test 我的仓库中拥有的是使用 docker compose
在 Docker 容器中运行 Vulkan 的最简单的方式。
在尝试使用 nvidia/cuda:12.0.0-devel-ubuntu22.04 映像设置 docker 容器时,我遇到了类似的问题。
我能够使用 unityci/editor 图像让它工作。这是我使用的docker命令。
docker run -dit -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ -v /dev:/dev --gpus='all,"capabilities=compute,utility,graphics,display"' unityci/editor:ubuntu-2022.2.1f1-base-1.0.1
设置容器后,我必须安装
vulkan-utils
和 libnvidia-gl-525
然后一切正常。
希望这有帮助!
以上解决方案都不适合我。但按照此处的说明将 nvidia-container-toolkit 升级到 1.14.4 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/1.14.4/install-guide.html 解决了问题。