每个 docker 个容器的不同 nvidia 驱动程序版本

Different nvidia driver versions per docker container

是否可以 运行 两个 Nvidia Docker 容器,每个容器都有自己的 Nvidia 驱动程序版本?

在我的云实例上,我有一个较旧的应用程序 运行ning,较新的 Nvidia 驱动程序导致了问题。我希望能够 运行 使它与旧驱动程序保持一致,同时允许同一实例上的较新应用程序使用较新驱动程序。我在想我可以用容器来完成这个,但我担心它们只允许你在用户 space.

中容器化东西

容器是用来隔离进程的。只有主机的内核对于所有容器都是相同的,而虚拟机则不然。因此,您可以为具有旧驱动程序的旧应用程序创建一个容器,为具有新 nvidia 驱动程序的新应用程序创建另一个容器。容器就是为此而生的。

但对于 nvidia docker 你可能需要每个 pod 1 个 gpu,但这可以使用一些简单的方法绕过,这不是一个好的解决方案

答案是否定的。驱动安装在主机上。

这些文章: NVIDIA Docker: GPU Server Application Deployment Made Easy 和更新的 Enabling GPUs in the Container Runtime Ecosystem 讨论堆栈是如何设置的。

关键是 Nvidia 带来了他们自己的 runc 版本(Docker 中实际运行容器进程的部分)。此修改版本的 runc 与主机通信 OS 以使容器进程可以使用驱动程序级别的详细信息。

回答更新,实际上现在可以在不同的容器中使用不同的驱动程序版本。您所要做的就是更改 NVIDIA Container Toolkit 配置文件 (/etc/nvidia-container-runtime/config.toml),以便根指令指向驱动程序容器,如下所示:

disable-require = false
swarm-resource = "DOCKER_RESOURCE_GPU"

[nvidia-container-cli]
root = "/run/nvidia/driver"
path = "/usr/bin/nvidia-container-cli"
environment = []
debug = "/var/log/nvidia-container-toolkit.log"
ldcache = "/etc/ld.so.cache"
load-kmods = true
no-cgroups = false
user = "root:video"
ldconfig = "@/sbin/ldconfig.real"

[nvidia-container-runtime]
debug = "/var/log/nvidia-container-runtime.log"

这个命令可以直接用来做这个修改:

$sudo sed -i 's/^#root/root/' /etc/nvidia-container-runtime/config.toml

之后,您可以 运行 在后台使用具有所需驱动程序版本的容器:

$sudo docker run --name nvidia-driver -d --privileged --pid=host \
  -v /run/nvidia:/run/nvidia:shared \
  -v /var/log:/var/log \
  --restart=unless-stopped \
  nvidia/driver:450.80.02-ubuntu18.04

然后 运行 具有您工作所需的 CUDA 版本的 GPU 容器:

$sudo docker run --gpus all nvidia/cuda:11.0-base nvidia-smi