你当前正在访问 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)。
限制
- 不支持通过更新现有 Windows 节点池来添加 GPU。
- Kubernetes 版本 1.28 及更低版本不支持。
开始之前
- 本文假设你有现有 AKS 群集。 如果你没有 AKS 群集,请使用 Azure CLI、Azure PowerShell 或 Azure 门户创建一个。
- 需要安装 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 add
或az 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
功能标志
使用
az feature register
命令注册WindowsGPUPreview
功能标志。az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
状态显示为“已注册”需要几分钟时间。
使用
az feature show
命令验证注册状态。az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
当状态反映为已注册时,使用
az provider register
命令刷新 Microsoft.ContainerService 资源提供程序的注册。az provider register --namespace Microsoft.ContainerService
创建启用了 Windows GPU 的节点池(预览)
要创建启用了 Windows GPU 的节点池,需要使用受支持的已启用 GPU 的 VM 大小,并指定 os-type
为 Windows
。 默认 Windows os-sku
是 Windows2022
,但支持所有 Windows os-sku
选项。
使用
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
检查 GPU 是否 可计划。
确认 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 设备插件。 要绕过此自动安装,请使用以下步骤:
- 使用
--skip-gpu-driver-install
跳过 GPU 驱动程序安装(预览版)。 - 手动安装 Kubernetes DirectX 设备插件。
跳过 GPU 驱动程序安装(预览版)
AKS 默认启用自动 GPU 驱动程序安装。 在某些情况下,例如安装自己的驱动程序时,可能需要跳过 GPU 驱动程序安装。
重要
AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
使用
az extension add
或az 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
使用带有
--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 设备插件
使用
kubectl create namespace
命令创建命名空间。kubectl create namespace gpu-resources
创建名为 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
使用
kubectl apply
命令创建 DaemonSet 并确认已成功创建 NVIDIA 设备插件。kubectl apply -f nvidia-device-plugin-ds.yaml
现在,你已成功安装 NVIDIA 设备插件,可以检查 GPU 是否可计划。
确认 GPU 是可计划的
创建完群集后,确认 GPU 在 Kubernetes 中是可计划的。
使用
kubectl get nodes
命令列出群集中的节点。kubectl get nodes
输出应类似于以下示例输出:
NAME STATUS ROLES AGE VERSION aks-gpunp-28993262-0 Ready agent 13m v1.20.7
使用
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/clusterId 、container.azm.ms/clusterName 、containerName 、gpuId 、gpuModel 、gpuVendor |
在刚过去的采样周期(60 秒)中,GPU 处于繁忙/积极处理容器的状态的时间百分比。 占空比是 1 到 100 之间的数字。 |
containerGpuLimits | container.azm.ms/clusterId 、container.azm.ms/clusterName 、containerName |
每个容器可以将限值指定为一个或多个 GPU。 不能请求或限制 GPU 的一部分。 |
containerGpuRequests | container.azm.ms/clusterId 、container.azm.ms/clusterName 、containerName |
每个容器可以请求一个或多个 GPU。 不能请求或限制 GPU 的一部分。 |
containerGpumemoryTotalBytes | container.azm.ms/clusterId 、container.azm.ms/clusterName 、containerName 、gpuId 、gpuModel 、gpuVendor |
可用于特定容器的 GPU 内存量(以字节为单位)。 |
containerGpumemoryUsedBytes | container.azm.ms/clusterId 、container.azm.ms/clusterName 、containerName 、gpuId 、gpuModel 、gpuVendor |
特定容器使用的 GPU 内存量(以字节为单位)。 |
nodeGpuAllocatable | container.azm.ms/clusterId 、container.azm.ms/clusterName 、gpuVendor |
Kubernetes 可以使用的节点中的 GPU 数。 |
nodeGpuCapacity | container.azm.ms/clusterId 、container.azm.ms/clusterName 、gpuVendor |
节点中的 GPU 总数。 |
清理资源
使用
kubectl delete job
命令移除在本文中创建的相关 Kubernetes 对象。kubectl delete jobs windows-gpu-workload
后续步骤
- 若要运行 Apache Spark 作业,请参阅在 AKS 上运行 Apache Spark 作业。
- 有关 Kubernetes 计划程序功能的详细信息,请参阅有关 AKS 中的高级计划程序功能的最佳做法。
- 有关 Azure Kubernetes 服务和 Azure 机器学习的详细信息,请参阅: