2. 【NVIDIA-GPU-CUDA】MPS 多进程服务

2,080 阅读4分钟

ref: 多进程服务 :: GPU 部署和管理文档 (nvidia.com)

1. 什么是MPS

多进程服务 (MultiProcessService) 是 CUDA 应用程序编程接口 (API) 的替代、二进制兼容的实现。MPS 运行时架构旨在透明地支持协作式多进程 CUDA 应用程序(通常是 MPI 作业),以利用最新 NVIDIA(基于开普勒)GPU 上的 Hyper-Q 功能。Hyper-Q允许在同一GPU上同时处理CUDA内核;当单个应用程序进程未充分利用 GPU 计算容量时,这可以提高性能。

他由多个组件组成

  • 控制守护进程 – 控制守护程序负责启动和停止服务器,以及协调客户端和服务器之间的连接。
  • 客户端运行时 – MPS 客户端运行时内置于 CUDA 驱动程序库中,可由任何 CUDA 应用程序透明地使用。
  • 服务器进程 – 服务器是客户端与 GPU 的共享连接,并在客户端之间提供并发性。

2. Volta中的MPS(重点)

Volta 架构引入了新的 MPS 功能。与 Volta GPU 之前的 MPS 相比,Volta MPS 提供了一些关键改进:

  • Volta MPS 客户端将工作直接提交到 GPU,而无需通过 MPS 服务器。
  • 每个 Volta MPS 客户端都拥有自己的 GPU 地址空间,而不是与所有其他 MPS 客户端共享 GPU 地址空间。
  • Volta MPS 支持针对服务质量 (QoS) 的有限执行资源配置。

2.1. Volta MPS 和 MPS 在 Volta GPU 之前的版本中的差异

3. 为什么需要MPS

为了平衡 CPU 和 GPU 任务之间的工作负载,通常会在多核 CPU 计算机中分配 MPI(Message Passing Interface) 进程的单个 CPU 内核,以提供潜在 Amdahl 瓶颈的 CPU 内核并行化。因此,当使用 CUDA 内核加速 MPI 进程时,为每个单独的 MPI 进程分配的工作量可能会使 GPU 未得到充分利用。虽然每个MPI进程最终可能会运行得更快,但GPU的使用效率低下。多进程服务利用 MPI 间秩并行性,提高整体 GPU 利用率。

4. MPS有什么优势

  • GPU 利用率
    单个进程可能无法利用 GPU 上可用的所有计算和内存带宽容量。MPS 允许来自不同进程的内核和记忆复制操作在 GPU 上重叠,从而实现更高的利用率和更短的运行时间。

  • 减少 GPU 上的上下文存储
    如果没有 MPS,每个使用 GPU 的 CUDA 进程都会在 GPU 上分配单独的存储和调度资源。相比之下,MPS 服务器分配一个 GPU 存储副本,并分配与其所有客户端共享的计划资源。Volta MPS 支持 MPS 客户端之间增强的隔离,因此资源减少的程度要小得多。

  • 减少 GPU 上下文切换 如果没有 MPS,当进程共享 GPU 时,必须打开和交换 GPU 上的调度资源。MPS 服务器在其所有客户端之间共享一组调度资源,从而消除了 GPU 在这些客户端之间调度时交换的开销。

5. 什么程序应使用MPS

当每个应用程序进程未生成足够的工作以使 GPU 饱和时,MPS 非常有用。可以使用 MPS 在每个节点上运行多个进程,以实现更高的并发性。像这样的应用程序是通过having a small number of blocks-per-grid来识别的。

此外,如果应用程序由于每个grid的线程数较少而显示较低的 GPU 占用率,则使用 MPS 可以实现性能改进。建议在内核调用中每个grid使用更少的blocks,而使用更多的每个block的线程数来增加每个块的占用率。MPS 允许剩余的 GPU 容量被从其他进程运行的 CUDA 内核占用。

这些情况发生在强扩展情况下,其中计算容量(节点,CPU内核和/或GPU计数)增加,而问题大小保持不变。尽管计算工作总量保持不变,但每个进程的工作量会减少,并且可能会在应用程序运行时未充分利用可用的计算容量。使用 MPS,GPU 将允许来自不同进程的内核启动并发运行,并从计算中删除不必要的序列化点。

// TODO 后续根据项目任务继续更新