Azure Kubernetes 服务的 GPU 最佳做法(AKS)

在 AKS 群集上运行 GPU 工作负载需要正确设置和持续验证,以确保计算资源可访问、安全且得到最佳利用。 本文概述了使用特定于供应商的诊断命令管理已启用 GPU 的节点、验证配置和减少工作负荷中断的最佳做法。

GPU 工作负载(如 AI 模型训练、实时推理、模拟和视频处理)通常取决于以下配置:

  • 正确的 GPU 驱动程序和运行时兼容性。
  • GPU 资源的准确计划。
  • 访问容器内的 GPU 硬件设备。

配置不当可能会导致高成本、意外的作业失败或 GPU 使用不足。

强制实施 GPU 工作负荷放置

默认情况下,AKS 计划程序将 Pod 放置在具有足够 CPU 和内存的任何可用节点上。 如果没有指导,这可能会导致两个关键问题:

  1. GPU 工作负荷可以在没有 GPU 且无法启动的节点上进行计划,或者
  2. 常规用途工作负荷可能会占用 GPU 节点,从而浪费昂贵的资源。

若要强制实施正确的放置,请执行:

  • 使用密钥 [gpu-vendor].com/gpu: NoSchedule (例如,nvidia.com/gpu:NoSchedule)来排斥 GPU 节点。 这会阻止非 GPU 工作负荷在那里进行计划。
  • 在 GPU 工作负载 Pod 规范中添加匹配的容忍,以便可以在受污染的 GPU 节点上计划它。
  • 在 Pod 中定义 GPU 资源请求和限制,以确保计划程序保留 GPU 容量,例如:
resources:
  limits:
    [gpu-vendor].com/gpu: 1
  • 使用验证策略或允许控制器强制实施 GPU 工作负载,包括所需的容忍和资源限制。

此方法保证只有 GPU 就绪的工作负载位于 GPU 节点上,并有权访问所需的专用计算资源。

在部署生产 GPU 工作负载之前,请始终验证 GPU 节点池是否为:

  • 配备兼容的 GPU 驱动程序。
  • 托管正常的 Kubernetes 设备插件 DaemonSet。
  • 公开 [gpu-vendor].com/gpu 为可计划的资源。

可以使用与 GPU 供应商关联的系统管理接口(SMI)确认 GPU 节点池上运行的当前驱动程序版本。

以下命令从 GPU 设备插件部署 Pod 内部执行 nvidia-smi ,以验证已启用 NVIDIA GPU 的节点池上的驱动程序安装和运行时就绪情况:

kubectl exec -it $"{GPU_DEVICE_PLUGIN_POD}" -n {GPU_NAMESPACE} -- nvidia-smi

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

+-----------------------------------------------------------------------------+
|NVIDIA-SMI 570.xx.xx    Driver Version: 570.xx.xx    CUDA Version: 12.x|
...
...

对每个 GPU 节点池重复上述步骤,确认节点上安装的驱动程序版本。

在启用了 AMD GPU 的节点池上,或者 部署 AMD GPU 组件 ,并在 ROCm 设备插件 Pod 中执行 amd-smi 命令,以确认已安装的驱动程序版本。

使启用了 GPU 的节点保持更新到最新的节点 OS 映像

为了确保 AKS 上的 GPU 工作负载的性能、安全性和兼容性,必须使 GPU 节点池与最新的推荐节点 OS 映像保持最新。 这些更新至关重要,因为它们:

  • 包括最新的生产级 GPU 驱动程序,替换任何已弃用或生命周期结束(EOL)版本。
  • 经过全面测试,以便与当前的 Kubernetes 版本兼容。
  • 解决 GPU 供应商标识的已知漏洞。
  • 合并最新的 OS 和容器运行时改进,以提高稳定性和效率。

通过设置 自动升级通道 或通过 手动升级将 GPU 节点池升级到 AKS 发布的最新推荐节点 OS 映像。 可以使用 AKS 发布跟踪器监视和跟踪最新的节点映像版本。

使用共享群集时分离 GPU 工作负荷

如果具有 GPU 节点池的单个 AKS 群集运行的是多种类型的 GPU 工作负荷,例如模型训练、实时推理或批处理,请务必将这些工作负荷分开以:

  • 避免不同工作负荷类型之间的意外干扰或资源争用。
  • 提高安全性并维护合规性边界。
  • 简化对每个工作负荷类别的 GPU 资源使用情况的管理和监视。

可以使用命名空间和网络策略在单个 AKS 群集中隔离 GPU 工作负荷。 这样就可以通过特定于工作负荷的配额、限制和日志记录配置进行更清晰的治理。

示例方案

请考虑托管两种不同的 GPU 工作负荷类型的 AKS 群集,这些类型不需要相互通信:

  • 训练工作负荷:资源密集型 AI 模型训练作业。
  • 推理工作负荷:延迟敏感的实时推理服务。

可以使用以下步骤分隔两个工作负荷:

  1. 使用 kubectl create namespace 命令为每个工作负荷类型创建专用命名空间。

    kubectl create namespace gpu-training
    kubectl create namespace gpu-inference
    
  2. 按类型标记 GPU 工作负荷 Pod,如以下示例所示:

    metadata:
      namespace: gpu-training
      labels:
        workload: training
    
  3. 应用网络策略以隔离工作负荷类型之间的流量。 以下清单阻止命名空间的所有入口和出口 gpu-training (除非显式允许):

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-cross-namespace
      namespace: gpu-training
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
      ingress: []
      egress: []
    

此策略:

  • 适用于命名空间中的所有 gpu-training Pod。
  • 默认情况下,拒绝所有传入和传出流量,支持强隔离。

此模型增强了共享 GPU 环境中的清晰度、控制和安全性,尤其是在工作负荷类型具有不同的运行时配置文件、风险级别或作要求时。

后续步骤

若要详细了解 AKS 上的 GPU 工作负荷部署和管理,请参阅以下文章: