Nvidia MPS 的简单介绍

本文最后更新于:2023年11月6日 晚上

PPT: https://www.nvidia.cn/content/dam/en-zz/zh_cn/assets/webinars/31oct2019c/20191031_MPS_davidwu.pdf
视频: https://info.nvidia.com/228093-ondemand.html (bilibili转载版本)

背景

对于这样一个 cuda 进程 :

发射一个进程和同时发射四个进程, 四个进程的 每个进程 执行时间都是单个进程的 4 倍, 说明实际上进程是 「串行执行」的

Cuda Context

cuda context 是如何切换的

这里以三个进程切换为例:

实际上 GPU 的进程执行是一种 「轮转调度」 的方式, 每个进程的 context 在不断被切换, 每个时刻只有一个进程在 GPU 上执行, 无法达到「并行」, 并且由于上下文切换的开销, 吞吐率反而下降.

Hyper-Q (queue)

Hyper-Q 是一个需要 硬件支持 的特性, 允许多个 CPU 线程或者进程同时 加载任务 到一个 GPU 上, 实现 CUDA kernels 的 并发执行

Hyper Q 支持的连接类型

  • Multi cuda streams
  • Multi cpu threads
  • Multi cpu processes (MPS)

Hyper Q 的好处和限制

有 Hyper Q 和没有 Hyper Q 的区别

示例代码:

当没有 Hyper Q 时 (只有前一个 stream 的最后一个 kernel 和下一个 stream 的第一个 kernel 存在 overlap):

当存在 Hyper Q 时:

MPS (Multi-Process Service)

MPS 的好处和使用限制

最大用户连接数量即 可并发执行的进程数量

MPS 的使用

MPS 的使用无须修改程序代码, 只需要修改程序运行的「模式」

1 - 设置 GPU 的独占模式

相当于设置 GPU 上只允许有一个 context

1
sudo nvidia-smi -i 0 -c EXCLUSIVE_PROCESS

2 - 启动 MPS 守护进程

1
nvidia-cuda-mps-control -d

3 - 查看是否正在执行 MPS 守护进程

1
ps -ef | grep mps

4 - 使用 MPS 运行应用程序

5 - 停止和监视

6 - 性能分析 (nvprof)