【发布时间】:2015-10-17 01:50:15
【问题描述】:
CUDA 文档没有具体说明多少个 CUDA 进程可以共享一个 GPU。例如,如果我在系统中只安装了一张 GPU 卡的情况下,由同一用户启动多个 CUDA 程序,效果如何?能保证执行的正确性吗?在这种情况下,GPU 是如何调度任务的?
【问题讨论】:
CUDA 文档没有具体说明多少个 CUDA 进程可以共享一个 GPU。例如,如果我在系统中只安装了一张 GPU 卡的情况下,由同一用户启动多个 CUDA 程序,效果如何?能保证执行的正确性吗?在这种情况下,GPU 是如何调度任务的?
【问题讨论】:
来自独立主机进程的 CUDA 活动通常会创建独立的 CUDA contexts,每个进程一个。因此,从不同主机进程启动的 CUDA 活动将在同一设备上的不同 CUDA 上下文中进行。
单独上下文中的 CUDA 活动将被序列化。 GPU 将从一个进程执行活动,当该活动空闲时,它可以并将上下文切换到另一个上下文以完成从另一个进程启动的 CUDA 活动。 未指定详细的上下文间调度行为。 (在单个 GPU 上运行多个上下文通常也不会违反基本的 GPU 限制,例如设备分配的内存可用性。)请注意,上下文间切换/调度行为未指定,也可能因机器设置而异。偶然观察或微基准测试可能表明来自较新设备上的单独进程的内核可以同时运行(在 MPS 之外),但这是不正确的。 Newer machine setups may have a time-sliced rather than round-robin behavior,但这并没有改变这样一个事实,即在任何给定时刻,只能运行来自一个上下文的代码。
这种情况(来自独立主机进程的 GPU 活动序列化)的“例外”是 CUDA 多进程服务器。简而言之,MPS 充当“漏斗”来收集来自多个主机进程的 CUDA 活动,并像从单个主机进程一样运行该活动。主要好处是避免serialization of kernels which might otherwise be able to run concurrently。典型的用例是启动多个 MPI 等级,它们都打算使用单个 GPU 资源。
请注意,以上描述适用于“默认”compute mode 中的 GPU。处于“独占进程”或“独占线程”计算模式的 GPU 将拒绝在单个设备上创建多个进程/上下文的任何尝试。在其中一种模式下,其他进程尝试使用已在使用的设备将导致 CUDA API 报告失败。在某些情况下,可以使用nvidia-smi utility 修改计算模式。
【讨论】:
我是这个话题的新手。但我发现只能在一个 GPU 上模拟多个 GPU。 “针对多个 GPU 进行开发将允许模型利用额外资源进行扩展。如果在具有单个 GPU 的系统上进行开发,我们可以使用虚拟设备模拟多个 GPU。这样可以轻松测试多 GPU 设置,而无需额外资源。”
来源:https://www.tensorflow.org/guide/gpu#allowing_gpu_memory_growth
也许使用这种技术,我们可以在其中一个虚拟 GPU 上运行每个模型(至少用于推理)。
【讨论】: