在一个GPU上运行多个CUDA应用程序

55

CUDA文档并没有明确说明一个GPU可以共享多少个CUDA进程。例如,如果我使用同一个用户在装有一个GPU卡的系统上启动多个CUDA程序,会产生什么影响?执行的正确性是否能得到保证?在这种情况下,GPU如何安排任务?

2个回答

72
CUDA独立主机进程的活动通常会创建独立的CUDA 上下文,每个进程一个。因此,从单独的主机进程启动的CUDA活动将在同一设备上的不同CUDA上下文中进行。

在单独的上下文中,CUDA活动将被序列化。 GPU将执行来自一个进程的活动,并且当该活动处于空闲状态时,它可以和将会切换到另一个上下文以完成从其他进程启动的CUDA活动。 详细的上下文间调度行为未指定。(在单个GPU上运行多个上下文也通常不能违反基本的GPU限制,例如用于设备分配的内存可用性。)请注意,上下文间切换/调度行为是未指定的,并且可能因机器设置而异。随意观察或微基准测试可能表明,来自新设备上不同进程的内核可以并发运行(MPS之外),但这是不正确的。 较新的机器设置可能具有时间片而不是轮询行为, 但这并不改变在任何给定时刻,只能运行一个上下文中的代码的事实。

这种情况下(独立主机进程中GPU活动的序列化),"例外"是CUDA多进程服务器。简而言之,MPS充当一个“漏斗”,收集来自几个主机进程的CUDA活动,并将该活动作为来自单个主机进程的活动运行。其主要优点是避免可能能够并发运行的内核的序列化。 典型用例是启动多个MPI排名,它们都打算使用单个GPU资源。
请注意,上述描述适用于处于“默认”计算模式的GPU。在“独占进程”或“独占线程”计算模式下的GPU将拒绝任何试图在单个设备上创建超过一个进程/上下文的尝试。在这些模式中,其他进程尝试使用已经被使用的设备将导致CUDA API报告失败。在某些情况下,可以使用nvidia-smi实用程序修改计算模式。

3
这个答案在新的GPU架构下,到2023年是否已经过时或仍然相关? - Mohsen

1

我对这个话题还很新,但我发现在一个GPU上模拟多个GPU是可能的。

“为多个GPU开发将允许模型随着额外资源的扩展而扩展。如果在单个GPU系统上进行开发,我们可以使用虚拟设备模拟多个GPU。这使得无需额外资源即可轻松测试多GPU设置。”

来源:https://www.tensorflow.org/guide/gpu#allowing_gpu_memory_growth

也许使用这种技术,我们可以在这些虚拟GPU中的每一个上运行每个模型(至少用于推理)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接