带有 MIG 的 GPU Operator#

关于多实例 GPU#

多实例 GPU (MIG) 使基于 NVIDIA Ampere 及更高版本架构(如 NVIDIA A100)的 GPU 能够被划分为独立且安全的 GPU 实例,供 CUDA 应用程序使用。有关 MIG 的更多信息,请参阅MIG 用户指南

GPU Operator 部署 MIG Manager,以管理 Kubernetes 集群中节点上的 MIG 配置。

在安装过程中启用 MIG#

以下步骤使用 single MIG 策略。或者,您可以指定 mixed 策略。

执行以下步骤来安装 Operator 并配置 MIG

  1. 安装 Operator

    $ helm install --wait --generate-name \
        -n gpu-operator --create-namespace \
        nvidia/gpu-operator \
        --version=v24.9.2 \
        --set mig.strategy=single
    

    当节点上并非所有 GPU 都启用 MIG 模式时,将 mig.strategy 设置为 mixed

    在 CSP 环境(如 Google Cloud)中,还要指定 --set migManager.env[0].name=WITH_REBOOT --set-string migManager.env[0].value=true,以确保节点重新启动并可以应用 MIG 配置。

    MIG Manager 支持预安装的驱动程序。如果驱动程序已预安装,还要指定 --set driver.enabled=false。有关更多详细信息,请参阅带有预安装驱动程序的 MIG Manager

    几分钟后,所有 Pod(包括 nvidia-mig-manager)都将部署在具有支持 MIG 的 GPU 的节点上。

  2. 可选:显示 Operator 命名空间中的 Pod

    $ kubectl get pods -n gpu-operator
    

    示例输出

    NAME                                                          READY   STATUS      RESTARTS   AGE
    gpu-feature-discovery-qmwb2                                   1/1     Running     0          14m
    gpu-operator-7bbf8bb6b7-xz664                                 1/1     Running     0          14m
    gpu-operator-node-feature-discovery-gc-79d6d968bb-sg4t6       1/1     Running     0          14m
    gpu-operator-node-feature-discovery-master-6d9f8d497c-7cwrp   1/1     Running     0          14m
    gpu-operator-node-feature-discovery-worker-x5z62              1/1     Running     0          14m
    nvidia-container-toolkit-daemonset-pkcpr                      1/1     Running     0          14m
    nvidia-cuda-validator-wt6bc                                   0/1     Completed   0          12m
    nvidia-dcgm-exporter-zsskv                                    1/1     Running     0          14m
    nvidia-device-plugin-daemonset-924x6                          1/1     Running     0          14m
    nvidia-driver-daemonset-klj5s                                 1/1     Running     0          14m
    nvidia-mig-manager-8d6wz                                      1/1     Running     0          12m
    nvidia-operator-validator-fnsmk                               1/1     Running     0          14m
    
  3. 可选:显示应用于节点的标签

    $ kubectl get node -o json | jq '.items[].metadata.labels'
    

    部分输出

      "nvidia.com/gpu.present": "true",
      "nvidia.com/gpu.product": "NVIDIA-H100-80GB-HBM3",
      "nvidia.com/gpu.replicas": "1",
      "nvidia.com/gpu.sharing-strategy": "none",
      "nvidia.com/mig.capable": "true",
      "nvidia.com/mig.config": "all-disabled",
      "nvidia.com/mig.config.state": "success",
      "nvidia.com/mig.strategy": "single",
      "nvidia.com/mps.capable": "false"
    }
    

    重要提示

    MIG Manager 要求在配置的 GPU 上没有用户工作负载正在运行。在某些情况下(例如 CSP),节点可能需要重新启动,因此在更改 GPU 上的 MIG 模式或 MIG 几何结构之前,可能需要隔离节点。

配置 MIG 配置文件#

默认情况下,节点标记为 nvidia.com/mig.config: all-disabled,您必须指定要应用的 MIG 配置。

MIG Manager 使用 GPU Operator 命名空间中的 default-mig-parted-config ConfigMap 来识别支持的 MIG 配置文件。在标记节点或自定义 ConfigMap 时,请参阅 ConfigMap。

示例:单 MIG 策略#

以下步骤演示如何使用单 MIG 策略并在一个节点上配置 1g.10gb 配置文件。

  1. 如果您不确定当前策略,请将 MIG 策略配置为 single

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
        --type='json' \
        -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"single"}]'
    
  2. 使用要配置的配置文件标记节点

    $ kubectl label nodes <node-name> nvidia.com/mig.config=all-1g.10gb --overwrite
    

    MIG Manager 继续向节点应用 mig.config.state 标签,并终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为所需的 MIG 几何结构。

  3. 可选:显示节点标签

    $ kubectl get node <node-name> -o=jsonpath='{.metadata.labels}' | jq .
    

    部分输出

      "nvidia.com/gpu.product": "NVIDIA-H100-80GB-HBM3",
      "nvidia.com/gpu.replicas": "1",
      "nvidia.com/gpu.sharing-strategy": "none",
      "nvidia.com/mig.capable": "true",
      "nvidia.com/mig.config": "all-1g.10gb",
      "nvidia.com/mig.config.state": "pending",
      "nvidia.com/mig.strategy": "single"
    }
    

    如上所述,如果设置了 WITH_REBOOT 选项,则 MIG Manager 会将标签设置为 nvidia.com/mig.config.state: rebooting

  4. 通过检查节点标签确认 MIG Manager 已完成配置

    $ kubectl get node <node-name> -o=jsonpath='{.metadata.labels}' | jq .
    

    检查以下标签

    • nvidia.com/gpu.count: 7,此值因 GPU 型号而异。

    • nvidia.com/gpu.slices.ci: 1

    • nvidia.com/gpu.slices.gi: 1

    • nvidia.com/mig.config.state: success

    部分输出

    "nvidia.com/gpu.count": "7",
    "nvidia.com/gpu.present": "true",
    "nvidia.com/gpu.product": "NVIDIA-H100-80GB-HBM3-MIG-1g.10gb",
    "nvidia.com/gpu.slices.ci": "1",
    "nvidia.com/gpu.slices.gi": "1",
    "nvidia.com/mig.capable": "true",
    "nvidia.com/mig.config": "all-1g.10gb",
    "nvidia.com/mig.config.state": "success",
    "nvidia.com/mig.strategy": "single"
    
  5. 可选:在驱动程序容器中运行 nvidia-smi 命令,以验证 MIG 配置

    $ kubectl exec -it -n gpu-operator ds/nvidia-driver-daemonset -- nvidia-smi -L
    

    示例输出

    GPU 0: NVIDIA H100 80GB HBM3 (UUID: GPU-b4895dbf-9350-2524-a89b-98161ddd9fe4)
      MIG 1g.10gb     Device  0: (UUID: MIG-3f6f389f-b0cc-5e5c-8e32-eaa8fd067902)
      MIG 1g.10gb     Device  1: (UUID: MIG-35f93699-4b53-5a19-8289-80b8418eec60)
      MIG 1g.10gb     Device  2: (UUID: MIG-9d14fb21-4ae1-546f-a636-011582899c39)
      MIG 1g.10gb     Device  3: (UUID: MIG-0f709664-740c-52b0-ae79-3e4c9ede6d3b)
      MIG 1g.10gb     Device  4: (UUID: MIG-5d23f73a-d378-50ac-a6f5-3bf5184773bb)
      MIG 1g.10gb     Device  5: (UUID: MIG-6cea15c7-8a56-578c-b965-0e73cb6dfc10)
      MIG 1g.10gb     Device  6: (UUID: MIG-981c86e9-3607-57d7-9426-295347e4b925)
    

示例:混合 MIG 策略#

