3.1 GPU 共享技术:MIG、MPS 与时空多路复用


文档摘要

3.1 GPU 共享技术:MIG、MPS 与时空多路复用 一张 A100 80GB 价值约 2 万美元,如果只给一个轻量推理用,相当于用一辆卡车送一份外卖。GPU 共享技术就是要把这张卡的算力切成多份,让多个 Pod 同时使用——但「怎么切」是个工程难题,MIG、MPS、时分复用给出了三种截然不同的答案。 3.1.1 为什么要 GPU 共享:从独占到满载 回顾 1.1 节讲的「GPU 孤岛」痛点与 2.2 节的「整张独占」限制:原生 Device Plugin 机制下,一张 GPU 只能给一个 Pod。这在两类场景下浪费极其严重: 轻量推理:许多推理服务(小模型、低 QPS)单卡只用 10%-20% 算力,独占一张 GPU 是巨大浪费。

3.1 GPU 共享技术:MIG、MPS 与时空多路复用

一张 A100 80GB 价值约 2 万美元,如果只给一个轻量推理用,相当于用一辆卡车送一份外卖。GPU 共享技术就是要把这张卡的算力切成多份,让多个 Pod 同时使用——但「怎么切」是个工程难题,MIG、MPS、时分复用给出了三种截然不同的答案。

3.1.1 为什么要 GPU 共享:从独占到满载

回顾 1.1 节讲的「GPU 孤岛」痛点与 2.2 节的「整张独占」限制:原生 Device Plugin 机制下,一张 GPU 只能给一个 Pod。这在两类场景下浪费极其严重:

  • 轻量推理:许多推理服务(小模型、低 QPS)单卡只用 10%-20% 算力,独占一张 GPU 是巨大浪费。
  • 开发调试:算法工程师调试时往往只用 1-2GB 显存,独占整张卡更浪费。

GPU 共享的目标是让多个 Pod「共用一张物理 GPU」,按各自的算力需求分摊成本。但共享面临三个核心难题:

  1. 隔离性:一个 Pod 的崩溃(如显存 OOM)不应影响其他 Pod。
  2. 公平性:多个 Pod 之间如何分配算力,避免互相抢占。
  3. 故障爆炸半径:硬件故障时影响范围多大。

业界给出了三种共享技术,按隔离强度从高到低分别是 MIG(硬件分区)MPS(软件共享)时分多路复用

3.1.2 MIG:硬件级分区,强隔离

MIG(Multi-Instance GPU,多实例 GPU) 是 NVIDIA 在 Ampere 架构(A100、A30)及以后引入的硬件级 GPU 分区能力。它把一张物理 GPU 在硬件层面切成最多 7 个独立的「实例」,每个实例拥有自己的:

  • 计算核心(SM,Streaming Multiprocessor)
  • 显存(独立的 HBM 分区)
  • 缓存显存控制器

每个 MIG 实例对操作系统和容器来说,看起来就像一张独立的 GPU,有自己的 /dev/nvidiaX 设备文件。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 380" font-family="sans-serif" font-size="13"> <text x="360" y="24" text-anchor="middle" font-size="15" font-weight="bold">MIG:一张 A100 切成 7 个独立实例</text> <!-- 物理 GPU 外框 --> <rect x="40" y="50" width="640" height="240" rx="8" fill="#1e293b" stroke="#0f172a"/> <text x="60" y="75" fill="#94a3b8" font-size="12">物理 A100 80GB(7 个 SM 分区 + 显存分区)</text> <!-- 7 个 MIG 实例 --> <g font-size="11" fill="#0f172a"> <rect x="55" y="95" width="80" height="180" rx="4" fill="#dbeafe" stroke="#2563eb"/> <text x="95" y="115" text-anchor="middle" font-weight="bold">MIG 1</text> <text x="95" y="135" text-anchor="middle">1/7 SM</text> <text x="95" y="155" text-anchor="middle">10GB</text> <text x="95" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod A</text> <rect x="145" y="95" width="80" height="180" rx="4" fill="#dbeafe" stroke="#2563eb"/> <text x="185" y="115" text-anchor="middle" font-weight="bold">MIG 2</text> <text x="185" y="135" text-anchor="middle">1/7 SM</text> <text x="185" y="155" text-anchor="middle">10GB</text> <text x="185" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod B</text> <rect x="235" y="95" width="80" height="180" rx="4" fill="#dbeafe" stroke="#2563eb"/> <text x="275" y="115" text-anchor="middle" font-weight="bold">MIG 3</text> <text x="275" y="135" text-anchor="middle">1/7 SM</text> <text x="275" y="155" text-anchor="middle">10GB</text> <text x="275" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod C</text> <rect x="325" y="95" width="80" height="180" rx="4" fill="#fef9c3" stroke="#ca8a04"/> <text x="365" y="115" text-anchor="middle" font-weight="bold">MIG 4</text> <text x="365" y="135" text-anchor="middle">2/7 SM</text> <text x="365" y="155" text-anchor="middle">20GB</text> <text x="365" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod D</text> <rect x="415" y="95" width="80" height="180" rx="4" fill="#dbeafe" stroke="#2563eb"/> <text x="455" y="115" text-anchor="middle" font-weight="bold">MIG 5</text> <text x="455" y="135" text-anchor="middle">1/7 SM</text> <text x="455" y="155" text-anchor="middle">10GB</text> <text x="455" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod E</text> <rect x="505" y="95" width="80" height="180" rx="4" fill="#dcfce7" stroke="#16a34a"/> <text x="545" y="115" text-anchor="middle" font-weight="bold">MIG 6</text> <text x="545" y="135" text-anchor="middle">1/2 SM</text> <text x="545" y="155" text-anchor="middle">20GB</text> <text x="545" y="185" text-anchor="middle" font-size="10" fill="#475569">Pod F(大)</text> </g> <text x="40" y="320" font-size="12" fill="#475569">特点:硬件隔离、故障爆炸半径 = 1 个实例、显存与算力物理切分、需 Ampere 及以上 GPU</text> <text x="40" y="345" font-size="12" fill="#16a34a" font-style="italic">适合:多租户生产推理、强隔离要求、独立显存配额</text> </svg>

MIG 的优势与限制

维度 MIG
隔离性 极强(硬件级,互不影响)
故障爆炸半径 单实例
显存隔离 物理分区
算力隔离 物理分区
支持型号 A100、A30、H100 等 Ampere+
切分粒度 固定档位(1g.5gb、2g.10gb、3g.20gb 等)
切换灵活性 较差(需停机重配)

💡 判读:MIG 是「用硬件隔离换强安全」的代表。如果你的集群有多租户、对故障隔离要求高(如对外提供 GPU 云服务),MIG 是首选。代价是切分粒度固定、切换需要重配,灵活性较差。

3.1.3 MPS:软件级共享,高吞吐

MPS(Multi-Process Service,多进程服务) 是 NVIDIA 的软件级 GPU 共享方案。它的核心是让多个进程的 CUDA 请求通过一个 MPS Server(共享控制进程) 提交给 GPU,从而:

  • 多个进程共享同一张 GPU 的计算核心与显存。
  • 通过 MPS Server 协调多个进程的 kernel 并发执行,减少上下文切换开销。
  • 相比「裸共享」(多个进程直接抢一张卡),MPS 提供更好的并发吞吐。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 320" font-family="sans-serif" font-size="13"> <text x="300" y="24" text-anchor="middle" font-size="15" font-weight="bold">MPS:多进程经 MPS Server 共享 GPU</text> <!-- 容器/进程 --> <rect x="30" y="60" width="100" height="50" rx="6" fill="#dbeafe" stroke="#2563eb"/> <text x="80" y="90" text-anchor="middle">Pod A</text> <rect x="30" y="130" width="100" height="50" rx="6" fill="#dbeafe" stroke="#2563eb"/> <text x="80" y="160" text-anchor="middle">Pod B</text> <rect x="30" y="200" width="100" height="50" rx="6" fill="#dbeafe" stroke="#2563eb"/> <text x="80" y="230" text-anchor="middle">Pod C</text> <!-- MPS Server --> <rect x="220" y="110" width="140" height="90" rx="8" fill="#fef9c3" stroke="#ca8a04"/> <text x="290" y="145" text-anchor="middle" font-weight="bold">MPS Server</text> <text x="290" y="170" text-anchor="middle" font-size="11">协调 kernel 并发</text> <!-- 物理卡 --> <rect x="430" y="100" width="140" height="110" rx="8" fill="#fce7f3" stroke="#db2777"/> <text x="500" y="135" text-anchor="middle" font-weight="bold">物理 GPU</text> <text x="500" y="160" text-anchor="middle" font-size="11">全部 SM 共享</text> <text x="500" y="180" text-anchor="middle" font-size="11">全部显存共享</text> <!-- 箭头 --> <line x1="130" y1="85" x2="220" y2="140" stroke="#475569" marker-end="url(#arr3)"/> <line x1="130" y1="155" x2="220" y2="155" stroke="#475569" marker-end="url(#arr3)"/> <line x1="130" y1="225" x2="220" y2="170" stroke="#475569" marker-end="url(#arr3)"/> <line x1="360" y1="155" x2="430" y2="155" stroke="#475569" marker-end="url(#arr3)"/> <defs> <marker id="arr3" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"> <path d="M0,0 L8,3 L0,6 z" fill="#475569"/> </marker> </defs> <text x="30" y="290" font-size="12" fill="#475569">特点:软隔离、高吞吐(并发 kernel)、显存共享但无硬隔离、MPS Server 单点</text> <text x="30" y="310" font-size="12" fill="#16a34a" font-style="italic">适合:同团队多 Pod、追求吞吐、对隔离要求中等</text> </svg>

MPS 的优势与限制

维度 MPS
隔离性 中等(共享进程,软件级)
故障爆炸半径 MPS Server 挂则全部受影响
显存隔离 无硬隔离(软限制)
算力隔离 共享但并发更高效
支持型号 较广(Pascal 及之后)
切分粒度 灵活(按进程)
切换灵活性 好(动态加入/退出)

⚠️ MPS 的关键风险:MPS Server 是单点,它崩溃会影响所有共享的进程。此外显存无硬隔离,一个 Pod 的 OOM 可能影响其他 Pod。MPS 较新的版本(CUDA 11+)引入了资源限制(cGPU、MPS resource limits)来缓解,但隔离强度仍弱于 MIG。

3.1.4 时分多路复用:时间片轮转

时分多路复用(Time-Slicing / Time-Division Multiplexing) 是最朴素的共享方案:让多个 Pod 在时间维度上轮转使用 GPU。NVIDIA 的 TIME-SLICING 配置(通过 Device Plugin 开启)就是这种方案。

它的工作原理是:每个 Pod 看到完整的 GPU(设备文件、显存地址空间都一样),但 GPU 在多个 Pod 之间快速切换(类似 CPU 的时分复用)。当一个 Pod 的 kernel 在执行时,其他 Pod 等待。

维度 时分多路复用
隔离性 (共享地址空间)
故障爆炸半径 大(一个 Pod 影响全部)
显存隔离
算力隔离 时间片公平轮转
支持型号 几乎所有 NVIDIA GPU
切分粒度 灵活
切换灵活性 极好
适用 开发调试、低优先级任务

💡 判读:时分复用相当于「多个 Pod 抢一张卡」,配置最简单、兼容性最好,但隔离最弱。适合开发调试、内部低优先级任务,不适合多租户生产推理。

3.1.5 三种共享技术对比

把三种技术放在一张表里,隔离性、吞吐、故障爆炸半径、灵活性四维对比:

维度 MIG MPS 时分复用
隔离层级 硬件 软件(共享进程) 无(共享地址空间)
隔离强度 ★★★★★ ★★★
吞吐 中(独立分区,无并发优化) (kernel 并发) 低(串行切换)
故障爆炸半径 1 实例 全部(MPS Server 单点) 全部
显存隔离 物理分区 软限制
切分粒度 固定档位 灵活 灵活
切换灵活性 差(需重配) 极好
支持型号 Ampere+ Pascal+ 几乎全部
适用场景 多租户生产、强隔离 同团队高吞吐 开发调试、低优先级

3.1.6 K8s 中如何使用 GPU 共享

K8s 原生的 Extended Resource 只支持整张分配。要使用 GPU 共享,需要额外的插件层:

共享技术 K8s 集成方式
MIG NVIDIA Device Plugin 原生支持 MIG,节点配置 MIG 策略后,Device Plugin 上报 MIG 实例为独立资源(如 nvidia.com/mig-1g.5gb
MPS NVIDIA Device Plugin 配置 MPS 模式,或用第三方 GPU 共享调度器(如 HAMi、Volcano GPU 共享)
时分复用 NVIDIA Device Plugin 配置 --time-slicing 参数,把一张卡上报为多个虚拟资源

一个 MIG 资源声明的伪代码:

resources: limits: nvidia.com/mig-1g.10gb: 1 # 申请 1 个 1g.10gb 的 MIG 实例

这种声明让 K8s 调度器把 Pod 调度到「还有 mig-1g.10gb 余量」的节点上,并由 Device Plugin + CDI 把对应的 MIG 实例注入容器。

3.1.7 共享 GPU 在云原生 AI 中的典型组合

实际生产中,三种共享技术常按场景组合使用:

  • 多租户推理平台:用 MIG 切分 GPU,每个租户一个 MIG 实例,强隔离。
  • 同团队 LLM 推理:用 MPS 共享 A100,多个推理副本高吞吐共用一张卡。
  • 开发调试集群:用时分复用,让 10 个工程师的 notebook 共用一张 T4。
  • 混合:H100 训练池独占(不共享),L20 推理池用 MIG 共享,T4 调试池时分复用。

⚠️ 选型避坑:共享 GPU 最大的坑是「隔离失效导致雪崩」。比如用 MPS 共享时,一个 Pod 显存失控把整张卡吃满,所有 Pod 一起 OOM。生产部署前要做混沌测试(详见第 8 章),模拟 Pod 失控场景验证隔离边界。

3.1.8 共享之外:还要算清「利用率账」

GPU 共享只是把单卡利用率打高的手段之一,但「利用率」本身需要分清几层含义,避免被单一指标误导:

利用率指标 含义 共享技术能否提升
SM 利用率 计算核心繁忙比例 间接(让多任务填满空闲)
显存利用率 显存占用比例 是(共享后总占用提高)
有效吞吐利用率 实际完成的推理/训练量 是(这是真正的目标)

💡 判读:很多团队把「SM 利用率高」当成功指标,但 SM 满载也可能是「在等内存、在重算、在做无用功」。真正应该盯的是「单位算力下的有效产出」(如每张卡每秒完成的请求数)。这是第 8 章可观测性要讲清的核心理念。

本节小结

  • GPU 共享的目标是把独占模式下 20%-40% 的利用率推向 80%+,三种技术按隔离强度递减:MIG > MPS > 时分复用。
  • MIG 是硬件级分区,强隔离、固定粒度,适合多租户生产;MPS 是软件共享,高吞吐、灵活,适合同团队高并发;时分复用 最简单但隔离最弱,适合开发调试。
  • 隔离性、吞吐、故障爆炸半径三者存在权衡:隔离越强,灵活性越差、并发优化越弱。
  • K8s 中通过 NVIDIA Device Plugin 配置 MIG/MPS/TIME-SLICING 模式,把共享资源上报为可调度的扩展资源。
  • 共享 GPU 的最大风险是隔离失效雪崩,生产部署前必须做混沌测试。
  • 利用率指标要看「有效吞吐」而非单一 SM 利用率,这是后续可观测性的核心理念。

下一节《3.2 拓扑感知调度:NVLink、PCIe 与 RDMA 亲和》将讲清分布式训练的通信瓶颈与拓扑优化的工程价值。


发布者: 作者: 灏天文库 转发
评论区 (0)
U