GPU 共享与调度:MPS、MIG 与多租户隔离

GPU 昂贵且常常利用率不足,共享是必然选择。MPS 做进程级并发、MIG 做硬件级切分、时间片做抢占式复用,三者隔离强度与利用率各不相同。本文讲透 MPS、MIG 与时间片共享的原理差异、多租户隔离的边界,以及 Kubernetes 上的 GPU 调度实践与生产选型。

GPU 是集群里最贵也最容易闲置的资源:一个推理服务往往吃不满整卡,多个小服务却各占一张卡。共享 GPU 是提升利用率的必然选择,但共享方式决定了隔离强度——MPS 做进程级并发、MIG 做硬件级切分、时间片做抢占式复用。本文讲透三者的原理与隔离边界、多租户的显存/算力/故障隔离,以及 K8s 上的 GPU 调度与选型。

前置:/ai-llm-inference-architecture/(推理服务架构)、/ai-inference-benchmark/(性能基准方法)、/ai-serverless-inference/(无服务器与弹性)。

目录

1. 为什么需要 GPU 共享

先看清 GPU 的利用率现状与共享的价值。

现实问题:
□ 一张 A100 80 GB 常常只被一个服务用掉一半
□ 小模型推理(7B 以下)单卡利用率可能只有 10~30%
□ 多团队各自申请整卡 → 集群碎片化、成本高
□ 训练与推理混部时,训练间隙 GPU 空闲

共享的收益:
□ 提升利用率:多个负载填满同一张卡
□ 降低成本:小服务不必独占整卡
□ 提高弹性:按需分配算力切片
□ 支撑多租户:一个集群服务多个团队

共享的代价:
□ 隔离减弱:互相干扰(显存、算力、故障)
□ 性能不确定:共享导致延迟抖动
□ 复杂度上升:调度、配额、监控都要重做
核心权衡:
□ 隔离强度 ↑ → 利用率 ↓(MIG 最隔离也最浪费)
□ 利用率 ↑ → 隔离强度 ↓(时间片最省也最互相干扰)
→ 没有免费午餐,按场景选点

工程要点:GPU 共享的驱动力是利用率与成本——小服务独占整卡浪费严重。但共享必然削弱隔离,形成「隔离强度 vs 利用率」的核心权衡。务实做法是按场景选点:生产核心服务要强隔离,弹性负载可容忍弱隔离。

2. GPU 共享的三个层次

共享方式按「隔离强度」从弱到强分三层。

三个层次:
□ 层 1:时间片共享(Time-slicing)
  - 多个进程轮流用 GPU,显存不隔离
  - 隔离最弱,利用率最高,延迟抖动最大
  - 由 NVIDIA 驱动原生支持(默认行为)
□ 层 2:MPS(Multi-Process Service)
  - 多进程并发执行,共享 SM
  - 隔离中等,可设显存上限与算力占比
  - 需要常驻 MPS 控制进程
□ 层 3:MIG(Multi-Instance GPU)
  - 硬件级切分,SM/显存/带宽物理隔离
  - 隔离最强,但切分粒度固定、不可超卖
  - 仅 A100/H100 等高端卡支持
对照表:
维度          时间片        MPS          MIG
隔离强度      弱            中           强
显存隔离      无            软限制       硬件隔离
算力隔离      无            可限占比     硬件隔离
故障隔离      无            部分         完全
利用率        最高          高           最低
支持硬件      全部          较新卡       高端卡
配置复杂度    低            中           中高

工程要点:GPU 共享分三层——时间片(最省、隔离最弱)、MPS(并发执行、软隔离)、MIG(硬件切分、强隔离)。选型看「隔离强度需求」与「硬件支持」:要强隔离且硬件支持就用 MIG,要灵活性用 MPS,要简单直接就用时间片。

3. MPS:多进程服务与并发执行

MPS 让多个进程真正「并发」使用 GPU,而不是轮流。

MPS 的原理:
□ 传统多进程:各进程的 kernel 串行执行(时间片轮转)
□ MPS:多个进程的 kernel 在 SM 上并发执行
□ 用一个常驻的 MPS 控制进程(daemon)管理
□ 各客户端进程连接到控制进程 → 共享 CUDA context
# 启动 MPS 控制进程
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log
nvidia-cuda-mps-control -d

# 设置默认算力占比(如 30%)
echo "set_default_active_thread_percentage 30" | nvidia-cuda-mps-control

# 显存上限(每客户端)
export CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=50

# 停止
echo quit | nvidia-cuda-mps-control
MPS 的能力:
□ 并发执行:小 kernel 填满 SM 的空闲
□ 算力配额:active_thread_percentage 限制每进程的 SM 占用
□ 显存限制:可设每客户端的显存上限(软限制)
□ 提升利用率:尤其适合「多个小模型」场景

MPS 的局限:
□ 隔离是「软」的:一个进程崩溃可能拖垮控制进程
□ 显存不是硬隔离(可被绕过)
□ 不支持 MIG 的硬件级划分
□ 调试困难:错误可能跨进程传播

工程要点:MPS 用常驻控制进程让多进程的 kernel 在 SM 上并发执行,比时间片轮转更高效,并可通过 active_thread_percentage 做算力配额。但隔离是软性的——崩溃会传播、显存可绕过、调试困难。MPS 适合「多个小模型共享一卡」且能容忍软隔离的场景。

4. MIG:多实例 GPU 与硬件切分

MIG 是唯一提供硬件级隔离的方案。

MIG 的原理:
□ 把一张 GPU 物理切分成多个独立实例
□ 每个实例有独立的 SM、显存、L2 缓存、带宽
□ 实例之间完全隔离(一个崩了不影响另一个)
□ 从驱动的角度,每个实例像一张独立的卡
A100 的切分档位(示例):
□ 1g.5gb  : 1/7 算力,5 GB 显存
□ 2g.10gb : 2/7 算力,10 GB 显存
□ 3g.20gb : 3/7 算力,20 GB 显存
□ 7g.40gb : 整卡(7/7)
□ 可组合多个实例(如 2×3g + 1×1g)
□ H100 支持更多组合与更大显存
# MIG 操作
nvidia-smi mig -lgip                 # 列出可用的 GPU 实例配置
nvidia-smi mig -cgi 9,9,9 -C         # 创建 3 个实例
nvidia-smi mig -lgi                  # 列出已创建的实例
nvidia-smi -L                        # 查看 MIG 设备
# 使用:CUDA_VISIBLE_DEVICES=MIG-GPU-xxx/1/0
MIG 的优劣:
□ 优点:强隔离(显存、算力、故障)、可预测性能
□ 优点:适合多租户、生产核心服务
□ 缺点:切分粒度固定(不能超卖、不能动态调整)
□ 缺点:小切片利用率低(如 1g 只 5 GB 显存)
□ 缺点:仅高端卡支持(A100/H100/H200)

工程要点:MIG 是唯一的硬件级隔离方案——把 GPU 物理切成独立实例,各有独立 SM/显存/带宽,故障完全隔离。适合多租户与生产核心服务。代价是切分粒度固定、不可超卖、小切片浪费,且仅高端卡支持。需要强隔离时,MIG 是首选。

5. 时间片共享与抢占式复用

最简单也最常用的共享方式。

时间片共享的原理:
□ NVIDIA 驱动默认行为:多进程轮流使用 GPU
□ 每个进程获得一个时间片,交替执行
□ 显存不隔离(所有进程共享整卡显存)
□ 上下文切换有开销(尤其显存大的进程)
时间片的特点:
□ 优点:零配置、支持所有 GPU、利用率高
□ 缺点:显存不隔离(一个进程 OOM 可能影响其他)
□ 缺点:延迟抖动大(上下文切换 + 排队)
□ 缺点:无算力配额(谁抢到谁用)
抢占式与弹性复用:
□ 训练任务被高优先级推理任务抢占
□ 检查点保存 → 让出 GPU → 恢复后继续
□ 适合「训练用空闲算力、推理优先」的混部
□ 实现:调度器 + 检查点机制 + 优先级队列
时间片适用场景:
□ 开发/测试环境(容忍抖动)
□ 非延迟敏感的批处理
□ 突发负载的弹性复用
□ 不适合:延迟敏感的生产服务

工程要点:时间片共享是驱动默认行为,零配置、支持所有 GPU、利用率最高,但显存不隔离、延迟抖动大、无算力配额。适合开发测试与非延迟敏感负载;抢占式复用(训练让位推理 + 检查点)是混部场景的常见模式。延迟敏感的生产服务不应依赖时间片。

6. 多租户隔离:显存、算力与故障

多租户的核心诉求是「互不干扰」,要分三个维度看。

三个隔离维度:
□ 显存隔离:A 租户的显存不被 B 挤占
  - MIG:硬件隔离(最强)
  - MPS:软限制(可设上限,可绕过)
  - 时间片:无隔离
□ 算力隔离:A 租户不抢光 B 的 SM
  - MIG:硬件隔离(按切片)
  - MPS:active_thread_percentage 配额
  - 时间片:无配额
□ 故障隔离:A 的进程崩溃不拖垮 B
  - MIG:完全隔离
  - MPS:部分(崩溃可能传播)
  - 时间片:弱(OOM 影响全局)
隔离能力对照:
维度        时间片    MPS      MIG
显存        无        软       硬
算力        无        配额     硬
故障        弱        部分     完全
性能可预测  差        中       好
多租户的额外考量:
□ 数据安全:不同租户的模型/数据不能互相访问
□ 配额管理:每租户的算力/显存配额
□ 计量计费:按使用量计费需要精确计量
□ 噪声邻居:一个租户的负载影响其他租户性能

工程要点:多租户隔离要看显存、算力、故障三个维度——MIG 三维全硬隔离,MPS 提供软隔离与算力配额,时间片基本无隔离。选择隔离方案就是选择「隔离强度」与「利用率」的平衡点。此外还要考虑数据安全、配额、计量与噪声邻居。

7. Kubernetes 上的 GPU 调度

生产环境的 GPU 共享最终落到 K8s 调度。

K8s GPU 调度的层次:
□ 设备插件(Device Plugin):nvidia-device-plugin 暴露 GPU 资源
□ 资源请求:nvidia.com/gpu: 1(默认整卡)
□ 共享扩展:
  - 时间片:配置 device plugin 的 sharing 策略
  - MPS:共享模式配置
  - MIG:暴露 MIG 实例为独立资源
# 时间片共享的 device plugin 配置(示意)
# 一个 GPU 被 4 个 Pod 共享
apiVersion: v1
kind: ConfigMap
metadata:
  name: nvidia-device-plugin-config
data:
  config: |
    version: v1
    sharing:
      timeSlicing:
        resources:
          - name: nvidia.com/gpu
            replicas: 4        # 一个物理卡切成 4 个逻辑卡
MIG 在 K8s 上的调度:
□ 预先创建 MIG 实例(mig-parted 或手动)
□ device plugin 把每个 MIG 实例暴露为独立资源
□ Pod 请求 mig-3g.20gb 等具体档位
□ 调度器按实例粒度分配 → 强隔离
调度框架与生态:
□ Volcano / Kueue:批调度与队列管理
□ 优先级与抢占:高优先级任务抢占低优先级
□ 拓扑感知:把 Pod 调度到有 MIG 实例的节点
□ GPU 亲和:同节点多卡通信优化

工程要点:K8s 上的 GPU 共享通过 device plugin 实现——时间片用 sharing 配置把一卡切成 N 个逻辑资源,MIG 把每个实例暴露为独立资源。调度层用 Volcano/Kueue 做批调度与抢占,拓扑感知确保 Pod 落到有对应资源的节点。MIG 在 K8s 上提供强隔离,时间片提供高利用率。

8. 生产实践与选型

把 GPU 共享落到生产,按场景选方案。

选型决策树:
□ 延迟敏感的生产服务 + 硬件支持 MIG → MIG
□ 多个小模型共享一卡 + 可容忍软隔离 → MPS
□ 开发测试/批处理/突发负载 → 时间片
□ 训练与推理混部 → 抢占式 + 检查点
□ 强隔离 + 高利用率不可兼得 → 按负载分层
分层共享策略(推荐):
□ 核心服务:MIG 强隔离,保证性能可预测
□ 次要服务:MPS 软隔离 + 算力配额
□ 弹性/批处理:时间片共享,吃满空闲
□ 混部:训练用空闲,推理优先
容量与配额:
□ 按租户设配额(显存 + 算力)
□ 监控每租户的实际用量
□ 超卖要谨慎(MPS/时间片可超卖,MIG 不可)
□ 预留 buffer 应对突发
可观测性:
□ 每 GPU / 每 MIG 实例的利用率
□ 每租户的显存与算力占用
□ 延迟抖动(共享的直接代价)
□ 抢占事件与频率

工程要点:生产选型按场景——核心服务用 MIG 强隔离,次要服务用 MPS 软隔离 + 配额,弹性负载用时间片。分层共享是推荐策略:不同重要性的负载用不同隔离强度。配额、超卖策略(MPS/时间片可超卖、MIG 不可)与可观测性是运营三要素。

9. 常见坑与排查

GPU 共享的坑集中在「隔离假象」与「性能抖动」。

高频踩坑:
□ 以为时间片有显存隔离 → 一个进程 OOM 拖垮其他
□ MPS 控制进程崩溃 → 所有客户端挂掉
□ MIG 切片太小 → 大模型放不下(显存不够)
□ 共享后延迟抖动大 → 违反 SLA(未做隔离)
□ 超卖过度 → 争抢导致性能雪崩
□ device plugin 未配 sharing → 一卡只能一个 Pod
□ MIG 实例创建后忘记销毁 → 资源泄漏
□ 混部未设优先级 → 训练任务饿死推理
□ 计量不准 → 多租户计费纠纷
排查清单:
□ nvidia-smi:查看每进程/每实例的占用
□ 延迟分布(P50/P99):抖动是否来自共享
□ 上下文切换频率:时间片开销
□ MPS 日志:客户端连接与配额是否生效
□ MIG 实例列表:是否有泄漏
□ 配额执行情况:是否有租户超额

工程要点:GPU 共享的坑集中在「隔离假象」(以为时间片有隔离)、MPS 控制进程单点、MIG 切片过小、超卖过度与配额失效。排查先看 nvidia-smi 的进程/实例占用,再分析延迟分布判断抖动来源。MIG 实例泄漏与 MPS 单点故障是运维必须监控的两项。

10. 速查表与一句话记忆

问题一句话答案
为什么共享小服务独占整卡浪费,提升利用率与降本
核心权衡隔离强度 vs 利用率,没有免费午餐
三个层次时间片(弱)、MPS(中)、MIG(强)
MPS 是什么常驻控制进程让多进程 kernel 并发,可设算力配额
MIG 是什么硬件级切分,SM/显存/带宽物理隔离
MIG 代价粒度固定、不可超卖、小切片浪费、仅高端卡
时间片特点零配置、全支持、显存不隔离、抖动大
多租户三维显存、算力、故障隔离
K8s 怎么做device plugin 的 sharing 配置 / MIG 实例暴露
推荐策略分层:核心 MIG、次要 MPS、弹性时间片

一句话记忆:GPU 共享 = 时间片(最省、无隔离)+ MPS(并发、软隔离、可配额)+ MIG(硬件切分、强隔离)——核心权衡是「隔离强度 vs 利用率」,多租户看显存/算力/故障三维隔离,生产推荐分层共享(核心 MIG、次要 MPS、弹性时间片)。

延伸阅读

  • /ai-llm-inference-architecture/ — 推理服务架构与部署形态
  • /ai-inference-benchmark/ — 性能基准与延迟分布测量
  • /ai-serverless-inference/ — 弹性伸缩与冷启动
  • /ai-distributed-inference-gpu-cluster/ — GPU 集群与拓扑
  • /ai-llm-serving-observability/ — 服务可观测性与指标
  • Kubernetes 专题 — 容器调度与资源管理

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「ai」更多文章

  1. 异构推理硬件:ROCm、Intel 与国产 NPU 适配实践
  2. 前缀缓存与语义缓存:KV 复用与重复计算消除
  3. 长上下文推理:RoPE 扩展、位置插值与 Ring Attention