CUDA文档并没有明确说明一个GPU可以共享多少个CUDA进程。例如,如果我使用同一个用户在装有一个GPU卡的系统上启动多个CUDA程序,会产生什么影响?执行的正确性是否能得到保证?在这种情况下,GPU如何安排任务?
在单独的上下文中,CUDA活动将被序列化。 GPU将执行来自一个进程的活动,并且当该活动处于空闲状态时,它可以和将会切换到另一个上下文以完成从其他进程启动的CUDA活动。 详细的上下文间调度行为未指定。(在单个GPU上运行多个上下文也通常不能违反基本的GPU限制,例如用于设备分配的内存可用性。)请注意,上下文间切换/调度行为是未指定的,并且可能因机器设置而异。随意观察或微基准测试可能表明,来自新设备上不同进程的内核可以并发运行(MPS之外),但这是不正确的。 较新的机器设置可能具有时间片而不是轮询行为, 但这并不改变在任何给定时刻,只能运行一个上下文中的代码的事实。
这种情况下(独立主机进程中GPU活动的序列化),"例外"是CUDA多进程服务器。简而言之,MPS充当一个“漏斗”,收集来自几个主机进程的CUDA活动,并将该活动作为来自单个主机进程的活动运行。其主要优点是避免可能能够并发运行的内核的序列化。 典型用例是启动多个MPI排名,它们都打算使用单个GPU资源。我对这个话题还很新,但我发现在一个GPU上模拟多个GPU是可能的。
“为多个GPU开发将允许模型随着额外资源的扩展而扩展。如果在单个GPU系统上进行开发,我们可以使用虚拟设备模拟多个GPU。这使得无需额外资源即可轻松测试多GPU设置。”
来源:https://www.tensorflow.org/guide/gpu#allowing_gpu_memory_growth
也许使用这种技术,我们可以在这些虚拟GPU中的每一个上运行每个模型(至少用于推理)。