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

在 Azure Kubernetes 服务 (AKS) 上将 Windows GPU 用于计算密集型工作负载(预览)

图形处理单元 (GPU) 通常用于计算密集型工作负荷,例如图形和可视化工作负载。 AKS 支持启用了 GPU 的 Windows 和 Linux 节点池来运行计算密集型 Kubernetes 工作负载。

本文可帮助你在新的和现有 AKS 群集上预配带有可计划 GPU 的 Windows 节点(预览)。

支持启用了 GPU 的虚拟机 (VM)

要查看受支持的启用了 GPU 的 VM,请参阅《Azure 中优化了 GPU 的 VM 大小。 对于 AKS 节点池,建议的最小大小为 Standard_NC6s_v3。 AKS 不支持 NVv4 系列(基于 AMD GPU)。

注意

启用 GPU 的 VM 包含专用硬件,这些硬件定价较高,其可用性受区域限制。 有关详细信息,请参阅定价工具和区域可用性

限制

  • 不支持通过更新现有 Windows 节点池来添加 GPU。
  • Kubernetes 版本 1.28 及更低版本不支持。

开始之前

  • 本文假设你有现有 AKS 群集。 如果你没有 AKS 群集,请使用 Azure CLIAzure PowerShellAzure 门户创建一个。
  • 需要安装 Azure CLI 1.0.0b2 或更高版本,并将其配置为将 --skip-gpu-driver-install 字段与 az aks nodepool add 命令一起使用。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 需要安装 Azure CLI 9.0.0b5 或更高版本,并将其配置为将 --driver-type 字段与 az aks nodepool add 命令一起使用。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

获取群集的凭据

  • 使用 az aks get-credentials 命令获取 AKS 群集的凭据。 以下示例命令获取 myResourceGroup 资源组中 myAKSCluster 的凭据:

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

将 Windows GPU 与自动驱动程序安装配合使用

使用 NVIDIA GPU 会涉及安装各种 NVIDIA 软件组件(例如适用于 Kubernetes 的 DirectX 设备插件)、GPU 驱动程序等。 使用支持的已启用 GPU 的 VM 创建 Windows 节点池时,将会安装这些组件和相应的 NVIDIA CUDA 或 GRID 驱动程序。 对于 NC 和 ND 系列 VM 大小,已安装 CUDA 驱动程序。 对于 NV 系列 VM 大小,已安装 GRID 驱动程序。

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

安装 aks-preview Azure CLI 扩展

  • 使用 az extension addaz extension update 命令注册或更新 aks-preview 扩展。

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

注册 WindowsGPUPreview 功能标志

  1. 使用 az feature register 命令注册 WindowsGPUPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

创建启用了 Windows GPU 的节点池(预览)

要创建启用了 Windows GPU 的节点池,需要使用受支持的已启用 GPU 的 VM 大小,并指定 os-typeWindows。 默认 Windows os-skuWindows2022,但支持所有 Windows os-sku 选项。

  1. 使用 az aks nodepool add 命令创建启用了 Windows GPU 的节点池。

    az aks nodepool add \
       --resource-group myResourceGroup \
       --cluster-name myAKSCluster \
       --name gpunp \
       --node-count 1 \
       --os-type Windows \
       --kubernetes-version 1.29.0 \
       --node-vm-size Standard_NC6s_v3
    
  2. 检查 GPU 是否 可计划

  3. 确认 GPU 可计划后,可以运行 GPU 工作负载。

指定 GPU 驱动程序类型(预览)

默认情况下,AKS 为每个支持 GPU 的 VM 指定默认的 GPU 驱动程序类型。 由于工作负载和驱动程序兼容性对于 GPU 工作负载正常运行非常重要,因此可以为 Windows GPU 节点指定驱动程序类型。 Linux GPU 节点池不支持此功能。

创建具有 GPU 支持的 Windows 代理池时,可以选择使用 --driver-type 标志指定 GPU 驱动程序的类型。

可用选项包括:

  • GRID:针对需要虚拟化支持的应用程序。
  • CUDA:针对科学计算和数据密集型应用程序中的计算任务进行了优化。

注意

设置 --driver-type 标志时,你负责确保所选驱动程序类型与节点池的特定 VM 大小和配置兼容。 虽然 AKS 尝试验证兼容性,但在某些情况下,由于指定的驱动程序类型和基础 VM 或硬件之间不兼容,节点池创建可能会失败。

若要使用特定的 GPU 驱动程序类型创建启用了 Windows GPU 的节点池,请使用 az aks nodepool add 命令。

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --os-type Windows \
    --kubernetes-version 1.29.0 \
    --node-vm-size Standard_NC6s_v3 \
    --driver-type GRID

例如,上述命令使用 GPU 驱动程序类型 GRID 创建启用了 GPU 的节点池。 选择此驱动程序类型会替代 NC 系列 VM SKU 的默认 CUDA 驱动程序类型。

将 Windows GPU 与手动驱动程序安装配合使用

在 AKS 中使用 N 系列 (NVIDIA GPU) VM 大小创建 Windows 节点池时,会自动安装 GPU 驱动程序和 Kubernetes DirectX 设备插件。 要绕过此自动安装,请使用以下步骤:

  1. 使用 --skip-gpu-driver-install 跳过 GPU 驱动程序安装(预览版)
  2. 手动安装 Kubernetes DirectX 设备插件

跳过 GPU 驱动程序安装(预览版)

AKS 默认启用自动 GPU 驱动程序安装。 在某些情况下,例如安装自己的驱动程序时,可能需要跳过 GPU 驱动程序安装。

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

  1. 使用 az extension addaz extension update 命令注册或更新 aks-preview 扩展。

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. 使用带有 --skip-gpu-driver-install 标志的 az aks nodepool add 命令创建节点池,以跳过自动 GPU 驱动程序安装。

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022 \
        --skip-gpu-driver-install
    

注意

如果 AKS 上尚未载入正在使用的 --node-vm-size,则无法使用 GPU,并且 --skip-gpu-driver-install 会不起作用。

手动安装 Kubernetes DirectX 设备插件

可以为 Kubernetes DirectX 设备插件部署 DaemonSet,它会在每个节点上运行 Pod,以便为 GPU 提供所需的驱动程序。

  • 使用 az aks nodepool add 命令将节点池添加到你的群集。

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022
    

创建命名空间并部署 Kubernetes DirectX 设备插件

  1. 使用 kubectl create namespace 命令创建命名空间。

    kubectl create namespace gpu-resources
    
  2. 创建名为 k8s-directx-device-plugin.yaml 的文件,并粘贴适用于 Kubernetes 项目的 NVIDIA 设备插件中提供的以下 YAML 清单:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
          # reserves resources for critical add-on pods so that they can be rescheduled after
          # a failure.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
          volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
    
  3. 使用 kubectl apply 命令创建 DaemonSet 并确认已成功创建 NVIDIA 设备插件。

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. 现在,你已成功安装 NVIDIA 设备插件,可以检查 GPU 是否可计划

确认 GPU 是可计划的

创建完群集后,确认 GPU 在 Kubernetes 中是可计划的。

  1. 使用 kubectl get nodes 命令列出群集中的节点。

    kubectl get nodes
    

    输出应类似于以下示例输出:

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. 使用 kubectl describe node 命令确认 GPU 可计划。

    kubectl describe node aks-gpunp-28993262-0
    

    在“容量”部分下,GPU 应列为 microsoft.com/directx: 1。 输出应该类似于以下简洁示例输出:

    Capacity:
    [...]
     microsoft.com.directx/gpu:                 1
    [...]
    

使用容器见解监视 GPU 使用情况

适用于 AKS 的容器见解监视以下 GPU 使用情况指标:

指标名称 指标维度(标记) 说明
containerGpuDutyCycle container.azm.ms/clusterIdcontainer.azm.ms/clusterNamecontainerNamegpuIdgpuModelgpuVendor 在刚过去的采样周期(60 秒)中,GPU 处于繁忙/积极处理容器的状态的时间百分比。 占空比是 1 到 100 之间的数字。
containerGpuLimits container.azm.ms/clusterIdcontainer.azm.ms/clusterNamecontainerName 每个容器可以将限值指定为一个或多个 GPU。 不能请求或限制 GPU 的一部分。
containerGpuRequests container.azm.ms/clusterIdcontainer.azm.ms/clusterNamecontainerName 每个容器可以请求一个或多个 GPU。 不能请求或限制 GPU 的一部分。
containerGpumemoryTotalBytes container.azm.ms/clusterIdcontainer.azm.ms/clusterNamecontainerNamegpuIdgpuModelgpuVendor 可用于特定容器的 GPU 内存量(以字节为单位)。
containerGpumemoryUsedBytes container.azm.ms/clusterIdcontainer.azm.ms/clusterNamecontainerNamegpuIdgpuModelgpuVendor 特定容器使用的 GPU 内存量(以字节为单位)。
nodeGpuAllocatable container.azm.ms/clusterIdcontainer.azm.ms/clusterNamegpuVendor Kubernetes 可以使用的节点中的 GPU 数。
nodeGpuCapacity container.azm.ms/clusterIdcontainer.azm.ms/clusterNamegpuVendor 节点中的 GPU 总数。

清理资源

  • 使用 kubectl delete job 命令移除在本文中创建的相关 Kubernetes 对象。

    kubectl delete jobs windows-gpu-workload
    

后续步骤