架构概览#

NVIDIA 容器堆栈的架构设计使其能够支持生态系统中的任何容器运行时。该堆栈的组件包括

  • NVIDIA 容器运行时 (nvidia-container-runtime)

  • NVIDIA 容器运行时钩子 (nvidia-container-toolkit / nvidia-container-runtime-hook)

  • NVIDIA 容器库和 CLI (libnvidia-container1, nvidia-container-cli)

NVIDIA 容器堆栈的组件打包为 NVIDIA 容器工具包。

这些组件的使用方式取决于所使用的容器运行时。对于 dockercontainerd,NVIDIA 容器运行时 (nvidia-container-runtime) 被配置为符合 OCI 标准的运行时,其组件流程如下图所示

_images/runtime-architecture.png

cri-olxc 的组件流程如下图所示。应该注意的是,在这种情况下,不需要 NVIDIA 容器运行时组件。

_images/nvidia-crio-lxc-arch.png

让我们简要了解 NVIDIA 容器堆栈中的每个组件,从最低级别的组件开始,逐步向上

组件和软件包#

NVIDIA 容器工具包的主要软件包是

  • nvidia-container-toolkit

  • nvidia-container-toolkit-base

  • libnvidia-container-tools

  • libnvidia-container1

这些软件包之间的依赖关系如下所示

├─ nvidia-container-toolkit (version)
│    ├─ libnvidia-container-tools (>= version)
│    └─ nvidia-container-toolkit-base (version)
│
├─ libnvidia-container-tools (version)
│    └─ libnvidia-container1 (>= version)
└─ libnvidia-container1 (version)

其中 version 用于表示 NVIDIA 容器工具包版本。

注意

过去,nvidia-docker2nvidia-container-runtime 软件包也曾作为 NVIDIA 容器堆栈的一部分进行讨论。这些**软件包**应被视为已弃用,因为它们的功能已与 nvidia-container-toolkit 软件包合并。这些软件包可能仍然可用,以便引入对 nvidia-container-toolkit 的依赖,并确保较旧的工作流程继续运行。有关这些软件包的更多信息,请参阅版本早于 v1.12.0 的文档存档。

NVIDIA 容器库和 CLI#

这些组件分别打包为 libnvidia-container-toolslibnvidia-container1 软件包。

这些组件提供了一个库和一个简单的 CLI 实用程序,用于自动配置利用 NVIDIA GPU 的 GNU/Linux 容器。该实现依赖于内核原语,并设计为与容器运行时无关。

libnvidia-container 提供了一个定义明确的 API 和一个包装器 CLI(称为 nvidia-container-cli),不同的运行时可以调用它,以便将 NVIDIA GPU 支持注入到它们的容器中。

NVIDIA 容器运行时钩子#

此组件包含在 nvidia-container-toolkit 软件包中。

此组件包含一个可执行文件,该文件实现了 runC prestart 钩子所需的接口。此脚本在容器创建之后但在启动之前由 runC 调用,并被授予访问与容器关联的 config.json 的权限(例如,此 config.json )。然后,它获取 config.json 中包含的信息,并使用它来调用带有适当标志集的 nvidia-container-cli CLI。其中最重要的标志之一是应将哪些特定的 GPU 设备注入到容器中。

NVIDIA 容器运行时#

此组件包含在 nvidia-container-toolkit-base 软件包中。

此组件过去曾是 runC 的完整分支,其中注入了 NVIDIA 特定的代码。自 2019 年以来,它已成为主机系统上安装的本机 runC 的一个轻薄包装器。nvidia-container-runtime 接受 runC 规范作为输入,将 NVIDIA 容器运行时钩子作为 prestart 钩子注入其中,然后调用本机 runC,并将修改后的 runC 规范与该钩子集一起传递给它。对于 v1.12.0 及更高版本的 NVIDIA 容器运行时,此运行时还对 OCI 运行时规范执行其他修改,以注入 NVIDIA 容器 CLI 未处理的特定设备和挂载。

重要的是要注意,此组件不一定特定于 docker(但它特定于 runC)。

NVIDIA 容器工具包 CLI#

此组件包含在 nvidia-container-toolkit-base 软件包中。

此组件是一个 CLI,其中包括许多用于与 NVIDIA 容器工具包交互的实用程序。此功能包括配置诸如 docker 之类的运行时以与 NVIDIA 容器工具包一起使用,或生成 容器设备接口 (CDI) 规范。

那么我应该使用哪个软件包?#

安装 nvidia-container-toolkit 软件包足以满足所有用例。此软件包不断增强,增加了额外的功能和工具,以简化容器和 NVIDIA 设备的使用。

要将 Kubernetes 与 Docker 一起使用,您需要配置 Docker daemon.json 以包含对 NVIDIA 容器运行时的引用,并将此运行时设置为默认运行时。NVIDIA 容器工具包包含一个实用程序来更新此文件,如 docker 特定的安装说明中所强调的那样。

有关在各种 Linux 发行版上安装 NVIDIA 容器工具包的更多信息,请参阅 安装 NVIDIA 容器工具包

软件包仓库#

上面列出的各种组件的软件包可在这些项目的 GitHub 仓库的 gh-pages 分支中找到。这对于可能希望访问实际软件包(.deb.rpm)以支持离线安装的气隙部署尤其有用。

对于不同的组件

  1. nvidia-container-toolkit

    • https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/

  2. libnvidia-container

    • https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/

注意

自 NVIDIA 容器工具包版本 1.6.0 发布以来,所有组件的软件包都发布到上面列出的 libnvidia-container repository <https://nvidia.github.io/libnvidia-container/>。对于较旧的软件包版本,请参阅文档存档。

软件版本也托管在仓库的 experimental 分支上,并在测试/验证后升级到 stable 分支。要访问 NVIDIA 容器工具包的最新 experimental 功能,您可能需要将 experimental 分支添加到 aptyum 仓库列表中。安装说明包括有关如何为软件包管理器添加这些仓库列表的信息。