HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于

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.10gb10GB1/77
2g.20gb20GB2/73
3g.40gb40GB3/72
4g.40gb40GB4/71
7g.80gb80GB7/71

命名规则: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 调度的常见问题。