1

我想重叠许多 docker 容器对 GPU 的使用。Nvidia 提供了一个实用程序来执行此操作:此处记录的多进程服务。具体来说,它说:

在程序中首次初始化 CUDA 时,CUDA 驱动程序会尝试连接到 MPS 控制守护程序。如果连接尝试失败,程序将继续像没有 MPS 的情况一样正常运行。然而,如果连接尝试成功,则 MPS 控制守护进程继续确保使用与连接客户端相同的用户 ID 启动的 MPS 服务器在返回客户端之前处于活动状态。然后 MPS 客户端继续连接到服务器。MPS 客户端、MPS 控制守护进程和 MPS 服务器之间的所有通信都是使用命名管道完成的。

默认情况下,命名管道放置在 中/tmp/nvidia-mps/,因此我使用卷与容器共享该目录。

但这还不足以让容器上的 cuda 驱动程序“看到”MPS 服务器。

我应该在主机和容器之间共享哪些资源,以便它可以连接到 MPS 服务器?

4

2 回答 2

0

要启动一个可以访问 mps 的容器,它必须具有与主机/tmp/nvidia-mps相同的进程间通信组的绑定挂载。

例如:

docker run -v /tmp/nvidia-mps:/tmp/nvidia-mps --ipc=host nvidia/cuda
于 2018-06-05T15:11:42.210 回答
0

我认为不需要将 /tmp/nvidia-mps 映射到容器中。只要 IPC 命名空间相同,它就可以工作。

如果您在主机上运行 MPS 控制守护程序,那么您需要使用 docker run 标志 --ipc=host,如前所述,因为 MPS 将使用 /dev/shm(这是 IPC 命名空间映射到的位置)在主机上。使用 --ipc=host 标志将告诉 docker 将主机的 /dev/shm 映射到容器中,而不是在容器内创建私有 /dev/shm。

例如

docker run --ipc=host nvidia/cuda

Note it is also possible to host MPS inside a container and share that container's IPC namespace (/dev/shm) between containers.

于 2020-03-04T19:56:56.197 回答