将 AMD GPU 用于 Azure Kubernetes 服务(AKS)上的计算密集型工作负荷

Azure 上的 AMD GPU 虚拟机(VM) 大小可以灵活地提供性能和成本,同时提供高计算容量,同时允许你为工作负荷需求选择合适的配置。 AKS 支持支持 AMD GPU 的 Linux 节点池来运行计算密集型 Kubernetes 工作负载。

本文可帮助你在新的和现有的 AKS 群集上预配具有可计划 AMD GPU 的节点。

局限性

  • AKS 目前支持由 Standard_ND96isr_MI300X_v5 提供支持的 Azure VM 大小。
  • AKS 不支持更新现有节点池以添加 AMD GPU VM 大小。
  • 不支持使用 AMD GPU VM 大小更新未启用 AMD GPU 的节点池。
  • AzureLinuxWindows 尚未支持 AMD GPU。

在您开始之前

  • 本文假设你有现有 AKS 群集。 如果没有群集,请使用 Azure CLIAzure PowerShellAzure 门户创建群集。
  • 需要安装 Azure CLI 2.72.2 或更高版本才能设置 --gpu-driver 字段。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅 [安装 Azure CLI][install-azure-cli]。
  • 如果 aks-preview 已安装 Azure CLI 扩展,请将版本更新为 18.0.0b2 或更高版本。

注释

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

获取群集的凭据

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

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

使用 AMD GPU 的选项

使用 AMD GPU 涉及安装各种 AMD GPU 软件组件,例如 用于 Kubernetes 的 AMD 设备插件、GPU 驱动程序等。

注释

目前,AKS 不会管理也不自动安装 GPU 驱动程序或已启用 AMD GPU 的节点池上的 AMD GPU 设备插件。

注册 AKSInfinibandSupport 功能

  1. 如果 AMD GPU VM 大小启用了 RDMA 并使用了 r 命名约定(例如 Standard_ND96isr_MI300X_v5),则需确保节点池中的计算机位于同一物理 Infiniband 网络上。 为此,请使用AKSInfinibandSupport以下命令注册az feature register功能标志:

    az feature register --name AKSInfinibandSupport --namespace Microsoft.ContainerService
    
  2. 使用 az feature show 命令验证注册状态:

    az feature show \
    --namespace "Microsoft.ContainerService" \
    --name AKSInfinibandSupport
    
  3. 使用 az aks nodepool add 命令创建支持 AMD GPU 的节点池,并通过将 API 字段 --gpu-driver 设置为值 none跳过默认驱动程序安装:

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --node-vm-size Standard_ND96isr_MI300X_v5 \
        --gpu-driver none
    

    注释

    AKS 当前强制使用 gpu-driver 字段来跳过 AMD GPU 节点池创建时的自动驱动程序安装。

在 AKS平台上部署 AMD GPU 管理程序

AMD GPU作员自动管理并部署预配 GPU 所需的所有 AMD 软件组件,包括驱动程序安装、Kubernetes 的 AMD 设备插件、AMD 容器运行时等。 由于 AMD GPU作员处理这些组件,因此无需在 AKS 群集上单独安装 AMD 设备插件。 这也意味着应该跳过自动GPU驱动程序安装,以便在AKS上使用AMD GPU操作器。

  1. 按照 AMD 文档 安装 GPU 操作员

  2. 使用 kubectl get nodes 以下命令检查节点池中 AMD GPU 的状态:

    kubectl get nodes -o custom-columns=NAME:.metadata.name,GPUs:.status.capacity.'amd\.com/gpu'
    

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

    NAME                    STATUS   ROLES   AGE    VERSION
    aks-gpunp-00000000      Ready    agent   2m4s   v1.31.7
    

确认 AMD GPU 是可调度的

创建节点池后,请确认 AKS 群集中 GPU 是否可调度。

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

    kubectl get nodes
    
  2. 使用 kubectl describe node 命令确认 GPU 是否可调度。

    kubectl describe node aks-gpunp-00000000
    

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

    Name:               aks-gpunp-00000000
    Roles:              agent
    Labels:             accelerator=amd
    
    [...]
    
    Capacity:
    [...]
     amd.com/gpu:                 1
    [...]
    

运行启用了 AMD GPU 的工作负荷

若要查看 AMD GPU 的运行情况,可以使用相应的资源请求来计划启用了 GPU 的工作负荷。 在此示例中,我们将针对 MNIST 数据集运行一个 Tensorflow 作业。

  1. 创建名为“samples-tf-mnist-demo.yaml”的文件并粘贴以下 YAML 清单,它包含 amd.com/gpu: 1 的资源限制:

    apiVersion: batch/v1
    kind: Job
    metadata:
      labels:
        app: samples-tf-mnist-demo
      name: samples-tf-mnist-demo
    spec:
      template:
        metadata:
          labels:
            app: samples-tf-mnist-demo
        spec:
          containers:
          - name: samples-tf-mnist-demo
            image: mcr.azk8s.cn/azuredocs/samples-tf-mnist-demo:gpu
            args: ["--max_steps", "500"]
            imagePullPolicy: IfNotPresent
            resources:
              limits:
               amd.com/gpu: 1
          restartPolicy: OnFailure
          tolerations:
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
    
  2. 使用 kubectl apply 命令运行作业,该命令会分析清单文件并创建定义的 Kubernetes 对象。

    kubectl apply -f samples-tf-mnist-demo.yaml
    

查看启用了 GPU 的工作负载的状态

  1. kubectl get jobs 命令与 --watch 标志配合使用,以监视作业的进度。 首先拉取映像并处理数据集可能需要几分钟时间。

    kubectl get jobs samples-tf-mnist-demo --watch
    

    COMPLETIONS 列显示 1/1 时,作业已成功完成,如以下示例输出所示:

    NAME                    COMPLETIONS   DURATION   AGE
    
    samples-tf-mnist-demo   0/1           3m29s      3m29s
    samples-tf-mnist-demo   1/1   3m10s   3m36s
    
  2. 使用 kubectl --watch 退出 进程。

  3. 使用 kubectl get pods 命令获取 pod 的名称。

    kubectl get pods --selector app=samples-tf-mnist-demo
    

清理资源

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

kubectl delete jobs samples-tf-mnist-demo

后续步骤