在 docker 中使用 OpenGL 和 nvidia-docker2

Dan*_*ele 5 opengl ubuntu nvidia docker

我正在尝试在 Ubuntu 16.04 容器中运行 OpenGL 应用程序 ( Gazebo ),并且我希望能够在可用时利用 nvidia 图形加速。我试图弄清楚推荐的、官方支持的(希望由 nvidia 支持)实现这一目标的方法是什么。

我的要求:

  1. 创建图像非常耗时,所以我想为所有类型的图形(nvidia、mesa,即其他所有内容)提供一个图像,或者如果分开,它们应该“从”一个具有批量的公共基础图像构建的内容。
  2. nvidia 容器应该在不同的系统上工作,这些系统可能安装了不同的 nvidia 卡和驱动程序版本。
  3. 我需要使用 Ubuntu 16.04,公司需要这个,尽管这是这些要求中最不重要的,例如,如果这只能在 18.04 上完成,我也会感兴趣。

到目前为止我尝试过的:

  • 只需为 nvidia 和其他所有内容构建单独的图像,使用FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04. 这很有效,但需要构建两个映像,这需要两倍的时间和两倍的磁盘空间。 打破要求 1。
  • 首先从 构建“普通”(台面/英特尔)映像ubuntu:16.04,在那里完成所有耗时的工作,然后将其用作另一个映像的基础,其中从官方“运行文件”手动安装 NVIDIA 驱动程序。如果驱动程序与安装在主机上的驱动程序完全匹配,则此方法有效,但如果主机具有不同(例如较旧)版本,则无效。打破要求 2。
  • 什么都不做,只需使用--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=all. 如果我这样做,会nvidia-smi看到卡,但 OpenGL(例如glxinfo)仍然尝试加载swrast驱动程序,这不起作用。

我在野外看到的大多数示例都使用nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04基础,并且在我的一生中,我找不到该图像中如何安装 nvidia 驱动程序(如果有的话)。我还在某处读到过,使用 nvidia 容器运行时(即nvidia-docker2我正在使用的),您不需要安装驱动程序,但情况似乎并非如此,至少对于 OpenGL 而言并非如此。

那么,有没有办法为 nvidia 和非 nvidia 创建满足我所有要求的容器映像,或者我只是想要太多?

Dan*_*ele 5

当您可以“窃取”别人的解决方案时,为什么要浪费时间自己寻找解决方案?特别是如果其他人是 NVIDIA 自己。

由于nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04似乎运行良好,但将其用作基础打破了要求 1,我可以将文件从中复制到我的图像中。

这里${from}指向我的原始的、非 nvidia 感知的容器映像(但我也用 进行了测试from=ubuntu:16.04),我只是复制了 nvidia 的驱动程序和配置:

ARG from
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 as nvidia
FROM ${from}

COPY --from=nvidia /usr/local /usr/local
COPY --from=nvidia /etc/ld.so.conf.d/glvnd.conf /etc/ld.so.conf.d/glvnd.conf

ENV NVIDIA_VISIBLE_DEVICES=all NVIDIA_DRIVER_CAPABILITIES=all
Run Code Online (Sandbox Code Playgroud)

有了这个,我${from}建立在ubuntu:16.04, glxinfo 返回预期的配置(英伟达是 GL 供应商),我可以像在主机上一样运行 Gazebo、Blender 等。这样做的好处是,即使不使用 nvidia 运行时,生成的容器也能工作,在没有 nvidia 驱动程序的系统上,它只是优雅地回退到使用 Mesa(我猜这就是“glvnd”所做的)。

虽然我目前需要使用 Ubuntu 16.04,但我认为类似的方法没有理由不适用于其他 Ubuntu 版本。