如何减少 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 上下文大小(多进程服务)的主要内容,如果未能解决你的问题,请参考以下文章