我需要nvidia-container-runtime,为什么?

问题描述

我想从容器内部访问我的NVIDIA GPU。如果没有nvidia-container-runtime,我可以这样做吗?

仅需要与一个设备对话就需要自定义Docker运行时,这似乎很奇怪。那里有大量的PCI设备。为什么这个需要自己的运行时?例如,假设我同时拥有NVIDIA和AMD GPU。我将无法从一个容器中访问这两个容器?

我了解nvidia-container-runtime可让我控制通过NVIDIA_VISIBLE_DEVICES可见的GPU。但是我不在乎。我没有使用容器隔离设备;我正在使用容器来管理CUDA / CUDNN / TensorFlow版本h * ll。如果我想隔离设备,则可以使用与永远相同的机制:通过控制对/ dev中节点的访问。

简而言之,整个“自定义运行时”设计对我来说都是有缺陷的。

所以,问题:

  • 我想念什么?
  • 我可以使用现有的Docker(或podman)运行时访问我的NVIDIA GPU吗?
  • 如果没有,为什么不呢?

解决方法

我当然无法回答与此相关的所有可能的问题。我将尝试给出一个总结。我在这里写的内容基于herehere所记录的内容。我在这里的讨论还将集中在linux和docker(不是Windows,不是奇异,不是podman等)上。我也不太可能解决诸如“为什么其他PCI设备不必这样做?”之类的问题。我也不想让该领域的专家对docker工作原理的描述完全准确。

NVIDIA GPU驱动程序具有在user space中运行的组件以及在内核空间中运行的其他组件。这些组件必须协同工作,并且必须协调一致。这意味着驱动程序XYZ.AB的内核模式组件必须仅与驱动程序XYZ.AB的用户空间组件一起使用(而不是其他版本),反之亦然。

粗略地说,泊坞窗是一种提供隔离的用户空间linux状态的机制,该状态在linux内核(所有内核空间内容所处的位置)上运行并与其接口。 linux内核位于主机(容器外部)中,并且大部分/大多数linux用户空间代码位于容器内部。这是体系结构因素之一,可让您做一些轻松的事情,例如在RHEL内核上运行ubuntu容器。

从NVIDIA驱动程序的角度来看,其某些组件需要在容器的内部 安装,而某些组件需要在容器的外部安装。

我可以使用库存的Docker(或podman)运行时访问我的NVIDIA GPU吗?

是的,可以,这就是人们在nvidia-docker或nvidia-container-toolkit出现之前所做的事情。您需要在基础计算机以及容器中安装完全相同的驱动程序。上次检查时,此方法有效(尽管我不打算在此处提供说明。)如果执行此操作,则容器内的驱动程序组件与容器外的驱动程序组件匹配,并且可以工作。

我想念什么?

NVIDIA(可能还有其他公司)想要一个更灵活的方案。上面的描述意味着,如果一个容器是使用任何其他驱动程序版本(而不是您的基础计算机上安装的)构建的,则它将无法工作。这很不方便。

nvidia-docker的原始目的是执行以下操作:在容器加载时,将主机中存在的驱动程序的运行时组件安装到容器中。这可以协调事物,尽管它不能解决所有兼容性问题,但可以解决很多问题。通过一条简单的规则“将您的驱动程序在基础计算机上更新为最新”,它可以有效解决因驱动程序/ CUDA运行时不匹配而引起的所有兼容性情况。 (CUDA工具箱以及所有依赖它的东西,例如CUDNN,仅需安装在容器中。)

正如您所指出的那样,随着时间的流逝,nvidia-container-toolkit已经获得了许多其他有用的功能。

在这里,我不会花很多时间谈论已编译的CUDA代码的兼容性策略(“向前”),以及谈论特定驱动程序和{{ 3}}。我也不想提供已被记录在案的nvidia-container-toolkit的使用说明,并且关于它的许多问题/答案也已经存在。

我将无法回答后续问题,例如“为什么要这样设计?”或“那不应该,您为什么不这样做呢?”

,

要回答我自己的问题:不,我们不需要nvidia-container-runtime。

NVIDIA共享库与驱动程序的每个发行版紧密相关。 NVIDIA喜欢说“驱动程序具有在用户空间中运行的组件”,但这当然是矛盾的。因此,对于任何版本的驱动程序,您都需要在容器内部访问这些共享库的相应版本。

简要说明为什么这是一个糟糕的设计:除了额外的复杂性之外,NVIDIA共享库还依赖于系统中的其他共享库,尤其是C和X11。如果较新版本的NVIDIA库要求使用较新的C或X11库提供的功能,则运行这些较新库的系统将永远无法托管较旧的容器。 (因为容器将无法运行更新的注入库。)至少在某些应用程序中,在新系统上运行旧容器的能力是容器最重要的功能之一。我想我们必须希望永远不会发生。

HPC社区已经弄清楚了这一点,并使其在一段时间前可以正常工作。 Here are some old instructions用于创建便携式Singularity GPU容器,该容器在运行时将注入所需的NVIDIA共享库。您可以轻松地遵循类似的过程来创建便携式OCI或Docker GPU容器。

这几天,Singularity支持Activity标志来自动注入必要的共享库。它还为AMD GPU支持--nv标志。 (是的,AMD选择了同样的不良设计。)如果您同时需要这两个标记,则可以合并使用。

所有这些详细信息在the Singularity manual中都有详细记录。

底线:如果您问的是我相同的问题,请尝试奇点。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...