GPU 切分:MIG、MPS、vGPU
一张 GPU 很贵,不是每个任务都需要整张卡。
能不能把一张 GPU 切分给多个任务用?可以。主要有三种方式:MIG、MPS、vGPU。
这篇讲清楚它们的原理和适用场景。
为什么需要 GPU 切分
问题一:资源浪费
推理任务:只需要 5GB 显存,10% 算力
分配一整张 A100(80GB)
→ 浪费 75GB 显存,90% 算力
问题二:资源争用
多个小任务共享一张 GPU
任务A 突然吃满显存
任务B OOM
→ 没有隔离
解决思路
把一张 GPU 切成多份,每份独立使用:
- 空间隔离:显存独立
- 时间隔离:算力独立
- 故障隔离:一个挂了不影响其他
MIG(Multi-Instance GPU)
是什么
MIG 是 NVIDIA 在 A100/H100 上推出的硬件级 GPU 切分技术。
把一张 GPU 切成最多 7 个独立的「GPU 实例」,每个实例有独立的:
- 显存
- SM(流多处理器)
- L2 Cache
- 显存带宽
支持的 GPU
- A100(40GB/80GB)
- A30
- H100
注意:4090、A10 等消费级/入门数据中心卡不支持 MIG。
切分规格
A100 80GB 的 MIG 切分选项:
| 实例规格 | 显存 | SM | 数量上限 |
|---|---|---|---|
| 1g.10gb | 10GB | 1/7 | 7 |
| 2g.20gb | 20GB | 2/7 | 3 |
| 3g.40gb | 40GB | 3/7 | 2 |
| 4g.40gb | 40GB | 4/7 | 1 |
| 7g.80gb | 80GB | 7/7 | 1 |
命名规则:Xg.YYgb = X 个计算单元 + YY GB 显存
配置 MIG
# 启用 MIG 模式(需要重启 GPU)
sudo nvidia-smi -i 0 -mig 1
# 重启 GPU
sudo nvidia-smi -i 0 -r
# 查看可用配置
nvidia-smi mig -lgip
# 创建 GPU 实例(3g.40gb)
sudo nvidia-smi mig -cgi 9,9 -i 0
# 创建计算实例
sudo nvidia-smi mig -cci -i 0
# 查看 MIG 实例
nvidia-smi mig -lgi
K8s 中使用 MIG
# 请求 MIG 实例
apiVersion: v1
kind: Pod
metadata:
name: mig-pod
spec:
containers:
- name: cuda
image: nvidia/cuda:12.0-base
resources:
limits:
nvidia.com/mig-3g.40gb: 1 # 请求一个 3g.40gb 实例
MIG 的优缺点
优点:
- 硬件级隔离,最安全
- 显存和算力都隔离
- 故障隔离好
缺点:
- 只有高端卡支持
- 切分规格固定,不够灵活
- 切分后不能动态调整(要重启 GPU)
- 最多 7 个实例
MPS(Multi-Process Service)
是什么
MPS 是 NVIDIA 的多进程服务,允许多个 CUDA 程序共享一张 GPU。
原理:
- 传统:每个进程独占 GPU 上下文,切换有开销
- MPS:多个进程共享上下文,并行执行
特点
- 时间片共享:多个进程轮流使用 GPU
- 软件实现:不需要特殊硬件
- 所有 NVIDIA GPU 都支持
配置 MPS
# 设置 MPS 目录
export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log
# 启动 MPS 守护进程
nvidia-cuda-mps-control -d
# 检查状态
echo get_server_list | nvidia-cuda-mps-control
使用 MPS
启用 MPS 后,正常运行 CUDA 程序即可,它们会自动通过 MPS 共享 GPU。
MPS 的限制
# 设置每个进程最多使用的 SM 比例
echo "set_default_active_thread_percentage 25" | nvidia-cuda-mps-control
可以限制每个进程使用的算力比例,但不能限制显存。
MPS 的优缺点
优点:
- 所有 NVIDIA GPU 都支持
- 配置简单
- 适合多个小进程共享
缺点:
- 没有显存隔离(一个进程可以吃光显存)
- 没有故障隔离(一个进程崩溃可能影响其他)
- 安全性差(进程间可能互相访问显存)
vGPU
是什么
vGPU 是 NVIDIA 的虚拟化方案,把 GPU 虚拟化给虚拟机使用。
原理:
- Hypervisor(如 VMware、KVM)管理 GPU
- 每个虚拟机分配虚拟 GPU
- vGPU 管理器做调度和隔离
部署架构
物理服务器
├── Hypervisor(VMware ESXi / KVM)
│ ├── NVIDIA vGPU Manager
│ ├── VM1 + vGPU
│ ├── VM2 + vGPU
│ └── VM3 + vGPU
└── 物理 GPU
vGPU 配置文件
不同的切分规格:
A100-4C: 4GB 显存,适合轻量推理
A100-10C: 10GB 显存,适合中等任务
A100-20C: 20GB 显存,适合训练
A100-40C: 40GB 显存,适合大模型
vGPU 的优缺点
优点:
- 适合虚拟化环境
- 有显存隔离
- 成熟的企业方案
- 支持热迁移
缺点:
- 需要额外许可证(很贵)
- 有虚拟化开销
- 配置复杂
- 主要面向虚拟机,不适合容器
GPU 共享(非 NVIDIA 官方)
除了 NVIDIA 官方方案,还有一些开源/第三方 GPU 共享方案。
HAMi(原 NVIDIA GPU Share)
阿里云开源的 GPU 共享方案。
特点:
- K8s 原生支持
- 支持显存和算力限制
- 不需要 MIG 硬件支持
使用:
apiVersion: v1
kind: Pod
metadata:
name: gpu-share-pod
spec:
containers:
- name: cuda
image: nvidia/cuda:12.0-base
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096 # 限制 4GB 显存
nvidia.com/gpucores: 25 # 限制 25% 算力
原理:
- 通过 LD_PRELOAD 劫持 CUDA 调用
- 在应用层做显存和算力限制
缺点:
- 不是硬件隔离,可以被绕过
- 兼容性问题(有些 CUDA 程序不支持)
GPU Operator 时间分片
NVIDIA GPU Operator 的时间分片功能:
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
data:
config.yaml: |
version: v1
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 4 # 一张卡切成 4 份
特点:
- 官方支持
- 配置简单
- 适合推理场景
缺点:
- 没有显存隔离
- 时间片切换有开销
方案对比
| 方案 | 显存隔离 | 算力隔离 | 故障隔离 | 硬件要求 | 复杂度 |
|---|---|---|---|---|---|
| MIG | ✅ 硬件级 | ✅ 硬件级 | ✅ | A100/H100 | 中 |
| MPS | ❌ | ⚠️ 软件级 | ❌ | 无 | 低 |
| vGPU | ✅ | ✅ | ✅ | vGPU 许可 | 高 |
| HAMi | ⚠️ 软件级 | ⚠️ 软件级 | ❌ | 无 | 低 |
| 时间分片 | ❌ | ⚠️ | ❌ | 无 | 低 |
怎么选
推荐 MIG 的场景
- 有 A100/H100
- 需要强隔离(多租户)
- 可以接受固定切分规格
推荐 MPS 的场景
- 没有 A100/H100
- 多个小推理任务
- 信任所有任务(单租户)
推荐 vGPU 的场景
- 虚拟化环境(VMware)
- 企业桌面虚拟化
- 有预算买许可证
推荐 HAMi/时间分片的场景
- K8s 环境
- 想简单做 GPU 超售
- 对隔离要求不高
生产环境建议
多租户 + A100/H100 → MIG
多租户 + 其他卡 → 不切分,用队列管理
单租户 + 推理 → MPS 或时间分片
虚拟化环境 → vGPU
小结
GPU 切分三种方式:
| 方式 | 原理 | 隔离级别 | 适用场景 |
|---|---|---|---|
| MIG | 硬件切分 | 最强 | A100/H100 多租户 |
| MPS | 多进程共享 | 弱 | 多个小任务 |
| vGPU | 虚拟化 | 强 | VM 环境 |
选择建议:
- 要强隔离 → MIG(如果硬件支持)
- 要简单 → MPS 或时间分片
- VM 环境 → vGPU
核心认知:GPU 切分是资源利用率和隔离性的权衡,没有完美方案。
下一篇讲 GPU 调度的常见问题。