MIG 资源

Multi-Instance GPU (MIG) 会将支持 MIG 的 GPU(例如 NVIDIA A100、A30 或 H100)划分为多个相互隔离的 GPU 实例。每个实例都拥有专用的计算和内存资源,因此无法完全占满整张 GPU 的工作负载可以在同一块卡上并行运行。

在此版本中,MIG 是一项可选能力。MIG geometry manager (mig-manager) 默认处于关闭状态,其镜像未包含在产品包中,并且在此版本中尚未在支持 MIG 的硬件上完成端到端验证。启用 MIG 需要支持 MIG 的硬件以及用户提供的 mig-manager 镜像。

INFO

本页说明如何通过 Alauda GPU Management 暴露 MIG,以及如何启用它。详细的硬件分区步骤请参见 NVIDIA 的 MIG User Guide。在 MIG 硬件上验证启用和分区流程是作为单独的后续任务跟踪的。

前提条件

  • 支持 MIG 的 GPU(参见 NVIDIA Supported GPUs)。
  • 集群镜像仓库中可用的 mig-manager 镜像。该镜像不包含在产品包中;请从 nvcr.io 镜像同步(见下文)。

提供 mig-manager 镜像

mig-manager 组件使用的是 NVIDIA 提供且本产品不再分发的镜像。请将其从 nvcr.io 镜像同步到您的私有镜像仓库,然后在 ClusterPolicy 中指向该镜像:

docker pull  nvcr.io/nvidia/cloud-native/k8s-mig-manager:<version>
docker tag   nvcr.io/nvidia/cloud-native/k8s-mig-manager:<version> <private-registry>/nvidia/cloud-native/k8s-mig-manager:<version>
docker push  <private-registry>/nvidia/cloud-native/k8s-mig-manager:<version>

在 ClusterPolicy 中,启用该组件并将其仓库设置为镜像同步后的地址:

migManager:
  enabled: true
  repository: <private-registry>/nvidia/cloud-native
  image: k8s-mig-manager
  version: <version>   # must match the mirrored tag exactly
mig:
  strategy: single

请保持同步后的 tag 与源 tag 完全一致。该镜像由 NVIDIA 提供;镜像同步和使用需遵循 NVIDIA 的条款。

MIG 策略

ClusterPolicy 中的 mig.strategy 字段控制 MIG 设备如何向 Kubernetes 进行声明。

none

Alauda GPU Management 不区分是否启用了 MIG 的 GPU。所有 GPU 都会被枚举为 nvidia.com/gpu,与非 MIG 节点相同。当不使用 MIG 时请使用此策略。

single

MIG 设备会被声明为 nvidia.com/gpu,从而保持工作负载体验不变,但此时资源映射到的是节点上可用的 MIG 实例,而不是整块 GPU。节点上的所有 MIG 实例必须使用相同的 profile。一个具有七个 1g.5gb 实例的节点会报告七个 nvidia.com/gpu。

mixed

每种 MIG profile 都会被声明为一个独立的完整资源,形式为 nvidia.com/mig-<slice_count>g.<memory_size>gb(例如 nvidia.com/mig-1g.5gb、nvidia.com/mig-2g.10gb)。当一个节点上同时存在不同大小的 MIG 实例时,请使用此策略。

与在命令行中设置 MIG 的区别

直接在节点上使用 nvidia-smi mig 设置 MIG geometry 是一种命令式的一次性操作:您需要手动确保 GPU 处于空闲状态,创建实例,并重新配置 device plugin,而且当配置发生漂移时,它不会被自动协调。

mig-manager 组件是声明式的:您在 ClusterPolicy(或节点标签)中设置目标 profile,管理器会驱逐节点上的 GPU 工作负载,应用该 geometry,并持续保持其一致性。随后 GPU Feature Discovery 会根据策略声明这些 MIG 实例。该管理器封装了相同的底层分区工具,但增加了节点驱逐和一致性协调生命周期。

请求 MIG 实例

完成 MIG 配置后,请像请求整块 GPU 一样,将声明的资源作为 limit 进行请求:

resources:
  limits:
    nvidia.com/gpu: 1          # single strategy
    # or, mixed strategy:
    # nvidia.com/mig-1g.5gb: 1

在请求之前,请先从节点的 allocatable 资源中确认已声明的 MIG 资源:

kubectl get node ${nodeName} -o jsonpath='{.status.allocatable}'