在 AKS 群集上运行 GPU 工作负载需要正确设置和持续验证,以确保计算资源可访问、安全且得到最佳利用。 本文概述了使用特定于供应商的诊断命令管理已启用 GPU 的节点、验证配置和减少工作负荷中断的最佳做法。
GPU 工作负载(如 AI 模型训练、实时推理、模拟和视频处理)通常取决于以下配置:
- 正确的 GPU 驱动程序和运行时兼容性。
- GPU 资源的准确计划。
- 访问容器内的 GPU 硬件设备。
配置不当可能会导致高成本、意外的作业失败或 GPU 使用不足。
强制实施 GPU 工作负荷放置
默认情况下,AKS 计划程序将 Pod 放置在具有足够 CPU 和内存的任何可用节点上。 如果没有指导,这可能会导致两个关键问题:
- GPU 工作负荷可以在没有 GPU 且无法启动的节点上进行计划,或者
- 常规用途工作负荷可能会占用 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 模型训练作业。
- 推理工作负荷:延迟敏感的实时推理服务。
可以使用以下步骤分隔两个工作负荷:
使用
kubectl create namespace命令为每个工作负荷类型创建专用命名空间。kubectl create namespace gpu-training kubectl create namespace gpu-inference按类型标记 GPU 工作负荷 Pod,如以下示例所示:
metadata: namespace: gpu-training labels: workload: training应用网络策略以隔离工作负荷类型之间的流量。 以下清单阻止命名空间的所有入口和出口
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-trainingPod。 - 默认情况下,拒绝所有传入和传出流量,支持强隔离。
此模型增强了共享 GPU 环境中的清晰度、控制和安全性,尤其是在工作负荷类型具有不同的运行时配置文件、风险级别或作要求时。
后续步骤
若要详细了解 AKS 上的 GPU 工作负荷部署和管理,请参阅以下文章:
- 在 AKS 群集上创建启用了 GPU 的节点池。