MPS 是干什么的
MPS(Multi-Process Service)让同一张 GPU 上的多个进程共享计算资源,把原本互相串行的多个 CUDA 上下文合并调度,从而提高资源利用率。它做的是资源复用而不是硬隔离:进程之间没有强隔离保证,和 MIG 的定位完全不同。
基本信息
| 机制 | 多进程共享同一张卡的调度 |
|---|---|
| 控制命令 | nvidia-cuda-mps-control |
| 适合 | 同卡多进程、小批量并发 |
| 不适合 | 强隔离与计费隔离(选 MIG) |
| 前置条件 | 各客户端 CUDA 版本与配置口径一致 |
典型使用场景
- 单卡上跑多个互相独立的推理小进程,各自并发都很低
- 开发机多人共用一张卡做轻量测试
- 多个小模型常驻,单独起进程比塞进一个框架更简单
- 老框架没有批处理调度能力,用 MPS 摊薄上下文切换开销
- 同卡上跑大量短生命周期小任务,反复创建上下文的开销占比过高
启用与停止
启用与停止
nvidia-cuda-mps-control -d # 启动控制守护进程
echo get_server_list | nvidia-cuda-mps-control # 查看已注册的客户端
echo quit | nvidia-cuda-mps-control # 停止守护进程
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps # 自定义通信目录(可选)
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log # 日志目录(可选)MPS 与 MIG 的差别
| 维度 | MPS | MIG |
|---|---|---|
| 目标 | 资源复用、提高利用率 | 硬隔离与配额管理 |
| 隔离性 | 无强隔离 | 显存与算力分区隔离 |
| 配置粒度 | 进程级共享 | 实例级,通常需重配重启 |
| 典型场景 | 同卡多小进程 | 多租户与计费隔离 |
容器场景下推理框架自身会调度多请求,MPS 的收益主要出现在「多个互相独立的进程各占一点资源」的部署形态,别把它当成通用的吞吐优化开关。
MPS 与 MIG 不要混用:两者作用对象不同,同卡同时配置时行为受限且难排查,先明确是要复用还是要隔离,再选其中一种。
开启前后用同一份负载对比利用率与吞吐再决定是否保留:客户端进程本身并发已经不低时,MPS 带来的收益通常有限。