带有 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
安装 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 的节点上。可选:显示 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
可选:显示应用于节点的标签
$ 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
配置文件。
如果您不确定当前策略,请将 MIG 策略配置为
single
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \ --type='json' \ -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"single"}]'
使用要配置的配置文件标记节点
$ kubectl label nodes <node-name> nvidia.com/mig.config=all-1g.10gb --overwrite
MIG Manager 继续向节点应用
mig.config.state
标签,并终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为所需的 MIG 几何结构。可选:显示节点标签
$ 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
。通过检查节点标签确认 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"
可选:在驱动程序容器中运行
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
配置文件。
如果您不确定当前策略,请将 MIG 策略配置为
mixed
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \ --type='json' \ -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
使用要配置的配置文件标记节点
$ kubectl label nodes <node-name> nvidia.com/mig.config=all-balanced --overwrite
MIG Manager 继续向节点应用
mig.config.state
标签,并终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为所需的 MIG 几何结构。通过检查节点标签确认 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" }
可选:在驱动程序容器中运行
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
配置文件。
使用配置文件标记节点
$ kubectl label nodes <node-name> nvidia.com/mig.config=all-3g.40gb --overwrite
可选:监视 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'
可选:显示节点标签以确认 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。
在您的
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
如果自定义配置指定了多个实例配置文件,请将策略设置为
mixed
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \ --type='json' \ -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
使用要配置的配置文件标记节点
$ kubectl label nodes <node-name> nvidia.com/mig.config=custom-mig --overwrite
示例:自定义 MIG 配置#
默认情况下,Operator 创建 default-mig-parted-config
ConfigMap,并且 MIG Manager 配置为从该 ConfigMap 读取配置文件。
如果默认配置文件不满足您的业务需求,您可以创建具有自定义配置的 ConfigMap。
创建一个文件,例如
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
应用清单
$ kubectl apply -n gpu-operator -f custom-mig-config.yaml
如果自定义配置指定了多个实例配置文件,请将策略设置为
mixed
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \ --type='json' \ -p='[{"op":"replace", "path":"/spec/mig/strategy", "value":"mixed"}]'
修补集群策略,以便 MIG Manager 使用自定义 ConfigMap
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \ --type='json' \ -p='[{"op":"replace", "path":"/spec/migManager/config/name", "value":"custom-mig-config"}]'
使用要配置的配置文件标记节点
$ kubectl label nodes <node-name> nvidia.com/mig.config=five-1g-one-2g --overwrite
可选:监视 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 使用
创建
gpu-operator
命名空间$ kubectl create namespace gpu-operator
创建一个
ConfigMap
,其中包含带有 GPU 客户端列表的自定义 clients.yaml 文件$ kubectl create configmap -n gpu-operator gpu-clients --from-file=clients.yaml
安装 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 模式(在某些情况下需要节点重新启动)。