你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 中创建多实例 GPU 节点池

NVIDIA 的 A100 GPU 最多可分为七个独立的实例。 每个实例都拥有自己的流多处理器 (SM)(负责并行执行指令)和 GPU 内存。 有关 NVIDIA A100 的详细信息,请参阅 NVIDIA A100 GPU

本文介绍如何在 Azure Kubernetes 服务 (AKS) 群集中使用 MIG 兼容的 VM 大小创建多实例 GPU 节点池。

先决条件和限制

  • 具有活动订阅的 Azure 帐户。 如果没有帐户,可以免费创建一个帐户
  • 已安装并配置 Azure CLI 2.2.0 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 已安装并配置 Kubernetes 命令行客户端 kubectl。 如果使用的是 Azure Cloud Shell,则 kubectl 已安装。 若要在本地安装,可以使用 az aks install-cli 命令。
  • 已安装并配置 Helm v3。 有关详细信息,请参阅安装 Helm
  • Azure Linux 目前不支持多实例 GPU 节点池。
  • 不能将群集自动缩放程序用于多实例 GPU 节点池。

GPU 实例配置文件

GPU 实例配置文件定义 GPU 的分区方式。 下表显示了 Standard_ND96asr_v4 可用的 GPU 实例配置文件:

配置文件名称 SM 的小数部分 内存的小数部分 创建的实例数
MIG 1g.5gb 1/7 1/8 7
MIG 2g.10gb 2/7 2/8 3
MIG 3g.20gb 3/7 4/8 2
MIG 4g.20gb 4/7 4/8 1
MIG 7g.40gb 7/7 8/8 1

例如,MIG 1g.5gb 的 GPU 实例配置文件显示每个 GPU 实例有 1G SM(流式多处理器)和 5GB 内存。 在这种情况下,GPU 将分区为七个实例。

可用于此 VM 大小的 GPU 实例配置文件包括 MIG1gMIG2gMIG3gMIG4gMIG7g

重要

创建节点池后,无法更改应用的 GPU 实例配置文件。

创建 AKS 群集

  1. 使用 az group create 命令创建 Azure 资源组。

    az group create --name myResourceGroup --location southcentralus
    
  2. 使用 az aks create 命令创建 AKS 群集。

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --generate-ssh-keys
    
  3. 使用 az aks get-credentials 命令将 kubectl 配置为连接到 AKS 群集。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

创建多实例 GPU 节点池

可以使用 Azure CLI 或对 ARM API 的 HTTP 请求来创建节点池。

  • 使用 az aks nodepool add 命令创建多实例 GPU 节点池,并指定 GPU 实例配置文件。 以下示例创建一个具有 Standard_ND96asr_v4 MIG 兼容 GPU VM 大小的节点池。

    az aks nodepool add \
        --name aks-mignode \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --node-vm-size Standard_ND96asr_v4 \
        --node-count 1 \
        --gpu-instance-profile MIG1g
    

确定多实例 GPU (MIG) 策略

在安装 NVIDIA 插件之前,需要指定用于 GPU 分区的多实例 GPU (MIG) 策略:“单一策略”或“混合策略”。 这两种策略不会影响执行 CPU 工作负载的方式,但会影响 GPU 资源的显示方式。

  • “单一策略”:将每个 GPU 实例视为一个 GPU。 如果使用此策略,GPU 资源将显示为 nvidia.com/gpu: 1
  • “混合策略”:公开 GPU 实例和 GPU 实例配置文件。 如果使用此策略,GPU 资源将显示为 nvidia.com/mig1g.5gb: 1

安装 NVIDIA 设备插件和 GPU 功能发现 (GFD) 组件

  1. 将 MIG 策略设置为环境变量。 可以使用单一策略或混合策略。

    # Single strategy
    export MIG_STRATEGY=single
    
    # Mixed strategy
    export MIG_STRATEGY=mixed
    
  2. 使用 helm repo addhelm repo update 命令添加 NVIDIA 设备插件 helm 存储库。

    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
    helm repo update
    
  3. 使用 helm install 命令安装 NVIDIA 设备插件。

    helm install nvdp nvdp/nvidia-device-plugin \
    --version=0.15.0 \
    --generate-name \
    --set migStrategy=${MIG_STRATEGY} \
    --set gfd.enabled=true \
    --namespace nvidia-device-plugin \
    --create-namespace
    

注意

NVIDIA 设备插件版本 0.15.0 及更高版本的 Helm 安装整合了设备插件和 GFD 存储库。 本教程不建议单独安装 GFD 软件组件。

确认多实例 GPU 功能

  1. 使用 kubectl get 命令返回群集节点列表,以验证与群集之间的 kubectl 连接。

    kubectl get nodes -o wide
    
  2. 使用 kubectl describe node 命令确认节点具有多实例 GPU 功能。 以下示例命令描述名为 aks-mignode 的节点,该节点使用 MIG1g 作为 GPU 实例配置文件。

    kubectl describe node aks-mignode
    

    输出应与下面的示例输出类似:

    # Single strategy output
    Allocatable:
        nvidia.com/gpu: 56
    
    # Mixed strategy output
    Allocatable:
        nvidia.com/mig-1g.5gb: 56
    

计划工作

以下示例基于 Ubuntu 22.04 的 CUDA 基础映像版本 12.1.1(标记为 12.1.1-base-ubuntu22.04)。

单一策略

  1. 创建名为 single-strategy-example.yaml 的文件,并将其复制到以下清单中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-single
    spec:
      containers:
      - name: nvidia-single
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 1000"]
        resources:
          limits:
            "nvidia.com/gpu": 1
    
  2. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称。

    kubectl apply -f single-strategy-example.yaml
    
  3. 使用 kubectl exec 命令验证分配的 GPU 设备。 此命令将返回群集节点的列表。

    kubectl exec nvidia-single -- nvidia-smi -L
    

    以下示例类似于显示已成功创建部署和服务的输出:

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    MIG 1g.5gb     Device  1: (UUID: MIG-3d4db13e-c42d-5555-98f4-8b50389791bc)
    MIG 1g.5gb     Device  2: (UUID: MIG-de819d17-9382-56a2-b9ca-aec36c88014f)
    MIG 1g.5gb     Device  3: (UUID: MIG-50ab4b32-92db-5567-bf6d-fac646fe29f2)
    MIG 1g.5gb     Device  4: (UUID: MIG-7b6b1b6e-5101-58a4-b5f5-21563789e62e)
    MIG 1g.5gb     Device  5: (UUID: MIG-14549027-dd49-5cc0-bca4-55e67011bd85)
    MIG 1g.5gb     Device  6: (UUID: MIG-37e055e8-8890-567f-a646-ebf9fde3ce7a)
    

混合策略

  1. 创建名为 mixed-strategy-example.yaml 的文件,并将其复制到以下清单中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-mixed
    spec:
      containers:
      - name: nvidia-mixed
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 100"]
        resources:
          limits:
            "nvidia.com/mig-1g.5gb": 1
    
  2. 使用 kubectl apply 命令部署应用程序,并指定 YAML 清单的名称。

    kubectl apply -f mixed-strategy-example.yaml
    
  3. 使用 kubectl exec 命令验证分配的 GPU 设备。 此命令将返回群集节点的列表。

    kubectl exec nvidia-mixed -- nvidia-smi -L
    

    以下示例类似于显示已成功创建部署和服务的输出:

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    

重要

在 Docker Hub 上,CUDA 图像的 latest 标签已被弃用。 请参阅 NVIDIA 存储库以获取最新图片和相应的标签。

疑难解答

如果在创建节点池后看不到多实例 GPU 功能,请确认 API 版本不早于 2021-08-01

后续步骤

若要详细了解 Azure Kubernetes 服务上的 GPU,请参阅: