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 是巨大浪费。
一张 A100 80GB 价值约 2 万美元,如果只给一个轻量推理用,相当于用一辆卡车送一份外卖。GPU 共享技术就是要把这张卡的算力切成多份,让多个 Pod 同时使用——但「怎么切」是个工程难题,MIG、MPS、时分复用给出了三种截然不同的答案。
回顾 1.1 节讲的「GPU 孤岛」痛点与 2.2 节的「整张独占」限制:原生 Device Plugin 机制下,一张 GPU 只能给一个 Pod。这在两类场景下浪费极其严重:
GPU 共享的目标是让多个 Pod「共用一张物理 GPU」,按各自的算力需求分摊成本。但共享面临三个核心难题:
业界给出了三种共享技术,按隔离强度从高到低分别是 MIG(硬件分区)、MPS(软件共享)、时分多路复用。
MIG(Multi-Instance GPU,多实例 GPU) 是 NVIDIA 在 Ampere 架构(A100、A30)及以后引入的硬件级 GPU 分区能力。它把一张物理 GPU 在硬件层面切成最多 7 个独立的「实例」,每个实例拥有自己的:
每个 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 |
|---|---|
| 隔离性 | 极强(硬件级,互不影响) |
| 故障爆炸半径 | 单实例 |
| 显存隔离 | 物理分区 |
| 算力隔离 | 物理分区 |
| 支持型号 | A100、A30、H100 等 Ampere+ |
| 切分粒度 | 固定档位(1g.5gb、2g.10gb、3g.20gb 等) |
| 切换灵活性 | 较差(需停机重配) |
💡 判读:MIG 是「用硬件隔离换强安全」的代表。如果你的集群有多租户、对故障隔离要求高(如对外提供 GPU 云服务),MIG 是首选。代价是切分粒度固定、切换需要重配,灵活性较差。
MPS(Multi-Process Service,多进程服务) 是 NVIDIA 的软件级 GPU 共享方案。它的核心是让多个进程的 CUDA 请求通过一个 MPS Server(共享控制进程) 提交给 GPU,从而:
<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 Server 挂则全部受影响 |
| 显存隔离 | 无硬隔离(软限制) |
| 算力隔离 | 共享但并发更高效 |
| 支持型号 | 较广(Pascal 及之后) |
| 切分粒度 | 灵活(按进程) |
| 切换灵活性 | 好(动态加入/退出) |
⚠️ MPS 的关键风险:MPS Server 是单点,它崩溃会影响所有共享的进程。此外显存无硬隔离,一个 Pod 的 OOM 可能影响其他 Pod。MPS 较新的版本(CUDA 11+)引入了资源限制(cGPU、MPS resource limits)来缓解,但隔离强度仍弱于 MIG。
时分多路复用(Time-Slicing / Time-Division Multiplexing) 是最朴素的共享方案:让多个 Pod 在时间维度上轮转使用 GPU。NVIDIA 的 TIME-SLICING 配置(通过 Device Plugin 开启)就是这种方案。
它的工作原理是:每个 Pod 看到完整的 GPU(设备文件、显存地址空间都一样),但 GPU 在多个 Pod 之间快速切换(类似 CPU 的时分复用)。当一个 Pod 的 kernel 在执行时,其他 Pod 等待。
| 维度 | 时分多路复用 |
|---|---|
| 隔离性 | 弱(共享地址空间) |
| 故障爆炸半径 | 大(一个 Pod 影响全部) |
| 显存隔离 | 无 |
| 算力隔离 | 时间片公平轮转 |
| 支持型号 | 几乎所有 NVIDIA GPU |
| 切分粒度 | 灵活 |
| 切换灵活性 | 极好 |
| 适用 | 开发调试、低优先级任务 |
💡 判读:时分复用相当于「多个 Pod 抢一张卡」,配置最简单、兼容性最好,但隔离最弱。适合开发调试、内部低优先级任务,不适合多租户生产推理。
把三种技术放在一张表里,隔离性、吞吐、故障爆炸半径、灵活性四维对比:
| 维度 | MIG | MPS | 时分复用 |
|---|---|---|---|
| 隔离层级 | 硬件 | 软件(共享进程) | 无(共享地址空间) |
| 隔离强度 | ★★★★★ | ★★★ | ★ |
| 吞吐 | 中(独立分区,无并发优化) | 高(kernel 并发) | 低(串行切换) |
| 故障爆炸半径 | 1 实例 | 全部(MPS Server 单点) | 全部 |
| 显存隔离 | 物理分区 | 软限制 | 无 |
| 切分粒度 | 固定档位 | 灵活 | 灵活 |
| 切换灵活性 | 差(需重配) | 好 | 极好 |
| 支持型号 | Ampere+ | Pascal+ | 几乎全部 |
| 适用场景 | 多租户生产、强隔离 | 同团队高吞吐 | 开发调试、低优先级 |
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 实例注入容器。
实际生产中,三种共享技术常按场景组合使用:
⚠️ 选型避坑:共享 GPU 最大的坑是「隔离失效导致雪崩」。比如用 MPS 共享时,一个 Pod 显存失控把整张卡吃满,所有 Pod 一起 OOM。生产部署前要做混沌测试(详见第 8 章),模拟 Pod 失控场景验证隔离边界。
GPU 共享只是把单卡利用率打高的手段之一,但「利用率」本身需要分清几层含义,避免被单一指标误导:
| 利用率指标 | 含义 | 共享技术能否提升 |
|---|---|---|
| SM 利用率 | 计算核心繁忙比例 | 间接(让多任务填满空闲) |
| 显存利用率 | 显存占用比例 | 是(共享后总占用提高) |
| 有效吞吐利用率 | 实际完成的推理/训练量 | 是(这是真正的目标) |
💡 判读:很多团队把「SM 利用率高」当成功指标,但 SM 满载也可能是「在等内存、在重算、在做无用功」。真正应该盯的是「单位算力下的有效产出」(如每张卡每秒完成的请求数)。这是第 8 章可观测性要讲清的核心理念。
下一节《3.2 拓扑感知调度:NVLink、PCIe 与 RDMA 亲和》将讲清分布式训练的通信瓶颈与拓扑优化的工程价值。