如何减少 CUDA 上下文大小(多进程服务)

Posted

技术标签:

【中文标题】如何减少 CUDA 上下文大小(多进程服务)【英文标题】:How to reduce CUDA context size (Multi-Process Service) 【发布时间】:2020-04-12 03:54:45 【问题描述】:

我关注了 Robert Crovella 的 example,了解如何使用 Nvidia 的 Multi-Process Service。根据docs:

2.1.2。 减少 GPU 上的上下文存储

如果没有 MPS,每个使用 GPU 的 CUDA 进程都会分配单独的存储空间 在 GPU 上调度资源。相比之下,MPS 服务器 分配一份GPU存储和调度资源共享 它的所有客户。

我理解为减少每个进程的上下文大小,这是可能的,因为它们是共享的。这将增加可用的 GPU 内存,从而能够并行运行更多进程。

现在,回到示例。没有 MPS:

还有 MPS:

不幸的是,每个进程仍然占用几乎相同 (~300MB) 的内存量。这与文档不矛盾吗?有没有办法减少每个进程的内存消耗?

【问题讨论】:

从您链接的文档中,在您引用的句子之后:“Volta MPS 支持 MPS 客户端之间增加的隔离,因此资源减少的程度要小得多。” @tera 糟糕,我对这句话的关注太少了……你知道这种孤立的原因吗?安全吗? 您在主机系统上拥有访问权限和单独的地址空间的相同原因 - 您不希望 CUDA 代码返回错误结果或您的 GUI 只是因为碰巧运行了一些其他代码同时写入一个流浪指针。 【参考方案1】:

糟糕,在检查另一张(Volta 之前的)卡上的内存使用情况之前,我急切地问过,是的,实际上存在差异。如果其他人也偶然发现这个问题,让我在这里发布以供将来参考:

MPS 关闭:

MPS 开启:

【讨论】:

【参考方案2】:

确实,正如here 所见,在 Volta 架构中,您可以看到进程直接与 GPU 通信,中间没有 MPS 服务器:

Volta MPS 客户端直接向 GPU 提交工作,无需通过 MPS 服务器。

这可以从您的第一个屏幕截图中轻松看出,其中t1034 进程被列为使用 GPU。

相反,在 Volta 之前的架构中,客户端进程通过 MPS 服务器与 GPU 通信。这导致在后面的屏幕截图中只看到 MPS 服务器进程直接与 GPU 通信。

【讨论】:

以上是关于如何减少 CUDA 上下文大小(多进程服务)的主要内容,如果未能解决你的问题,请参考以下文章

cuDevicePrimaryCtxRetain() 是不是用于在多个进程之间拥有持久的 CUDA 上下文对象?

两个进程可以共享相同的 GPU 内存吗? (CUDA)

Linux性能分析-CPU上下文切换

并发编程中,如何减少上下文切换

Runtime API 何时销毁主 CUDA 上下文?

nginx优化 tbc