将 GPU 用于 Azure 本地环境中的 AKS 以处理计算密集型工作负载

适用于:Azure Local 上的 AKS

注意

有关 Windows Server 上的 AKS 中的 GPU 的信息,请参阅 Windows Server 上的 AKS 中使用 GPU

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

支持的 GPU 模型

Azure 本地上的 AKS 支持以下 GPU 模型。 请注意,LINUX OS 节点池仅支持 GPU。 Windows OS 节点池不支持 GPU。

制造商 GPU 模型 支持的版本
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0

支持的 GPU 虚拟机大小

Azure 本地上的 AKS 支持每个 GPU 模型的以下 VM 大小。

NK T4 SKU 支持 Nvidia T4

VM 大小 GPU GPU 内存:GiB vCPU (虚拟中央处理器) 内存:GiB
Standard_NK6 1 8 6 12
Standard_NK12 2 16 12 24

Nvidia A2 由 NC2 A2 SKU 支持

VM 大小 GPU GPU 内存:GiB vCPU (虚拟中央处理器) 内存:GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 32 16 64
Standard_NC32_A2 2 32 32 128

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 32 16 64
Standard_NC32_A16 2 32 32 128

开始之前

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

第 1 步:安装操作系统

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

第 2 步:卸载 NVIDIA 主机驱动程序

在每台主机上,导航到控制面板 > 添加或删除程序,卸载 NVIDIA 主机驱动程序,然后重启机器。 机器重启后,确认驱动程序已成功卸载。 打开提升的 PowerShell 终端并运行以下命令:

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}

您应该会看到 GPU 设备显示为错误状态,如输出示例所示:

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

第 3 步:从主机卸载主机驱动程序

卸载主机驱动程序时,物理 GPU 会进入错误状态。 您必须从主机卸载所有 GPU 设备。

针对每个 GPU(3D 视频控制器)设备,在 PowerShell 中运行以下命令。 复制实例 ID;例如,上一个命令输出中的 PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

要确认 GPU 已从主机正确卸载,请运行以下命令。 应将 GPU 置于 Unknown 状态:

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

第 4 步:下载并安装 NVIDIA 缓解驱动程序

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

请参阅 NVIDIA 数据中心文档下载 NVIDIA 缓解驱动程序。 下载驱动程序后,展开存档并在每台主机上安装缓解驱动程序。 您可以按照此 PowerShell 脚本下载缓解驱动程序并将其解压缩:

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 Local 主机上实际安装的 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 | where {$_.friendlyname -match "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

第 5 步:重复第 1 步至第 4 步

对 Azure Local 群集中的每台服务器重复第 1 步至第 4 步。

第 6 步:继续部署 Azure Local 群集

按照 Azure 本地部署中的步骤继续部署 Azure 本地群集。

获取支持 GPU 的可用虚拟机 SKU 列表

Azure Local 群集部署完成后,可以运行以下 CLI 命令来显示部署中的可用虚拟机 SKU。 如果 GPU 驱动程序安装正确,则会列出相应的 GPU 虚拟机 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 虚拟机 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 的节点池遵循用于常规节点池的相同滚动升级模式。 为了能在物理主机上成功创建启用了 GPU 的新虚拟机节点池,需要有一个或多个可用的物理 GPU,以便成功分配设备。 这种可用性确保了当 Kubernetes 在此升级节点上调度 Pod 时,你的应用程序可以继续运行。

升级之前:

  1. 规划好升级期间的停机时间。
  2. 如果运行的是 Standard_NK6,则每个物理主机都有一个额外的 GPU;如果运行的是 Standard_NK12,则有 2 个额外的 GPU。 如果你当前的系统处于满负荷运行状态且没有额外的 GPU,我们建议在升级前将节点池缩容至单个节点,然后在升级成功后再进行扩容。

如果在升级期间物理机上没有额外的物理 GPU 会怎么样呢?

如果在没有额外 GPU 资源来支持滚动升级的集群上触发了升级操作,升级过程会暂停,直到有可用的 GPU 为止。 如果你当前的系统处于满负荷运行状态且没有额外的 GPU,我们建议在升级前将节点池缩容至单个节点,然后在升级成功后再进行扩容。

后续步骤