如何从 Docker 容器连接到 Nvidia MPS 服务器?

Posted

技术标签:

【中文标题】如何从 Docker 容器连接到 Nvidia MPS 服务器?【英文标题】:How to connect to Nvidia MPS server from a Docker container? 【发布时间】:2018-01-25 05:51:15 【问题描述】:

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

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

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

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

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

【问题讨论】:

this 可能感兴趣 【参考方案1】:

要启动一个可以访问 mps 的容器,它必须绑定挂载到 /tmp/nvidia-mps 和与主机相同的 interprocess-communication group。

例如:

docker run -v /tmp/nvidia-mps:/tmp/nvidia-mps --ipc=host nvidia/cuda

【讨论】:

【参考方案2】:

我认为不需要将 /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

请注意,也可以在容器内托管 MPS,并在容器之间共享该容器的 IPC 命名空间 (/dev/shm)。

【讨论】:

以上是关于如何从 Docker 容器连接到 Nvidia MPS 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 容器中将 Spyder 连接到远程 Jupyter Notebook

如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

如何从 docker 容器连接到远程 mysql 托管?

如何从 Angular Nginx 容器连接到 Node API docker 容器

如何从 docker 容器中的 python 脚本连接到 localhost 上的 mysql 数据库

从外部连接到 docker 容器中的 Postgresql