searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

nvidia-docker杂记

2023-09-01 09:06:29
225
0

nvidia-docker 是一个为了解决 Docker 使用 GPU 设备的项目。

nvidia-docker的发展历史

最初,nvidia-docker 作为一个独立的守护进程以 Volume Plugin 的形式存在,但与Docker生态系统的兼容性较差,因此被废弃。

随后,官方推出了 nvidia-docker2,它作为一个 Docker runtime ,在前者的基础上进行了巨大改进。

然而,随着 Docker 19.03 版本的发布,Nvidia GPU 作为 Docker runtime 中的设备得到了官方支持,因此nvidia-docker2也被弃用。

正因为这段历史,对于 Docker 19.03 以上的版本,一种说法是它不再需要安装 nvidia-docker2,而是应该安装nvidia-container-toolkit 来代替。然而,另一种说法是,如果您计划在 Kubernetes 中运行 Docker(即使是Docker 19.03以上版本),那仍然需要安装 nvidia-docker2。这两种说法在技术上都是正确的,只是难免会对初学者造成不小的疑惑。

为了解答这个疑惑,我们可以先看一下下面这些组件,而且这些组件自上而下的关系如下:

nvidia-docker2
nvidia-container-runtime
nvidia-container-toolkit
libnvidia-container

libnvidia-container

该软件包负责确保 GNU/Linux 容器设置为支持 Nvidia GPU,并进行相关的重要处理。它被设计为与容器运行时(container-runtime)无关,并提供一个明确定义的API和一个包装的命令行界面(CLI),不同的容器运行时可以调用该 API 将 NVIDIA GPU 支持注入到它们的容器中。


nvidia-container-toolkit

该软件包提供了一个脚本,用于实现 runC 预启动(hook)所需的接口。在容器创建后但尚未启动之前,runC会调用该脚本,并提供了访问与容器相关的config.json的权限(例如,此config.json)。然后,该脚本会从config.json中提取信息,并使用这些信息调用libnvidia-container CLI,并使用适当的标志集。其中最重要的标志之一是确定要将哪些特定的GPU设备分配给容器。

 

nvidia-contianer-runtime

这个软件包曾经是 runC 的一个完整分支,其中注入了 NVIDIA 特定的代码。然而,现在它只是对机器上原生runC的一个薄包装。它的功能是接受一个runC规范作为输入,将 nvidia-container-toolkit 脚本作为预启动(hook)注入其中,并调用原生的runC。它会将修改后的runC规范和该钩子一起传递给它。需要注意的是,这个软件包是针对 runC,而非Docker的。

nvidia-docker2

这个软件包是其中唯一与docker特定相关的软件包。它将与nvidia-container-runtime关联的脚本安装到docker的/etc/docker/daemon.json文件中。这样,您就可以运行(例如)docker run --runtime=nvidia … 来自动为您的容器添加GPU支持。它还安装了一个包装脚本(nvidia-docker),它可以在不需要每次都指定–runtime=nvidia的情况下调用原生的docker CLI。它还允许您在主机上设置一个环境变量(NV_GPU),以指定应该注入到容器中的GPU。

 

总结

根据这些组件的层次结构,如果只安装 nvidia-container-toolkit(这是推荐的Docker 19.03+版本),就没有 nvidia-container-runtime,因此无法使用 –runtime=nvidia 选项。对于 Docker 19.03+ 来说,这没问题,因为当使用 –gpus 选项传递给 Docker 时,它直接调用 nvidia-container-toolkit,而不是依赖于 nvidia-container-runtime 作为代理。

然而,如果想在 Docker 19.03 上使用 Kubernetes,实际上需要继续使用 nvidia-docker2,因为 Kubernetes 尚不支持通过 –gpus 标志将 GPU 信息传递给 Docker。它仍然依赖于 nvidia-container-runtime 通过一组环境变量将 GPU 信息传递到堆栈中。

因此,无论安装 nvidia-docker2 还是 nvidia-container-toolkit,实际上正在使用相同的堆栈,只是 nvidia-docker2 会安装一个薄运行时,可以通过环境变量将GPU信息传递给 nvidia-container-toolkit,而不是依赖于 –gpus 标志直接由 Docker完成。

0条评论
作者已关闭评论
Darren
11文章数
0粉丝数
Darren
11 文章 | 0 粉丝
Darren
11文章数
0粉丝数
Darren
11 文章 | 0 粉丝
原创

nvidia-docker杂记

2023-09-01 09:06:29
225
0

nvidia-docker 是一个为了解决 Docker 使用 GPU 设备的项目。

nvidia-docker的发展历史

最初,nvidia-docker 作为一个独立的守护进程以 Volume Plugin 的形式存在,但与Docker生态系统的兼容性较差,因此被废弃。

随后,官方推出了 nvidia-docker2,它作为一个 Docker runtime ,在前者的基础上进行了巨大改进。

然而,随着 Docker 19.03 版本的发布,Nvidia GPU 作为 Docker runtime 中的设备得到了官方支持,因此nvidia-docker2也被弃用。

正因为这段历史,对于 Docker 19.03 以上的版本,一种说法是它不再需要安装 nvidia-docker2,而是应该安装nvidia-container-toolkit 来代替。然而,另一种说法是,如果您计划在 Kubernetes 中运行 Docker(即使是Docker 19.03以上版本),那仍然需要安装 nvidia-docker2。这两种说法在技术上都是正确的,只是难免会对初学者造成不小的疑惑。

为了解答这个疑惑,我们可以先看一下下面这些组件,而且这些组件自上而下的关系如下:

nvidia-docker2
nvidia-container-runtime
nvidia-container-toolkit
libnvidia-container

libnvidia-container

该软件包负责确保 GNU/Linux 容器设置为支持 Nvidia GPU,并进行相关的重要处理。它被设计为与容器运行时(container-runtime)无关,并提供一个明确定义的API和一个包装的命令行界面(CLI),不同的容器运行时可以调用该 API 将 NVIDIA GPU 支持注入到它们的容器中。


nvidia-container-toolkit

该软件包提供了一个脚本,用于实现 runC 预启动(hook)所需的接口。在容器创建后但尚未启动之前,runC会调用该脚本,并提供了访问与容器相关的config.json的权限(例如,此config.json)。然后,该脚本会从config.json中提取信息,并使用这些信息调用libnvidia-container CLI,并使用适当的标志集。其中最重要的标志之一是确定要将哪些特定的GPU设备分配给容器。

 

nvidia-contianer-runtime

这个软件包曾经是 runC 的一个完整分支,其中注入了 NVIDIA 特定的代码。然而,现在它只是对机器上原生runC的一个薄包装。它的功能是接受一个runC规范作为输入,将 nvidia-container-toolkit 脚本作为预启动(hook)注入其中,并调用原生的runC。它会将修改后的runC规范和该钩子一起传递给它。需要注意的是,这个软件包是针对 runC,而非Docker的。

nvidia-docker2

这个软件包是其中唯一与docker特定相关的软件包。它将与nvidia-container-runtime关联的脚本安装到docker的/etc/docker/daemon.json文件中。这样,您就可以运行(例如)docker run --runtime=nvidia … 来自动为您的容器添加GPU支持。它还安装了一个包装脚本(nvidia-docker),它可以在不需要每次都指定–runtime=nvidia的情况下调用原生的docker CLI。它还允许您在主机上设置一个环境变量(NV_GPU),以指定应该注入到容器中的GPU。

 

总结

根据这些组件的层次结构,如果只安装 nvidia-container-toolkit(这是推荐的Docker 19.03+版本),就没有 nvidia-container-runtime,因此无法使用 –runtime=nvidia 选项。对于 Docker 19.03+ 来说,这没问题,因为当使用 –gpus 选项传递给 Docker 时,它直接调用 nvidia-container-toolkit,而不是依赖于 nvidia-container-runtime 作为代理。

然而,如果想在 Docker 19.03 上使用 Kubernetes,实际上需要继续使用 nvidia-docker2,因为 Kubernetes 尚不支持通过 –gpus 标志将 GPU 信息传递给 Docker。它仍然依赖于 nvidia-container-runtime 通过一组环境变量将 GPU 信息传递到堆栈中。

因此,无论安装 nvidia-docker2 还是 nvidia-container-toolkit,实际上正在使用相同的堆栈,只是 nvidia-docker2 会安装一个薄运行时,可以通过环境变量将GPU信息传递给 nvidia-container-toolkit,而不是依赖于 –gpus 标志直接由 Docker完成。

文章来自个人专栏
Darren的容器专栏
11 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0