如何用 MIG(Multi-Instance GPU)切分 A100 并保证显存隔离?

解读

在国内互联网大厂或 AI 独角兽的面试里,这道题表面问“切分”,实则考察三件事:

  1. 是否亲手在生产环境用过 A100 + MIG 做显存隔离,而不是纸上谈兵;
  2. 是否能把 CUDA 驱动版本、NVML API、Kubernetes device-plugin、LLMOps 调度 串成闭环;
  3. 是否知道 显存隔离 ≠ 算力隔离,并能给出可观测、可回滚的兜底方案。
    面试官通常会在你回答过程中追问“如果业务方把 40 GiB 模型误发到 20 GiB 实例怎么快速止损”,所以回答必须落地到“谁负责切、谁负责拦、谁负责报警”。

知识点

  1. 硬件前提:A100 必须为 PCIe 80 GB 或 SXM 80 GB,40 GB 版不支持 MIG;NVIDIA Ampere 架构 才带 MIG 单元。
  2. 软件栈
    • 驱动 ≥ 450.80.02,推荐 470+(国内阿里云 A100 裸金属镜像默认 470.161);
    • CUDA Toolkit ≥ 11.4,且 nvidia-fabricmanager 版本与驱动严格对齐
    • nvidia-device-plugin for K8s ≥ 0.14.0 才支持 nvidia.com/mig-3g.20gb 这类资源名。
  3. MIG 粒度:A100-80GB 最多 7 个 7g.10gb 实例,或 1 个 3g.40gb + 2 个 2g.20gb + 1 个 1g.10gb显存与算力同时硬隔离,但 L2 cache 与内存带宽仍共享
  4. 隔离级别
    • 显存隔离:由 GPU 内部 MMU-level partition 保证,ECC 错误也按实例隔离
    • 错误隔离GPU 挂起只影响所在 GI(GPU Instance),其他 GI 继续跑;
    • QoS 隔离:需额外打开 nvidia-smi -q -d SUPPORTED_CLOCKS 中的 exclusive 模式,否则高负载实例仍会挤占内存带宽。
  5. LLMOps 视角
    • 模型下发前:通过 OpenTelemetry + NVML API 实时采集 migDevice.memory.used / migDevice.memory.total
    • 模型下发时:在 KubeRayRayCluster CR 里声明 nvidia.com/mig-3g.40gb: 1Webhook 自动校验模型 size < 39 GiB
    • 失败兜底DCGM 检测 XID 43/48 立即触发 Pod 迁移 + MIG 实例销毁重建,防止“坏邻居”。

答案

步骤一:确认节点

nvidia-smi -q | grep "MIG Mode"          # 输出 Enable
nvidia-smi mig -lgi                      # 列出可用 GI 实例

若返回 MIG mode: Disabled,需 重启节点 并在 grub 内核参数nvidia-mig=1国内阿里云、腾讯云裸金属均需在控制台“重启并启用 MIG”,单纯 modprobe 不生效。

步骤二:规划切分
3g.40gb 为例,先销毁默认 GI:

nvidia-smi mig -dci -gi 0
nvidia-smi mig -dgi -gi 0

再创建策略:

nvidia-smi mig -cgi 3,40,0 -gi 0
nvidia-smi mig -cci 3,40,0 -gi 0

此时 nvidia-smi -L 会看到 GPU-0: GPU-3g.40gbUUID 以 MIG- 开头显存 40 GiB 硬隔离

步骤三:Kubernetes 暴露

  1. 给节点打标签
    kubectl label node a100-mig-01 nvidia.com/mig.config=3g.40gb
    
  2. 使用 nvidia-device-pluginmig.strategy=mixed 模式,自动生成 Extended Resource nvidia.com/mig-3g.40gb: 1
  3. RayServiceTriton InferenceServer 的 Pod spec 里直接声明:
    resources:
      limits:
        nvidia.com/mig-3g.40gb: "1"
    
    无需再写 nvidia.com/gpu,否则调度器会冲突。

步骤四:持续监控

  • 显存水位:通过 DCGM_FI_DEV_MEM_COPY_UTIL 结合 NVML nvmlDeviceGetMigDeviceInfoByHandle 拿到 migDevice.memory.used
  • 错误隔离DCGM 检测 XID 43 时,自动调用 nvidia-smi mig -dci -gi X 销毁实例并触发 K8s Pod 反亲和重调度
  • 回滚策略:若业务方误发 50 GiB 模型,Webhook 校验失败返回 403并推送飞书/钉钉告警30 秒内阻断上线

通过以上四步,即可在 生产级 LLMOps 流水线 里完成 A100 的 MIG 切分,并保证 显存 100% 隔离、故障域最小化、可观测、可回滚

拓展思考

  1. 多卡 MIG 混部:如果集群里既有 A100-80GB 又有 A30-24GBA30 不支持 MIG,此时需设计 两级调度
    • 一级用 K8s scheduler extender>30 GiB 模型路由到 A100-MIG
    • 二级用 Volcano gang scheduling 保证 张量并行 2×3g.40gb 落在同一 NUMA node避免 QPI 跨路
  2. 动态调整:国内直播电商大促场景,白天需要 7×1g.10gb 做批量图文生成晚上需要 1×3g.40gb 做千亿模型推理,可写 CronJob 在 00:00 调用 nvidia-smi mig -cgi … 重切配合 Cluster-Autoscaler 缩容空节点整体成本下降 38%
  3. 安全合规:金融客户要求 不同租户密钥隔离,**MIG 实例 UUID 可绑定到 vTPM远程证明结合 NVIDIA Confidential Computing 未来可做到 GPU 内存加密目前国内仅阿里云 7 代裸金属支持预览版面试时可作为技术预研亮点抛出