以下步骤演示如何使用 mixed MIG 策略并在一个节点上配置 all-balanced 配置文件。

  1. 如果您不确定当前策略,请将 MIG 策略配置为 mixed

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
        --type='json' \
        -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
    
  2. 使用要配置的配置文件标记节点

    $ kubectl label nodes <node-name> nvidia.com/mig.config=all-balanced --overwrite
    

    MIG Manager 继续向节点应用 mig.config.state 标签,并终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为所需的 MIG 几何结构。

  3. 通过检查节点标签确认 MIG Manager 已完成配置

    $ kubectl get node <node-name> -o=jsonpath='{.metadata.labels}' | jq .
    

    检查如下标签。配置文件和 GPU 计数因 GPU 型号而异。

    • nvidia.com/mig-1g.10gb.count: 2

    • nvidia.com/mig-2g.20gb.count: 1

    • nvidia.com/mig-3g.40gb.count: 1

    • nvidia.com/mig.config.state: success

    部分输出

      "nvidia.com/gpu.present": "true",
      "nvidia.com/gpu.product": "NVIDIA-H100-80GB-HBM3",
      "nvidia.com/gpu.replicas": "0",
      "nvidia.com/gpu.sharing-strategy": "none",
      "nvidia.com/mig-1g.10gb.count": "2",
      "nvidia.com/mig-1g.10gb.engines.copy": "1",
      "nvidia.com/mig-1g.10gb.engines.decoder": "1",
      "nvidia.com/mig-1g.10gb.engines.encoder": "0",
      "nvidia.com/mig-1g.10gb.engines.jpeg": "1",
      "nvidia.com/mig-1g.10gb.engines.ofa": "0",
      "nvidia.com/mig-1g.10gb.memory": "9984",
      "nvidia.com/mig-1g.10gb.multiprocessors": "16",
      "nvidia.com/mig-1g.10gb.product": "NVIDIA-H100-80GB-HBM3-MIG-1g.10gb",
      "nvidia.com/mig-1g.10gb.replicas": "1",
      "nvidia.com/mig-1g.10gb.sharing-strategy": "none",
      "nvidia.com/mig-1g.10gb.slices.ci": "1",
      "nvidia.com/mig-1g.10gb.slices.gi": "1",
      "nvidia.com/mig-2g.20gb.count": "1",
      "nvidia.com/mig-2g.20gb.engines.copy": "2",
      "nvidia.com/mig-2g.20gb.engines.decoder": "2",
      "nvidia.com/mig-2g.20gb.engines.encoder": "0",
      "nvidia.com/mig-2g.20gb.engines.jpeg": "2",
      "nvidia.com/mig-2g.20gb.engines.ofa": "0",
      "nvidia.com/mig-2g.20gb.memory": "20096",
      "nvidia.com/mig-2g.20gb.multiprocessors": "32",
      "nvidia.com/mig-2g.20gb.product": "NVIDIA-H100-80GB-HBM3-MIG-2g.20gb",
      "nvidia.com/mig-2g.20gb.replicas": "1",
      "nvidia.com/mig-2g.20gb.sharing-strategy": "none",
      "nvidia.com/mig-2g.20gb.slices.ci": "2",
      "nvidia.com/mig-2g.20gb.slices.gi": "2",
      "nvidia.com/mig-3g.40gb.count": "1",
      "nvidia.com/mig-3g.40gb.engines.copy": "3",
      "nvidia.com/mig-3g.40gb.engines.decoder": "3",
      "nvidia.com/mig-3g.40gb.engines.encoder": "0",
      "nvidia.com/mig-3g.40gb.engines.jpeg": "3",
      "nvidia.com/mig-3g.40gb.engines.ofa": "0",
      "nvidia.com/mig-3g.40gb.memory": "40320",
      "nvidia.com/mig-3g.40gb.multiprocessors": "60",
      "nvidia.com/mig-3g.40gb.product": "NVIDIA-H100-80GB-HBM3-MIG-3g.40gb",
      "nvidia.com/mig-3g.40gb.replicas": "1",
      "nvidia.com/mig-3g.40gb.sharing-strategy": "none",
      "nvidia.com/mig-3g.40gb.slices.ci": "3",
      "nvidia.com/mig-3g.40gb.slices.gi": "3",
      "nvidia.com/mig.capable": "true",
      "nvidia.com/mig.config": "all-balanced",
      "nvidia.com/mig.config.state": "success",
      "nvidia.com/mig.strategy": "mixed",
      "nvidia.com/mps.capable": "false"
    }
    
  4. 可选:在驱动程序容器中运行 nvidia-smi 命令,以验证 GPU 是否已配置

    $ kubectl exec -it -n gpu-operator ds/nvidia-driver-daemonset -- nvidia-smi -L
    

    示例输出

    GPU 0: NVIDIA H100 80GB HBM3 (UUID: GPU-b4895dbf-9350-2524-a89b-98161ddd9fe4)
      MIG 3g.40gb     Device  0: (UUID: MIG-7089d0f3-293f-58c9-8f8c-5ea666eedbde)
      MIG 2g.20gb     Device  1: (UUID: MIG-56c30729-347f-5dd6-8da0-c3cc59e969e0)
      MIG 1g.10gb     Device  2: (UUID: MIG-9d14fb21-4ae1-546f-a636-011582899c39)
      MIG 1g.10gb     Device  3: (UUID: MIG-0f709664-740c-52b0-ae79-3e4c9ede6d3b)
    

