精准分割 - 深入解析 Kubernetes 中的 NVIDIA Multi-Instance GPU (MIG)
精准分割 - 深入解析 Kubernetes 中的 NVIDIA Multi-Instance GPU (MIG)
我们知道 Kubernetes 可以管理和分配 GPU 资源给 Pod。但标准的做法通常是将一整块物理 GPU 分配给一个 Pod 独占。对于 NVIDIA A100、H100 这样的“性能怪兽”来说,很多时候(尤其是推理任务或开发测试)一个 Pod 根本用不满整块卡的算力,这就造成了“大马拉小车”的资源浪费和成本空耗。
有没有办法像切蛋糕一样,把一块大 GPU 精准地分割成几小块,并且每一小块都有自己独立的资源,互不干扰呢?NVIDIA 给出的答案就是 Multi-Instance GPU (MIG)!
MIG 核心概念
MIG 是 NVIDIA 在 Ampere 架构及更新的数据中心 GPU(如 A100, H100)上引入的一项硬件级分区技术。它不是简单的软件模拟,而是实实在在地在硬件层面动了“手术”:
- 硬件分区:MIG 可以将一块物理 GPU 安全地分割成最多 7 个独立的 GPU 实例 (GPU Instance, GI)。
- 资源隔离:每个 GI 都拥有自己专属且隔离的计算引擎 (Streaming Multiprocessors - SMs 或 GPU Processing Clusters - GPCs)、显存、显存控制器、二级缓存以及显存带宽。
- 性能可预测:由于是硬件隔离,一个 GI 上的高负载工作不会影响同一物理 GPU 上其他 GI 的性能。这意味着每个 GI 都能获得稳定、可预测的性能和延迟。显存也是完全隔离的,不用担心被“邻居”挤爆。
- 计算实例 (Compute Instance, CI):在 GI 之上,还有一个 CI 的概念。CI 决定了 GI 内的计算资源(如 SMs)如何被访问和管理。对于在 Kubernetes 中使用,我们通常为每个创建的 GI 自动创建一个对应的 CI,让 K8s Pod 可以直接使用这个 GI 的全部能力。
- 类比:再次祭出那个比喻!把支持 MIG 的物理 GPU 看作一台超强物理服务器。启用 MIG 就像在这台服务器上安装了硬件级虚拟化软件 (Hypervisor)。然后,你可以创建出多个独立的“GPU 虚拟机”(即 GI + CI)。每个“GPU 虚拟机”都有自己保证的 CPU (计算单元)、内存 (显存) 和网络带宽 (显存带宽),彼此之间井水不犯河水。
MIG 实例配置文件与命名
MIG 分割不是随意的,NVIDIA 定义了一系列预设的“实例配置文件”(Instance Profiles)。你需要根据这些配置文件来创建 GI。
- 命名规则:配置文件名通常是
mig-<计算资源片数>g.<显存大小>gb
。这里的g
代表计算资源的切片单位(比如 GPC 或 SM 的一部分),gb
是分配到的显存容量。- 以 NVIDIA A100 40GB 为例,常见的配置文件有:
mig-1g.5gb
mig-2g.10gb
mig-3g.20gb
mig-7g.40gb
(接近整卡)
- NVIDIA A100 80GB 则有更多组合,如
mig-1g.10gb
,mig-2g.20gb
, …,mig-7g.80gb
。 - H100 等新卡有其自己的一套配置文件。
- 以 NVIDIA A100 40GB 为例,常见的配置文件有:
- 组合规则:一块物理 GPU 可以同时创建多个 GI,甚至可以是不同配置文件的组合,但必须遵循硬件布局约束。例如,某些配置文件只能放在特定的 GPC 组里。创建实例时
nvidia-smi
会自动检查规则。 - 查询可用配置:后面我们会看到如何用
nvidia-smi
命令查询当前 GPU 支持哪些配置文件。建议查阅 NVIDIA 官方文档获取最权威的兼容列表。
节点端配置实战 (Node-Level Configuration Hands-On)
这是使用 MIG 的关键和前提,需要在 GPU 节点上拥有 root
权限,并使用 nvidia-smi
命令行工具进行操作。
重要提示:更改 MIG 模式或创建/销毁 MIG 实例前,务必停止所有正在使用该物理 GPU 的应用程序或进程(包括 K8s Pod),否则命令可能会失败或导致不稳定。
1. 查询 GPU 信息
首先,确认你的 GPU 型号以及当前的 MIG 状态。
-
命令:列出系统中的 GPU 设备
nvidia-smi -L
-
预期输出示例 (假设有一块 A100):
GPU 0: NVIDIA A100-SXM4-40GB (UUID: GPU-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
- 解释:
GPU 0
: 系统识别到的 GPU 索引号 (Index)。NVIDIA A100-SXM4-40GB
: GPU 的具体型号。确认是支持 MIG 的型号(如 A100, H100)。UUID
: 该 GPU 的唯一标识符。
- 解释:
-
命令:查询 GPU 的详细信息,特别是 MIG 相关状态