将 GPU 用于计算密集型工作负载 (Azure Stack HCI 23H2 上的 AKS)

适用于:Azure Stack HCI 版本 23H2

注意

有关 Azure Stack HCI 22H2 上的 AKS 中的 GPU 的信息,请参阅 将 GPU (HCI 22H2)

图形处理单元 (GPU) 用于计算密集型工作负载,例如机器学习、深度学习等。 本文介绍如何在 Azure Arc 启用的 AKS 中将 GPU 用于计算密集型工作负载。

支持的 GPU 模型

Azure Stack HCI 23H2 上的 AKS 支持以下 GPU 模型:

制造商 GPU 模型 支持的版本
Nvidia A2 2311.2
Nvidia A16 2402.0

支持的 VM 大小

Azure Stack HCI 23H2 上的 AKS 支持每个 GPU 模型的以下 VM 大小。

NC2 A2 SKU 支持 Nvidia A2

VM 大小 GPU GPU 内存:GiB vCPU 内存:GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 48 16 64
Standard_NC32_A2 2 48 32 28

NC2 A16 SKU 支持 Nvidia A16

VM 大小 GPU GPU 内存:GiB vCPU 内存:GiB
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 48 16 64
Standard_NC32_A16 2 48 32 28

准备阶段

若要在 AKS Arc 中使用 GPU,请确保在开始部署群集之前安装了必要的 GPU 驱动程序。 请遵循本部分中的步骤。

步骤 1:安装 OS

在 Azure Stack HCI 群集中的每个服务器上本地安装 Azure Stack HCI 版本 23H2 操作系统。

步骤 2:下载并安装 NVIDIA 缓解驱动程序

该软件可能包括 NVIDIA Corporation 或其许可方开发和拥有的组件。 这些组件的使用受 NVIDIA 最终用户许可协议的约束。

请参阅 NVIDIA 数据中心文档 ,下载 NVIDIA 缓解驱动程序。 下载驱动程序后,展开存档并在每台主机上安装缓解驱动程序。

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

若要安装缓解驱动程序,请导航到包含提取文件的文件夹,并根据 Azure Stack HCI 主机上安装的实际 GPU 类型选择 GPU 驱动程序文件。 例如,如果类型为 A2 GPU,请右键单击 nvidia_azure_stack_A2_base.inf 文件,然后选择“ 安装”。

还可以使用命令行进行安装,方法是导航到 文件夹并运行以下命令来安装缓解驱动程序:

pnputil /add-driver nvidia_azure_stack_A2_base.inf /install 
pnputil /scan-devices 

安装缓解驱动程序后,GPU 将列在“Nvidia A2_base - 已卸载”下的“正常”状态中:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

步骤 3:重复步骤 1 和 2

对 HCI 群集中的每个服务器重复步骤 1 和 2。

步骤 4:继续部署 Azure Stack HCI 群集

按照 Azure Stack HCI 版本 23H2 部署中的步骤继续部署 Azure Stack HCI 群集。

获取已启用 GPU 的可用 VM SKU 的列表

Azure Stack HCI 群集部署完成后,可以运行以下 CLI 命令来显示部署中的可用 VM SKU。 如果 GPU 驱动程序安装正确,则会列出相应的 GPU VM SKU:

az aksarc vmsize list --custom-location <custom location ID> -g <resource group name>

使用启用了 GPU 的节点池创建新的工作负载群集

目前,使用支持 GPU 的节点池这一功能仅适用于 Linux 节点池。 创建新的 Kubernetes 群集:

az aksarc create -n <aks cluster name> -g <resource group name> --custom-location <custom location ID> --vnet-ids <vnet ID>

以下示例添加一个节点池,其中包含 2 个启用了 GPU 的 (NVDIA A2) 节点,这些节点具有 Standard_NC4_A2 VM SKU:

az aksarc nodepool add --cluster-name <aks cluster name> -n <node pool name> -g <resource group name> --node-count 2 --node-vm-size Standard_NC4_A2 --os-type Linux

确认可以计划 GPU

创建 GPU 节点池后,确认可以在 Kubernetes 中计划 GPU。 首先,使用 kubectl get nodes 命令列出群集中的节点:

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

现在,使用 kubectl describe node 命令确认可以计划 GPU。 在 “容量 ”部分下,GPU 应显示为 nvidia.com/gpu:1

kubectl describe <node> | findstr "gpu" 

输出应显示来自工作器节点的 GPU () ,如下所示:

Capacity: 
  cpu:                4 
  ephemeral-storage:  103110508Ki 
  hugepages-1Gi:      0 
  hugepages-2Mi:      0 
  memory:             7865020Ki 
  nvidia.com/gpu:     1 
  pods:               110

运行启用了 GPU 的工作负荷

完成前面的步骤后,创建新的 YAML 文件进行测试;例如 gpupod.yaml。 将以下 YAML 复制并粘贴到名为 gpupod.yaml 的新文件中,然后将其保存:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

运行以下命令以部署示例应用程序:

kubectl apply -f gpupod.yaml

验证 Pod 是否已启动、已完成运行,以及是否已分配 GPU:

kubectl describe pod cuda-vector-add | findstr 'gpu'

上一个命令应显示分配的一个 GPU:

nvidia.com/gpu: 1
nvidia.com/gpu: 1

检查 Pod 的日志文件,查看测试是否已通过:

kubectl logs cuda-vector-add

下面是上一个命令的示例输出:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

如果在调用驱动程序时收到版本不匹配错误,例如“CUDA 驱动程序版本对于 CUDA 运行时版本不够”,请查看 NVIDIA 驱动程序矩阵兼容性图表

常见问题解答

升级启用了 GPU 的节点池期间会发生什么情况?

升级启用了 GPU 的节点池遵循用于常规节点池的相同滚动升级模式。 要使新 VM 中启用了 GPU 的节点池在物理主机上成功创建,需要一个或多个物理 GPU 可用于成功分配设备。 此可用性可确保当 Kubernetes 在此升级的节点上计划 Pod 时,应用程序可以继续运行。

升级准备工作:

  1. 规划升级期间的停机时间。
  2. 如果运行Standard_NK6,则每个物理主机有一个额外的 GPU;如果运行Standard_NK12,则为每个物理主机提供 2 个额外的 GPU。 如果以满容量运行并且没有额外的 GPU,我们建议在升级之前将节点池缩减到单个节点,然后在升级成功后纵向扩展。

如果在升级期间物理计算机上没有额外的物理 GPU,会发生什么情况?

如果在群集上触发升级,但没有额外的 GPU 资源来促进滚动升级,则升级过程将挂起,直到 GPU 可用。 如果以满容量运行并且没有额外的 GPU,我们建议在升级之前将节点池缩减到单个节点,然后在升级成功后纵向扩展。

后续步骤