示例:重新配置 MIG 配置文件#

MIG Manager 支持 MIG 几何结构的动态重新配置。以下步骤演示如何使用单 MIG 策略将节点上的 GPU 更新到 3g.40gb 配置文件。

  1. 使用配置文件标记节点

    $ kubectl label nodes <node-name> nvidia.com/mig.config=all-3g.40gb --overwrite
    
  2. 可选:监视 MIG Manager 日志以确认已应用新的 MIG 几何结构

    $ kubectl logs -n gpu-operator -l app=nvidia-mig-manager -c nvidia-mig-manager
    

    示例输出

    Applying the selected MIG config to the node
    time="2024-05-14T18:31:26Z" level=debug msg="Parsing config file..."
    time="2024-05-14T18:31:26Z" level=debug msg="Selecting specific MIG config..."
    time="2024-05-14T18:31:26Z" level=debug msg="Running apply-start hook"
    time="2024-05-14T18:31:26Z" level=debug msg="Checking current MIG mode..."
    time="2024-05-14T18:31:26Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-14T18:31:26Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-14T18:31:26Z" level=debug msg="    Asserting MIG mode: Enabled"
    time="2024-05-14T18:31:26Z" level=debug msg="    MIG capable: true\n"
    time="2024-05-14T18:31:26Z" level=debug msg="    Current MIG mode: Enabled"
    time="2024-05-14T18:31:26Z" level=debug msg="Checking current MIG device configuration..."
    time="2024-05-14T18:31:26Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-14T18:31:26Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-14T18:31:26Z" level=debug msg="    Asserting MIG config: map[3g.40gb:2]"
    time="2024-05-14T18:31:26Z" level=debug msg="Running pre-apply-config hook"
    time="2024-05-14T18:31:26Z" level=debug msg="Applying MIG device configuration..."
    time="2024-05-14T18:31:26Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-14T18:31:26Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-14T18:31:26Z" level=debug msg="    MIG capable: true\n"
    time="2024-05-14T18:31:26Z" level=debug msg="    Updating MIG config: map[3g.40gb:2]"
    MIG configuration applied successfully
    time="2024-05-14T18:31:27Z" level=debug msg="Running apply-exit hook"
    Restarting validator pod to re-run all validations
    pod "nvidia-operator-validator-kmncw" deleted
    Restarting all GPU clients previously shutdown in Kubernetes by reenabling their component-specific nodeSelector labels
    node/node-name labeled
    Changing the 'nvidia.com/mig.config.state' node label to 'success'
    
  3. 可选:显示节点标签以确认 GPU 计数 (2)、切片 (3) 和配置文件已设置

    $ kubectl get node <node-name> -o=jsonpath='{.metadata.labels}' | jq .
    

    部分输出

      "nvidia.com/gpu.count": "2",
      "nvidia.com/gpu.present": "true",
      "nvidia.com/gpu.product": "NVIDIA-H100-80GB-HBM3-MIG-3g.40gb",
      "nvidia.com/gpu.replicas": "1",
      "nvidia.com/gpu.sharing-strategy": "none",
      "nvidia.com/gpu.slices.ci": "3",
      "nvidia.com/gpu.slices.gi": "3",
      "nvidia.com/mig.capable": "true",
      "nvidia.com/mig.config": "all-3g.40gb",
      "nvidia.com/mig.config.state": "success",
      "nvidia.com/mig.strategy": "single",
      "nvidia.com/mps.capable": "false"
    }
    

示例:安装期间的自定义 MIG 配置#

默认情况下,Operator 创建 default-mig-parted-config ConfigMap,并且 MIG Manager 配置为从该 ConfigMap 读取配置文件。

您可以在安装或升级 Operator 时使用 values.yaml 文件来创建具有自定义配置的 ConfigMap。

  1. 在您的 values.yaml 文件中,添加 ConfigMap 的数据,如以下示例所示

    migManager:
      config:
        name: custom-mig-config
        create: true
        data: |-
          config.yaml: |-
            version: v1
            mig-configs:
              all-disabled:
                - devices: all
                  mig-enabled: false
              custom-mig:
                - devices: [0]
                  mig-enabled: true
                  mig-devices:
                    "1g.10gb": 2
                    "2g.20gb": 2
    
  2. 如果自定义配置指定了多个实例配置文件,请将策略设置为 mixed

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
        --type='json' \
        -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
    
  3. 使用要配置的配置文件标记节点

    $ kubectl label nodes <node-name> nvidia.com/mig.config=custom-mig --overwrite
    

示例:自定义 MIG 配置#

默认情况下,Operator 创建 default-mig-parted-config ConfigMap,并且 MIG Manager 配置为从该 ConfigMap 读取配置文件。

如果默认配置文件不满足您的业务需求,您可以创建具有自定义配置的 ConfigMap。

  1. 创建一个文件,例如 custom-mig-config.yaml,内容如下例所示

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: custom-mig-config
    data:
      config.yaml: |
        version: v1
        mig-configs:
          all-disabled:
            - devices: all
              mig-enabled: false
          
          five-1g-one-2g:
            - devices: all 
              mig-enabled: true
              mig-devices:
                "1g.10gb": 5
                "2g.20gb": 1
    
  2. 应用清单

    $ kubectl apply -n gpu-operator -f custom-mig-config.yaml
    
  3. 如果自定义配置指定了多个实例配置文件,请将策略设置为 mixed

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
        --type='json' \
        -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
    
  4. 修补集群策略,以便 MIG Manager 使用自定义 ConfigMap

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
        --type='json' \
        -p='[{"op":"replace", "path":"/spec/migManager/config/name", "value":"custom-mig-config"}]'
    
  5. 使用要配置的配置文件标记节点

    $ kubectl label nodes <node-name> nvidia.com/mig.config=five-1g-one-2g --overwrite
    
  6. 可选:监视 MIG Manager 日志以确认已应用新的 MIG 几何结构

    $ kubectl logs -n gpu-operator -l app=nvidia-mig-manager -c nvidia-mig-manager
    

    示例输出

    Applying the selected MIG config to the node
    time="2024-05-15T13:40:08Z" level=debug msg="Parsing config file..."
    time="2024-05-15T13:40:08Z" level=debug msg="Selecting specific MIG config..."
    time="2024-05-15T13:40:08Z" level=debug msg="Running apply-start hook"
    time="2024-05-15T13:40:08Z" level=debug msg="Checking current MIG mode..."
    time="2024-05-15T13:40:08Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-15T13:40:08Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-15T13:40:08Z" level=debug msg="    Asserting MIG mode: Enabled"
    time="2024-05-15T13:40:08Z" level=debug msg="    MIG capable: true\n"
    time="2024-05-15T13:40:08Z" level=debug msg="    Current MIG mode: Enabled"
    time="2024-05-15T13:40:08Z" level=debug msg="Checking current MIG device configuration..."
    time="2024-05-15T13:40:08Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-15T13:40:08Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-15T13:40:08Z" level=debug msg="    Asserting MIG config: map[1g.10gb:5 2g.20gb:1]"
    time="2024-05-15T13:40:08Z" level=debug msg="Running pre-apply-config hook"
    time="2024-05-15T13:40:08Z" level=debug msg="Applying MIG device configuration..."
    time="2024-05-15T13:40:08Z" level=debug msg="Walking MigConfig for (devices=all)"
    time="2024-05-15T13:40:08Z" level=debug msg="  GPU 0: 0x233010DE"
    time="2024-05-15T13:40:08Z" level=debug msg="    MIG capable: true\n"
    time="2024-05-15T13:40:08Z" level=debug msg="    Updating MIG config: map[1g.10gb:5 2g.20gb:1]"
    time="2024-05-15T13:40:09Z" level=debug msg="Running apply-exit hook"
    MIG configuration applied successfully
    

验证:运行示例 CUDA 工作负载#

CUDA VectorAdd#

让我们运行一个简单的 CUDA 示例,在本例中为 vectorAdd,方法是像通常在 Kubernetes 中那样请求 GPU 资源。在本例中,Kubernetes 将在单个 MIG 设备上调度 Pod,我们使用 nodeSelector 将 Pod 定向调度到具有 MIG 设备的节点上。

$ cat << EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
spec:
  restartPolicy: OnFailure
  containers:
  - name: vectoradd
    image: nvidia/samples:vectoradd-cuda11.2.1
    resources:
      limits:
        nvidia.com/gpu: 1
  nodeSelector:
    nvidia.com/gpu.product: A100-SXM4-40GB-MIG-1g.5gb
EOF

并发作业启动#

现在,让我们尝试一个更复杂的示例。在本示例中,我们将使用 Argo Workflows 在 MIG 设备上启动并发作业。在本示例中,A100 已使用 3g.20gb 配置文件配置为 2 个 MIG 设备。

首先,安装 Argo Workflows 组件到您的 Kubernetes 集群中。

$ kubectl create ns argo \
    && kubectl apply -n argo \
    -f https://raw.githubusercontent.com/argoproj/argo-workflows/stable/manifests/quick-start-postgres.yaml

接下来,从 发行页面下载最新的 Argo CLI,并按照说明安装二进制文件。

现在,我们将创建一个 Argo 示例,该示例在 GPU 上的 MIG 设备上启动多个 CUDA 容器。我们将重用之前的 vectorAdd 示例。以下是作业描述,保存为 vector-add.yaml

$ cat << EOF > vector-add.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: argo-mig-example-
spec:
entrypoint: argo-mig-result-example
templates:
- name: argo-mig-result-example
    steps:
    - - name: generate
        template: gen-mig-device-list
    # Iterate over the list of numbers generated by the generate step above
    - - name: argo-mig
        template: argo-mig
        arguments:
        parameters:
        - name: argo-mig
            value: "{{item}}"
        withParam: "{{steps.generate.outputs.result}}"

# Generate a list of numbers in JSON format
- name: gen-mig-device-list
    script:
    image: python:alpine3.6
    command: [python]
    source: |
        import json
        import sys
        json.dump([i for i in range(0, 2)], sys.stdout)

- name: argo-mig
    retryStrategy:
    limit: 10
    retryPolicy: "Always"
    inputs:
    parameters:
    - name: argo-mig
    container:
    image: nvidia/samples:vectoradd-cuda11.2.1
    resources:
        limits:
        nvidia.com/gpu: 1
    nodeSelector:
    nvidia.com/gpu.product: A100-SXM4-40GB-MIG-3g.20gb
EOF

启动工作流程

$ argo submit -n argo --watch vector-add.yaml

Argo 将打印出已启动的 Pod

Name:                argo-mig-example-z6mqd
Namespace:           argo
ServiceAccount:      default
Status:              Succeeded
Conditions:
Completed           True
Created:             Wed Mar 24 14:44:51 -0700 (20 seconds ago)
Started:             Wed Mar 24 14:44:51 -0700 (20 seconds ago)
Finished:            Wed Mar 24 14:45:11 -0700 (now)
Duration:            20 seconds
Progress:            3/3
ResourcesDuration:   9s*(1 cpu),9s*(100Mi memory),1s*(1 nvidia.com/gpu)

STEP                       TEMPLATE                 PODNAME                           DURATION  MESSAGE
✔ argo-mig-example-z6mqd  argo-mig-result-example
├───✔ generate            gen-mig-device-list      argo-mig-example-z6mqd-562792713  8s
└─┬─✔ argo-mig(0:0)(0)    argo-mig                 argo-mig-example-z6mqd-845918106  2s
└─✔ argo-mig(1:1)(0)    argo-mig                 argo-mig-example-z6mqd-870679174  2s

如果您观察日志,您可以看到 vector-add 示例已在两个设备上完成

$ argo logs -n argo @latest
argo-mig-example-z6mqd-562792713: [0, 1]
argo-mig-example-z6mqd-870679174: [Vector addition of 50000 elements]
argo-mig-example-z6mqd-870679174: Copy input data from the host memory to the CUDA device
argo-mig-example-z6mqd-870679174: CUDA kernel launch with 196 blocks of 256 threads
argo-mig-example-z6mqd-870679174: Copy output data from the CUDA device to the host memory
argo-mig-example-z6mqd-870679174: Test PASSED
argo-mig-example-z6mqd-870679174: Done
argo-mig-example-z6mqd-845918106: [Vector addition of 50000 elements]
argo-mig-example-z6mqd-845918106: Copy input data from the host memory to the CUDA device
argo-mig-example-z6mqd-845918106: CUDA kernel launch with 196 blocks of 256 threads
argo-mig-example-z6mqd-845918106: Copy output data from the CUDA device to the host memory
argo-mig-example-z6mqd-845918106: Test PASSED
argo-mig-example-z6mqd-845918106: Done

禁用 MIG#

您可以通过将 nvidia.con/mig.config 标签设置为 all-disabled 来禁用节点上的 MIG:.. code-block:: console

$ kubectl label nodes <node-name> nvidia.com/mig.config=all-disabled –overwrite

带有预安装驱动程序的 MIG Manager#

MIG Manager 支持预安装的驱动程序。前面部分中的信息仍然适用,但还有一些额外的细节需要考虑。

安装#

在 GPU Operator 安装期间,必须设置 driver.enabled=false。以下选项可用于安装 GPU Operator

$ helm install gpu-operator \
    -n gpu-operator --create-namespace \
    nvidia/gpu-operator \
    --version=v24.9.2 \
    --set driver.enabled=false

管理主机 GPU 客户端#

当应用 MIG 重新配置时,MIG Manager 会停止所有具有 GPU 访问权限的 Operator 管理的 Pod。当驱动程序预安装时,主机上可能还有 GPU 客户端也需要停止。

当驱动程序预安装时,MIG Manager 尝试在 MIG 重新配置期间停止并重新启动主机上的一系列 systemd 服务。服务列表在 default-gpu-clients ConfigMap 中指定。

以下示例 GPU 客户端文件 clients.yaml 用于创建 default-gpu-clients ConfigMap

version: v1
systemd-services:
  - nvsm.service
  - nvsm-mqtt.service
  - nvsm-core.service
  - nvsm-api-gateway.service
  - nvsm-notifier.service
  - nv_peer_mem.service
  - nvidia-dcgm.service
  - dcgm.service
  - dcgm-exporter.service

您可以在安装后通过编辑 ConfigMap 来修改列表。或者,您可以执行以下步骤来创建自定义 ConfigMap 以供 MIG Manager 使用

  1. 创建 gpu-operator 命名空间

    $ kubectl create namespace gpu-operator
    
  2. 创建一个 ConfigMap,其中包含带有 GPU 客户端列表的自定义 clients.yaml 文件

    $ kubectl create configmap -n gpu-operator gpu-clients --from-file=clients.yaml
    
  3. 安装 GPU Operator

    $ helm install gpu-operator \
        -n gpu-operator --create-namespace \
        nvidia/gpu-operator \
        --version=v24.9.2 \
        --set migManager.gpuClientsConfig.name=gpu-clients
        --set driver.enabled=false
    

架构#

MIG Manager 被设计为 Kubernetes 中的控制器。它监视节点上 nvidia.com/mig.config 标签的更改,然后应用用户请求的 MIG 配置。当标签更改时,MIG Manager 首先停止所有 GPU Pod,包括设备插件、GPU 功能发现和 DCGM 导出器。如果预安装了驱动程序,MIG Manager 接下来会停止 clients.yaml ConfigMap 中列出的所有主机 GPU 客户端。最后,它应用 MIG 重新配置并重新启动 GPU Pod 以及可能的主机 GPU 客户端。如果需要启用 MIG 模式,MIG 重新配置还可能涉及重新启动节点。

默认 MIG 配置文件在 default-mig-parted-config ConfigMap 中指定。您可以指定其中一个配置文件以应用于 mig.config 标签,从而触发 MIG 几何结构的重新配置。

MIG Manager 使用 mig-parted 工具来应用对 GPU 的配置更改,包括启用 MIG 模式(在某些情况下需要节点重新启动)。

flowchart subgraph mig[MIG Manager] direction TB A[Controller] <--> B[MIG-Parted] end A -- on change --> C subgraph recon[重新配置] C["配置正在挂起或重新启动"] --> D["停止 Operator Pod"] --> E["启用 MIG 模式并在需要时重新启动"] --> F["使用 mig-parted 配置 MIG 几何结构"] --> G["重新启动 Operator Pod"] end H["将 mig.config 标签设置为成功"] I["将 mig.config 标签设置为失败"] G --> H G -- on failure --> I