在容器中调用nvidia GPU,官方提供了nvidia-docker2, nvidia-container-runtime,nvidia-container-tookit等多种方式,很多人不知道这几个的区别,官方文档也比较分散,今天我们就来说一说。
libnvidia-container:该包确保容器能使用 NVIDIA GPU 来运行任务。它被设计为与容器运行时无关,并提供了定义良好的 API 和包装器 CLI,不同的runtime可以调用这些 API 来将 NVIDIA GPU 支持注入到其容器中。
nvidia-container-toolkit:该软件包包含一个脚本,该脚本实现了 runC 预启动挂钩所需的接口。该脚本由 runC 在创建容器之后、启动之前调用,并有权访问与容器关联的 config.json。然后,它获取 config.json 中包含的信息,并通过设置合适的标志来调用 libnvidia-container CLI。其中最重要的标志之一是应将哪些特定 GPU 设备注入到容器中。
nvidia-container-runtime:该软件包曾经是 runC 的完整分支,其中注入了 NVIDIA 特定代码。如今,它是安装在计算机上的本机 runC 的薄包装。它所做的只是将 runC 规范作为输入,将 nvidia-container-toolkit 脚本作为预启动钩子注入其中,然后调用本机 runC,将带有该钩子集的修改后的 runC 规范传递给它。需要注意的是,这个包不一定特定于 docker(但它特定于 runC)
nvidia-docker2这个包是其中唯一一个特定于 docker 的包。它获取与 nvidia-container-runtime 关联的脚本并将其安装到 docker 的 /etc/docker/daemon.json 文件中。然后,您可以运行 docker run --runtime=nvidia 来自动向容器添加 GPU 支持。它还在本机 docker CLI 周围安装了一个名为 nvidia-docker 的包装器脚本,它允许您调用 docker,而无需每次都指定 --runtime=nvidia。它还允许您在主机 (NV_GPU) 上设置环境变量,以指定应将哪些 GPU 注入到容器中。
所以如果只安装 nvidia-container-toolkit (建议在 Docker 19.03+ 中安装),那么 nvidia-container-runtime 将不会作为其中的一部分安装,因此无法使用--runtime =nvidia。这对 Docker 19.03+ 来说没问题, 当使用--gpus 选项时,它会直接调用 nvidia-container-toolkit,而不是依赖 nvidia-container-runtime 作为代理。
但是如果想将 Kubernetes 与 Docker 19.03 一起使用,实际上需要继续使用 nvidia-docker2,因为 Kubernetes 还不支持通过 --gpus 标志将 GPU 信息传递给 docker。它仍然依赖 nvidia-container-runtime 通过一组环境变量将 GPU 信息传递到堆栈中。