CUDA文档没有具体说明有多少CUDA进程可以共享一个GPU。例如,如果同一个用户在系统中只安装了一个GPU卡的情况下启动了多个CUDA程序,效果如何?它会保证执行的正确性吗?在这种情况下,GPU如何安排任务?
答案 0 :(得分:29)
来自独立主机进程的CUDA活动通常会创建独立的CUDA contexts,每个进程一个。因此,从单独的主机进程启动的CUDA活动将在同一设备上的单独CUDA上下文中进行。
单独上下文中的CUDA活动将被序列化。 GPU将从一个进程执行活动,并且当该活动空闲时,它可以并且将上下文切换到另一个上下文以完成从另一个进程启动的CUDA活动。未指定详细的上下文调度行为。 (在单个GPU上运行多个上下文通常也不会违反基本的GPU限制,例如设备分配的内存可用性。)
"例外"对于这种情况(来自独立主机进程的GPU活动的序列化)将是CUDA多进程服务器。简而言之,MPS充当了一个"漏斗"收集来自多个主机进程的CUDA活动,并运行该活动,就好像它来自单个主机进程一样。主要好处是避免使用serialization of kernels which might otherwise be able to run concurrently。规范用例将用于启动所有打算使用单个GPU资源的多个MPI等级。
请注意,上面的描述适用于"默认" compute mode。 GPU中的GPU"独家处理"或"独家线程"计算模式将拒绝在单个设备上创建多个进程/上下文的任何尝试。在其中一种模式中,其他进程尝试使用已在使用的设备将导致CUDA API报告失败。在某些情况下,使用nvidia-smi utility可以修改计算模式。
答案 1 :(得分:0)
我是这个主题的新手。但是我发现可以仅在一个GPU上模拟多个GPU。 “针对多个GPU的开发将使模型可以利用额外的资源进行扩展。如果在具有单个GPU的系统上进行开发,我们可以使用虚拟设备来模拟多个GPU。这使得能够轻松测试多GPU设置而无需额外的资源。”
来源:https://www.tensorflow.org/guide/gpu#allowing_gpu_memory_growth
也许使用这种技术,我们可以在这些虚拟GPU的其中一个上运行每个模型(至少用于推理)。