对 AKS 边缘软件包使用 GPU 加速(预览版)

重要

AKS Edge Essentials 的 GPU 加速目前处于预览阶段。 有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅Microsoft Azure 预览版 补充使用条款

GPU 是适用于人工智能计算的常用选项,因为它们提供并行处理功能,并且通常可以执行基于视觉的推断,速度比 CPU 更快。 为了更好地支持人工智能和机器学习应用程序,AKS Edge Essentials 可以将 GPU 公开给虚拟机的 Linux 模块。

AKS Edge Essentials 支持 GPU-Paravirtualization (GPU-PV)作为 GPU 直通技术。 换句话说,GPU 在 Linux 虚拟机和主机之间共享。

重要

这些功能包括 NVIDIA Corporation 或其许可商开发并拥有的组件。 通过使用 GPU 加速功能,你接受并同意 NVIDIA 最终用户许可协议的条款

先决条件

AKS Edge Essentials 的 GPU 加速目前支持一组特定的 GPU 硬件。 此外,使用此功能需要特定版本的 Windows。

支持的 GPU 和所需的 Windows 版本如下所示:

支持的 GPU GPU 直通类型 支持的 Windows 版本
NVIDIA GeForce、Quadro、RTX GPU-PV Windows 10/11(专业版、企业版、IoT 企业版)

重要

GPU-PV 支持可能仅限于某些代处理器或 GPU 体系结构,由 GPU 供应商决定。 有关详细信息,请参阅适用于 WSL 的 NVIDIA CUDA 文档

Windows 10 用户必须使用 2021 年 11 月更新版本 19044.1620 或更高版本。 安装完成后,可在命令提示符下运行 winver 来验证内部版本。

嵌套虚拟化不支持 GPU 直通,例如在 Windows 虚拟机中运行 AKS Edge Essentials 时。

系统设置和安装

以下部分包含安装和安装信息。

  • 对于 NVIDIA GeForce/Quadro/RTX GPU,请下载并安装适用于 Linux 的 Windows 子系统 (WSL) 的支持 NVIDIA CUDA 的驱动程序,以便与现有 CUDA ML 工作流一起使用。 最初为 WSL 开发,适用于 WSL 驱动程序的 CUDA 也用于 AKS Edge Essentials。
  • Windows 10 用户还必须 安装 WSL ,因为某些库在 WSL 和 AKS Edge Essentials 之间共享。
  • 安装或升级 AKS Edge Essentials 到 2024 年 5 月或更高版本。 有关详细信息,请参阅 更新 AKS Edge Essentials 群集。 k8s 和 k3s Kubernetes 分发版都支持 GPU-PV。

在 AKS Edge Essentials 部署中启用 GPU-PV

步骤 1:单台计算机配置参数

可以生成创建单个计算机群集所需的参数,并使用以下命令添加必要的 GPU-PV 配置参数。

此脚本仅侧重于 GPU-PV 配置;还应根据自己的 AKS Edge Essentials 部署进行其他必要的常规更新:

$jsonObj = New-AksEdgeConfig -DeploymentType SingleMachineCluster
$jsonObj.User.AcceptGpuWarning = $true
$machine = $jsonObj.Machines[0]
$machine.LinuxNode.GpuPassthrough.Name = "NVIDIA GeForce GTX 1070"
$machine.LinuxNode.GpuPassthrough.Type = "ParaVirtualization"
$machine.LinuxNode.GpuPassthrough.Count = 1

启用 GPU-PV 的关键参数包括:

  • User.AcceptGpuWarning:将此参数设置为 true 在 AKS Edge Essentials 上启用 GPU-PV 时自动接受确认消息。
  • LinuxNode.GpuPassthrough.Name:介绍在此计算机中部署的 GPU 模型,并安装了适当的驱动程序。
  • LinuxNode.GpuPassthrough.Type:描述 GPU 直通类型。 目前仅支持 ParaVirtualization 群集。
  • LinuxNode.GpuPassthrough.Count:描述此计算机上安装了多少个 GPU。

步骤 2:创建单个计算机群集

  1. 现在,可以运行 New-AksEdgeDeployment cmdlet 来部署具有单个 Linux 控制平面节点的单台计算机 AKS Edge 群集。 可以使用步骤 1生成的 JSON 对象并将其作为字符串传递:

    New-AksEdgeDeployment -JsonConfigString (New-AksEdgeConfig | ConvertTo-Json -Depth 4)
    
  2. 成功部署后,通过运行以下方法 nvidia-smi验证 GPU-PV 是否已启用:

    显示 NVIDIA smi 输出的屏幕截图。

步骤 3:部署 Nvidia runtimeclass

  1. 创建包含以下内容的名为 nvidia-runtimeclass.yaml 的 YAML 文件:

    apiVersion: node.k8s.io/v1
    kind: RuntimeClass
    metadata:
      name: nvidia
    handler: nvidia
    
  2. runtimeclass部署 :

    kubectl apply –f nvidia-runtimeclass.yaml
    

步骤 4:安装 Nvidia GPU 设备插件

  1. 此 GitHub 位置下载 nvidia-deviceplugin.yaml

  2. 将 nvidia-deviceplugin.yaml 文件中的容器映像位置更新为新值,如下所示:

    containers:
    - image: registry.gitlab.com/nvidia/kubernetes/device-plugin/staging/k8s-device-plugin:6a31a868
    
  3. 安装 Nvidia GPU DevicePlugin:

    kubectl apply –f nvidia-deviceplugin.yaml
    
  4. 使用kubectl get pods -A命令检查 devicepluginkubectl logs $podname -n kube-system日志,验证插件是否正在运行,并检测到 NVIDIA GPU:

    显示 kubectl logs 命令输出的屏幕截图。

示例工作负荷入门

  1. 准备名为 gpu-workload.yaml 的工作负荷 YAML 文件:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/gpu: 1 # requesting 1 GPU
      tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
    
  2. 运行示例工作负荷:

    kubectl apply -f .\gpu-workload.yaml
    
  3. 验证工作负荷是否已成功运行:

    显示工作负荷已成功运行的屏幕截图。

后续步骤

AKS 边缘软件包概述