GPU

MIG

·34 分钟阅读·13453 字

解析 NVIDIA MIG 的硬件切分模型、实例层级、Kubernetes 调度与监控方式

📋 目录

MIG

MIG(Multi-Instance GPU,多实例 GPU)可以理解为 NVIDIA 在部分数据中心 GPU 上提供的一种硬件级 GPU 分区能力:一块物理 GPU 可以被切成多个彼此隔离的 GPU 实例,每个实例拥有相对独立的计算资源、显存资源以及部分引擎资源,可以被不同进程、容器、虚拟机或 Kubernetes 工作负载分别使用。它并不是简单地“限制显存”或者“多个进程共享同一块卡”,而是把 GPU 内部的一部分硬件资源真正划分出去,从而获得更稳定的性能隔离和资源利用率。MIG 从 NVIDIA Ampere 架构开始支持,目前支持的具体 GPU 型号需要以 NVIDIA 的 MIG 支持列表为准。(NVIDIA Docs)


1. 为什么需要 MIG

先考虑没有 MIG 的 GPU。

假设一张 A100 80GB:

Physical GPU
┌─────────────────────────────────────┐
│                                     │
│              A100                   │
│                                     │
│   SM / Tensor Core                  │
│                                     │
│   80 GB HBM                         │
│                                     │
│   L2 Cache                          │
│                                     │
│   Memory Controller                 │
│                                     │
└─────────────────────────────────────┘

如果有一个很小的推理任务,只需要:

10 GB 显存
20% 左右算力

但在 Kubernetes 中为其分配:

resources:
  limits:
    nvidia.com/gpu: 1

传统 GPU 分配模式下,这个 Pod 往往会占用“一整张 GPU”这个调度资源。

于是:

A100 80GB

实际使用:
10GB
少量计算资源

剩下:
70GB + 大量 SM

无法方便地作为独立 GPU 资源分配给另一个 Pod

这会造成昂贵 GPU 的资源浪费。

MIG 的目标就是解决这个问题。


2. MIG 本质上是在切什么

理解 MIG 最重要的地方不是命令,而是 NVIDIA GPU 内部到底被切成了什么。

前文已经建立 GPU 的简化结构:

GPU
│
├── SM
│   ├── CUDA Core
│   └── Tensor Core
│
├── L2 Cache
│
├── Memory Controller
│
├── HBM
│
├── Copy Engine
│
├── Video Engine
│
└── 其他硬件引擎

MIG 会把其中一部分资源按照硬件边界进行划分,包括计算资源和显存子系统。NVIDIA 的定义里有几个非常重要的层次:Memory Slice、SM Slice、GPU Slice、GPU Instance 和 Compute Instance。 (NVIDIA Docs)

可逐一分析。


3. Memory Slice:显存切片

首先是显存系统。

不要把 GPU 显存想成简单的一条:

80 GB HBM

真实硬件更接近:

                HBM
     ┌────┬────┬────┬────┐
     │    │    │    │    │
     ▼    ▼    ▼    ▼    ▼
 Memory Controller Groups
     │
     ▼
    L2 Cache

MIG 会按照 GPU 硬件内部的 memory slice 进行划分。

一个 Memory Slice 不只是:

一部分显存容量。

它还包含对应的:

  • Memory Controller
  • 显存带宽资源
  • 一部分 Cache

因此 MIG 提供的不是:

80GB HBM 中随便划 10GB

而更像:

Memory Slice 0
├── HBM capacity
├── memory controller
└── cache

Memory Slice 1
├── HBM capacity
├── memory controller
└── cache

NVIDIA 当前 MIG 概念文档将 memory slice 定义为 GPU memory 的最小可分资源,其中包含对应的 memory controller 和 cache,并提供独立的显存容量和带宽资源。(NVIDIA Docs)

这也是 MIG 相比简单的软件显存限制更重要的地方。


4. SM Slice:计算资源切片

第二部分是计算资源。

GPU 的主要计算资源在:

SM

Streaming Multiprocessor。

一个 SM 内部包含:

SM
├── CUDA Core
├── Tensor Core
├── Register
├── Shared Memory
└── Scheduler

MIG 会把整个 GPU 的 SM 分成多个 SM Slice。

可以抽象成:

Physical GPU

SM SM SM SM SM SM SM
│  │  │  │  │  │  │
▼  ▼  ▼  ▼  ▼  ▼  ▼
S0 S1 S2 S3 S4 S5 S6

NVIDIA 当前 MIG 概念里,一份 SM slice 大致对应 MIG 模式下 GPU 可用 SM 的约七分之一,不过具体物理资源比例会依 GPU 产品和 profile 而变化。(NVIDIA Docs)

因此当一个 MIG instance 获得:

1g

它实际上就获得了一部分确定的计算资源。


5. GPU Slice:把计算和显存组合起来

只有 SM 还不够,因为 GPU 计算必须访问显存。

所以 NVIDIA 定义了:

GPU Slice

它由:

一个 SM Slice
+
一个 Memory Slice

组合而成。(NVIDIA Docs)

可以抽象成:

GPU Slice
┌────────────────────────┐
│                        │
│       SM Slice         │
│           │            │
│           ▼            │
│      Memory Slice      │
│                        │
│     HBM + Cache        │
└────────────────────────┘

于是整个 GPU 就可以大致想成:

Physical GPU

┌──────┬──────┬──────┬──────┐
│Slice │Slice │Slice │Slice │ ...
│  0   │  1   │  2   │  3   │
└──────┴──────┴──────┴──────┘

MIG profile 就是在组合这些 slice。


6. GPU Instance:GI

由此引出 MIG 的重要概念之一:

GPU Instance,简称 GI。

GI 是由一个或多个 GPU Slice 加上一部分 GPU engines 组成的逻辑 GPU 实例。

例如:

Physical GPU

┌─────────────────────────────────────────┐
│                                         │
│  GI 0              GI 1                │
│ ┌──────────┐      ┌──────────────────┐  │
│ │ 1 Slice  │      │    3 Slices      │  │
│ └──────────┘      └──────────────────┘  │
│                                         │
└─────────────────────────────────────────┘

每个 GI 都拥有自己的:

  • SM 资源
  • Memory Slice
  • HBM 容量
  • HBM bandwidth
  • Cache 资源
  • 部分 GPU engines

因此 GI 之间具有硬件级资源隔离和相对稳定的 QoS。NVIDIA 明确将 MIG 的目标描述为在多个客户端之间提供定义明确的 QoS 和 fault isolation。(NVIDIA Docs)


7. Compute Instance:CI

GI 还能继续切。

这时候就是:

Compute Instance,简称 CI。

一个 GI 的显存资源是这个 GI 内共享的,但是 SM 计算资源可以进一步划分成多个 Compute Instance。(NVIDIA Docs)

例如:

GPU Instance
┌─────────────────────────────────┐
│                                 │
│      Shared Memory Resources    │
│                                 │
│   ┌──────────┐ ┌──────────┐     │
│   │   CI 0   │ │   CI 1   │     │
│   │ SM Slice │ │ SM Slice │     │
│   └──────────┘ └──────────┘     │
│                                 │
└─────────────────────────────────┘

所以层级关系是:

Physical GPU
      │
      ▼
GPU Instance (GI)
      │
      ▼
Compute Instance (CI)

默认情况下,一个 MIG device 通常由一个 GI 和一个占满该 GI 计算资源的 CI 组成;只有在需要进一步细分计算资源的时候,才会继续把 GI 分成多个 CI。(NVIDIA Docs)


8. 1g.10gb 到底是什么意思

这是实际使用 MIG 时最容易遇到的表示法。

例如:

1g.10gb

或者:

2g.20gb

可以将其理解为:

<GPU Slice数量>g.<显存容量>

例如某个具体 GPU 支持:

1g.10gb

1份 GPU compute slice
+
10GB 显存

而:

3g.40gb

3份 GPU compute slice
+
40GB 显存

不过这里要特别注意:

具体 profile 名称、显存大小、可创建数量并不是所有 GPU 都一样。

A100、A30、H100、H200、B200 等型号支持的 MIG profile 不完全相同,所以不能把某一个型号的 1g.10gb 规则机械套给所有卡。NVIDIA 为每种支持 MIG 的 GPU 单独列出了可用 profile 和 placement。(NVIDIA Docs)

所以生产里一定先:

nvidia-smi mig -lgip

查看当前 GPU 真正支持哪些 GI profile,而不是靠记忆写 profile。


9. 一个完整例子:把 GPU 切成多个 MIG 实例

假设一张支持相应 profile 的 GPU。

原来:

                    GPU0

┌──────────────────────────────────────┐
│                                      │
│             80GB HBM                 │
│                                      │
│        全部计算资源                  │
│                                      │
└──────────────────────────────────────┘

切分之后可能形成:

                    GPU0

┌──────────┬──────────┬─────────────────┐
│          │          │                 │
│ MIG 0    │ MIG 1    │ MIG 2           │
│          │          │                 │
│ 小实例   │ 小实例   │ 较大实例        │
│          │          │                 │
└──────────┴──────────┴─────────────────┘

Kubernetes 看见的就不再只是:

nvidia.com/gpu: 1

而可以把 MIG profile 作为不同类型的调度资源暴露出来。


10. MIG 和“多个进程共享 GPU”有什么不同

这是理解 MIG 最关键的问题之一。

假设没有 MIG:

Process A
     \
      \
       GPU
      /
     /
Process B

A、B 都共享:

SM
L2
HBM bandwidth
Memory Controller

如果 A 突然大量使用显存带宽:

A HBM bandwidth ↑↑↑

B 可能马上变慢。

这就是:

noisy neighbor。


而 MIG:

Process A
   │
   ▼
MIG Instance A
   │
   ├── dedicated compute resource
   └── dedicated memory resource


Process B
   │
   ▼
MIG Instance B
   │
   ├── dedicated compute resource
   └── dedicated memory resource

资源隔离是硬件层面的。

所以 A 的高负载不会像普通进程共享那样任意抢走 B 已经划定的 SM 和 memory slice。

这就是 MIG 能提供更稳定 QoS 的根本原因。(NVIDIA Docs)


11. MIG 和 CUDA MPS 的区别

这两个特别容易混。

MPS:

Multi-Process Service。

主要目的是让多个 CUDA process 更有效地共享一个 GPU 的计算资源。

它仍然基本属于:

软件调度 / runtime sharing

可以粗略理解成:

GPU
│
├── Process A
├── Process B
└── Process C

共享大量物理资源

而 MIG:

GPU
│
├── Hardware Partition A
├── Hardware Partition B
└── Hardware Partition C

两者最大的区别可以概括成:

特性MPSMIG
主要层次软件/runtime硬件分区
SM隔离弱强
显存容量隔离有限硬件划分
显存带宽隔离弱更强
QoS有限更确定
故障隔离弱更强
资源粒度更灵活受 profile 限制

因此二者不是完全竞争关系,而是解决不同层次的问题。


12. MIG 和 vGPU 也不是同一个概念

vGPU:

Virtual Machine
       │
      vGPU
       │
Physical GPU

重点是:

虚拟化环境中的 GPU 资源呈现和隔离。

MIG:

Physical GPU
       │
Hardware Partition
       │
MIG Device

重点是:

GPU 芯片内部硬件资源分区。

两者甚至可以组合,例如通过 MIG-backed vGPU 将 MIG 分区用于 VM。NVIDIA 当前文档明确支持这种部署方式。(NVIDIA Docs)


13. MIG 为什么特别适合推理集群

对于大模型训练,通常希望:

8张GPU
16张GPU
64张GPU
甚至数千张GPU

而且单个任务会尽可能吃满整卡。

所以:

大规模训练通常并不是 MIG 最典型的使用场景。

MIG 更适合的是:

推理
小模型
开发测试
Jupyter
数据处理
共享GPU平台

例如一张 GPU 同时服务:

Embedding Service
LLM小模型推理
CV模型
Notebook

它们单独占一整张高端 GPU 都非常浪费。

MIG 就非常合适。


14. 为什么训练不一定适合 MIG

训练任务非常依赖:

GPU compute
HBM bandwidth
NVLink
NCCL

尤其大模型训练往往希望:

整张GPU
       +
整套NVLink/NVSwitch拓扑

这样得到最大的:

Tensor FLOPS
HBM bandwidth
inter-GPU bandwidth

如果把 GPU 切成几个很小的 MIG instance:

GPU
├── MIG0
├── MIG1
├── MIG2
└── MIG3

单个训练 worker 能使用的 SM、HBM capacity 和 bandwidth 都受到 profile 限制。

因此如果任务本身能吃满整卡:

MIG 通常不会给训练带来收益。


15. MIG 真正解决的是 GPU 资源碎片

假设 GPU 集群里很多任务需要:

10GB
20GB
30GB

但 GPU 都是:

80GB

不用 MIG:

Task A → 整张 80GB GPU
Task B → 整张 80GB GPU
Task C → 整张 80GB GPU

实际使用可能只有:

A 10GB
B 15GB
C 20GB

这就是严重浪费。

使用 MIG:

                  GPU 80GB

┌───────────┬───────────┬──────────────┐
│           │           │              │
│ Task A    │ Task B    │ Task C       │
│ MIG       │ MIG       │ MIG          │
│           │           │              │
└───────────┴───────────┴──────────────┘

这时候 GPU utilization 和显存利用率都会明显提高。


16. MIG 模式怎么启用

在支持 MIG 的 GPU 上,可以查看:

nvidia-smi

或者:

nvidia-smi -i 0 --query-gpu=pci.bus_id,mig.mode.current --format=csv

启用:

sudo nvidia-smi -i 0 -mig 1

关闭:

sudo nvidia-smi -i 0 -mig 0

这里存在一个非常重要的架构差异。

对于 Ampere GPU,开启 MIG 通常需要 GPU reset,而且 MIG mode 状态可以跨 reboot 保持;而从 Hopper 及更新架构 开始,启用 MIG mode 不再需要 GPU reset,但 MIG mode 状态通常只在 NVIDIA driver 保持加载期间有效,driver unload/reload 后需要重新配置。(NVIDIA Docs)

这对运维非常重要,因为:

不同代 GPU 的 MIG 生命周期管理方式并不完全一样。


17. 创建 MIG 实例的基本流程

整体流程可以记成:

Physical GPU
      │
      │ Enable MIG
      ▼
 MIG Mode
      │
      │ Create GI
      ▼
GPU Instance
      │
      │ Create CI
      ▼
Compute Instance
      │
      ▼
 MIG Device

首先查看支持的 GI profile:

nvidia-smi mig -lgip

然后可以按照指定 profile 创建 GPU Instance。

再查看 Compute Instance profile:

nvidia-smi mig -lcip

之后创建相应 CI。

实际生产环境通常不会天天手工执行这些命令,而是交给 GPU Operator/MIG Manager 管理。


18. MIG Device 为什么像“一张独立 GPU”

MIG 实例创建完成之后,每个 MIG device 都有自己的标识符。

通常会看到类似:

GPU UUID
   │
   ├── MIG Device UUID
   ├── MIG Device UUID
   └── MIG Device UUID

CUDA application 可以把 MIG device 当成可见计算设备。

因此应用看见的是:

CUDA Device

而不需要自己理解:

这其实只是某张物理 GPU 的一部分。

这正是 MIG 的抽象价值。


19. MIG 在 Kubernetes 中怎么工作

这部分和当前学习的 Kubernetes 很重要。

普通 GPU 节点:

Kubelet
   │
   ▼
NVIDIA Device Plugin
   │
   ▼
GPU0
GPU1
GPU2
GPU3

Device Plugin 向 Kubernetes 注册:

nvidia.com/gpu

例如:

Capacity:
nvidia.com/gpu: 4

开启 MIG 后:

Physical GPU
     │
     ├── MIG 1g.xxgb
     ├── MIG 1g.xxgb
     └── MIG 2g.xxgb

NVIDIA Device Plugin 可以把这些 MIG device 注册成 Kubernetes 可调度资源。


20. Kubernetes 的 MIG Strategy

NVIDIA Device Plugin / GPU Operator 里有一个非常重要的概念:

MIG strategy

主要会看到类似:

none
single
mixed

20.1. none

不使用 MIG:

nvidia.com/gpu

20.2. single

节点上的 GPU 使用一致的 MIG 配置。

从调度器角度,MIG device 以较统一的 GPU 资源模型呈现。

20.3. mixed

允许节点存在不同 MIG profile。

例如:

1g.xxgb
2g.xxgb
3g.xxgb

可以被作为不同扩展资源暴露。

对于共享 GPU 平台,mixed 非常实用,因为可以提供不同规格的 GPU“套餐”。

GPU Operator 支持通过 MIG Manager 管理节点 MIG 配置,并要求在启用 MIG 时选择相应 MIG strategy。(NVIDIA Docs)


21. 它其实非常像云服务器规格

例如云厂商提供:

small
medium
large

MIG 可以让 GPU 也变成:

GPU Small
GPU Medium
GPU Large

例如:

小推理任务
    ↓
小 MIG profile

中型任务
    ↓
中 MIG profile

大型任务
    ↓
大 MIG profile

于是 GPU 平台开始具备一种很重要的能力:

GPU Resource Pooling。

这对 AI Infra 平台非常重要。


22. GPU Operator 如何管理 MIG

在 Kubernetes 中,手工:

nvidia-smi mig ...

不适合大规模节点。

NVIDIA GPU Operator 默认安装的一系列组件中包括:

GPU Driver
Container Toolkit
Device Plugin
DCGM Exporter
MIG Manager

MIG Manager 专门负责节点 MIG 配置生命周期。(NVIDIA Docs)

架构:

             Kubernetes

                 │
           GPU Operator
                 │
           MIG Manager
                 │
                 ▼
             GPU Node
                 │
                 ▼
          Configure MIG
                 │
        ┌────────┼────────┐
        ▼        ▼        ▼
      MIG0      MIG1      MIG2

这样管理员只需要定义节点应该使用什么 MIG profile,而不是 SSH 到几十台机器里执行 nvidia-smi。


23. MIG 监控会发生什么变化

这和前文讨论的 DCGM 很有关。

不用 MIG 时:

DCGM metric

gpu="0"
UUID="GPU-xxxx"

使用 MIG 后,需要知道:

Physical GPU
      │
      ├── GI
      │    └── CI
      │          └── MIG Device

所以监控也必须进入:

MIG entity level。

DCGM 本身支持 MIG hierarchy,DCGM Exporter 可以采集 GPU/MIG 实例级 telemetry,并且能够结合 Kubernetes 工作负载信息关联 Pod。NVIDIA 目前仍推荐 Kubernetes GPU telemetry 使用 DCGM Exporter。(NVIDIA Docs)


24. MIG 环境监控最重要的变化

以前:

Physical GPU
      │
      ▼
GPU Util
Memory Used
Power
Temperature

现在需要变成:

Physical GPU
     │
     ├── Power
     ├── Temperature
     ├── Xid
     │
     └── MIG Instances
             │
             ├── MIG0
             │    ├── compute
             │    └── memory
             │
             └── MIG1
                  ├── compute
                  └── memory

也就是说存在两个监控层级:

24.1. Physical GPU Level

观察:

  • 温度
  • 功耗
  • Xid
  • GPU 整体健康
  • PCIe
  • 硬件错误

24.2. MIG Instance Level

观察:

  • 计算利用率
  • 显存利用率
  • workload
  • Pod
  • 实例级性能

这两个层次不能混为一谈。


25. MIG 并不能隔离所有物理故障

这也是运维很容易误解的地方。

假设:

Physical GPU0
│
├── MIG A
├── MIG B
└── MIG C

MIG 提供强资源和一定的 fault isolation,但它们毕竟仍然位于:

同一块物理 GPU。

如果整个 GPU:

PCIe失联

或者出现严重板卡级问题,那么:

MIG A
MIG B
MIG C

全部可能受到影响。

所以调度器不能把 MIG instance 当成完全独立的物理故障域。

这对高可用设计非常关键。

例如三个模型副本:

Replica A
Replica B
Replica C

如果三个都调度到:

同一Physical GPU的三个MIG

从 Kubernetes 看:

3个GPU资源

但从硬件 failure domain 看:

只有1张GPU

一次板卡故障就能把三个 replica 全带走。

所以生产调度还必须知道:

Node
Physical GPU
MIG Instance

之间的拓扑关系。


26. MIG 对调度系统提出的新问题

以前调度:

Pod需要1 GPU

很简单。

现在:

Pod A需要1g
Pod B需要2g
Pod C需要3g

而物理 GPU profile placement 又不是任意组合的。

于是会出现新的:

MIG fragmentation。

比如 GPU 上还有足够的“总资源”,但是剩余 slice 的排列无法构造任务需要的 profile。

这和 CPU/内存碎片不同,因为 MIG 的切割受 GPU 硬件 profile 和 placement 约束。NVIDIA 对每种 GPU 都提供了允许的 MIG profile 与 placement 组合。(NVIDIA Docs)

因此 AI Infra 调度平台还要考虑:

当前MIG布局
       ↓
待调度任务需求
       ↓
能否通过现有profile直接满足?
       ↓
是否需要重新配置GPU?
       ↓
重配置会不会影响已有任务?

这就开始接近真正的 GPU scheduler 设计了。


27. 什么时候应该使用 MIG

可以建立这样一个判断模型:

场景MIG适用性
大模型预训练通常较低
大型分布式训练通常较低
小模型训练可能适用
LLM推理很适合
Embedding模型很适合
开发测试环境很适合
Notebook/Jupyter很适合
多租户GPU平台非常适合
GPU资源池非常适合

根本判断标准不是:

“MIG 是不是高级技术?”

而是:

单个 workload 能不能有效吃满整张 GPU。

如果答案是:

能

整卡通常更合适。

如果:

不能

MIG 就很有价值。


28. MIG 在 GPU 资源体系中的位置

到这里,可以把 MIG 放进完整 GPU Infra 结构:

                     Kubernetes
                          │
                   GPU Scheduler
                          │
                    GPU Operator
                          │
        ┌─────────────────┼─────────────────┐
        │                 │                 │
        ▼                 ▼                 ▼
    Device Plugin     MIG Manager       DCGM Exporter
        │                 │                 │
        │                 ▼                 │
        │          Configure MIG            │
        │                 │                 │
        └──────────┬──────┘                 │
                   ▼                        │
              Physical GPU                 │
                   │                        │
        ┌──────────┼──────────┐             │
        ▼          ▼          ▼             │
      MIG0        MIG1       MIG2           │
        │          │          │             │
        ▼          ▼          ▼             │
      Pod A      Pod B      Pod C           │
                                             │
                   Metrics ◄─────────────────┘
                          │
                     Prometheus
                          │
                     Grafana/AIOps

这里各组件职责就非常清楚了:

MIG 负责硬件资源切分。

MIG Manager 负责管理切分配置。

Device Plugin 负责把 MIG resource 暴露给 Kubernetes。

Scheduler 负责决定谁使用哪一种资源。

DCGM Exporter 负责观察 GPU/MIG 的运行状态。

Prometheus 负责集中采集和存储。


29. 需要掌握的 MIG 本质

如果只记一件事情,不要记:

MIG = 一张GPU切成7张

这过于表面。

应该记成:

MIG 是 NVIDIA GPU 的硬件级空间分区机制。它按照 GPU 内部的计算 slice 和 memory slice 把 SM、显存容量、显存带宽、Cache 和部分 GPU engines 组合成相对独立的 GPU Instance,并可以进一步通过 Compute Instance 划分计算资源。

因此 MIG 解决的是三个核心问题:

资源利用率
+
性能隔离 / QoS
+
多租户资源管理

而它带来的新问题则是:

MIG profile规划
+
资源碎片
+
调度复杂度
+
监控粒度
+
物理GPU故障域

所以对于 AI Infra 来说,MIG 不是单纯的一条 nvidia-smi 命令,而是一套从 GPU 硬件切分 → Kubernetes 资源抽象 → 调度 → 可观测性 → 多租户管理 的完整资源管理机制。


关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro