在 Autopilot 中部署 GPU 工作负载


本页面介绍如何为 Google Kubernetes Engine (GKE) Autopilot 工作负载请求各种类型和数量的硬件加速器 (GPU),以及如何监控性能。

关于在 Pod 中选择加速器

Autopilot 使用专用加速器计算类来运行 GPU Pod。使用此计算类,GKE 会在 GPU 节点上放置 Pod,为 Pod 提供对虚拟机 (VM) 高级功能的访问权限。如需在 GPU 工作负载中使用此类,请根据 GKE 版本执行以下操作之一:

  • 1.29.4-gke.1427000 版及更高版本:在工作负载清单中请求 GPU。您还可以使用分时等 GPU 共享功能。GKE 不会修改工作负载清单来为加速器类添加节点选择器或注解。
  • 1.29 版(但不含该版本)到 1.29.4-gke.142700 版:在 Pod 清单中指定 cloud.google.com/compute-class: Accelerator 节点选择器并请求 GPU。如果指定此节点选择器,您还可以使用分时等 GPU 共享功能。
  • 1.28.9-gke.1069000 版(但不含该版本)到 1.29 版:在 Pod 清单中指定 cloud.google.com/compute-class: Accelerator 节点选择器以及 GPU 选择器。如果指定此节点选择器,您还可以使用分时等 GPU 共享功能。

1.28.9-gke.1069000 之前的版本不支持加速器计算类。这些版本中的 GPU Pod 的处理方式与其他 Autopilot Pod 类似,并且您需要为资源请求付费。如需了解详情,请参阅价格

与 GKE 功能的兼容性

下表显示了在 GKE Autopilot 中选择加速器的每种方法的兼容 GKE 功能:

已选择 Accelerator 计算类 与 GKE 功能的兼容性

价格

下表介绍了 GKE 使用的结算模式如何取决于集群的 GKE 版本。如需了解 GKE Autopilot 结算模式的说明,请参阅 Autopilot 价格

GKE 版本 价格
1.29.4-gke.1427000 及更高版本

基于节点的结算模式。所有 GPU Pod 都使用加速器计算类。您需要为运行 GPU 工作负载的 Compute Engine 硬件支付费用,还需要支付 Autopilot 附加费以实现节点管理和可伸缩性。如需了解详情,请参阅 Autopilot 模式价格

1.29 版(但不含该版本)到 1.29.4-gke.1427000 版

结算模式取决于您指定的节点选择器,如下所示:

  • cloud.google.com/compute-class: Accelerator:使用基于节点的结算模式和加速器计算类。
  • 无计算类选择器:使用基于 Pod 的结算模式
  • 只有在明确指定 cloud.google.com/compute-class: Accelerator 节点选择器的情况下,您才能使用多实例 GPU 或分时等功能。

    如需了解详情,请参阅 Kubernetes Engine 价格中的“具有特定硬件要求的 Pod”部分。

1.28.6-gke.1095000 版(但不含该版本)到 1.29 版

基于节点的结算模式,无论您是否在 Pod 清单中指定加速器计算类。

只有在明确指定 cloud.google.com/compute-class: Accelerator 节点选择器的情况下,您才能使用多实例 GPU 或分时等功能。

如需了解详情,请参阅 Kubernetes Engine 价格中的“具有特定硬件要求的 Pod”部分。

1.28.6-gke.1095000 之前的版本

基于 Pod 的结算模式。您需要根据 GPU Pod 资源请求付费。如需了解详情,请参阅 Kubernetes Engine 价格中的“具有特定硬件要求的 Pod”部分。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

限制

  • GKE 1.29.3-gke.1093000 及更高版本中的 Autopilot 提供分时 GPU多实例 GPU
  • GPU 可用性取决于 Autopilot 集群的 Google Cloud 区域和您的 GPU 配额。如需按区域或可用区查找 GPU 型号,请参阅 GPU 区域和可用区可用性
  • 对于 NVIDIA A100 (80GB) GPU,无论 Pod 是否使用该容量,您都需要为附加到节点的本地 SSD 支付固定价格。
  • 对于 1.29.2-gke.1355000 之前的 GKE 版本,如果您明确为 Pod 请求特定的现有 GPU 节点,则 Pod 必须使用该节点上的所有 GPU 资源。例如,如果现有节点具有 8 个 GPU 并且 Pod 的容器请求总共 4 个 GPU,则 Autopilot 会拒绝 Pod。
  • 对于 GKE 1.29.2-gke.1355000 或更高版本,如果您希望在单个节点中容纳多个 GPU pod,则针对这些 pod 的 GPU 请求总和必须小于或等于挂接到该节点的 GPU 资源数量。例如,gke-accelerator-count 为 4 的节点最多可以容纳四个 Pod,每个 Pod 请求一个 GPU。

在以下情况下,将多个 Pod 放置在单个 GPU 节点上非常有用:

  • 您为大型加速器机器类型预留了容量并运行单 GPU 工作负载,因此在每个节点部署一个 Pod 会浪费该机器上的其他 GPU
  • 您的 GPU 工作负载必须在同一主机上运行

在这些情况下,我们建议您确保节点上的 Pod GPU 资源请求总和等于挂接到节点的 GPU 数量,从而在该节点上使用所有 GPU。

在容器中请求 GPU

如需为容器请求 GPU 资源,请将以下字段添加到 Pod 规范中。 根据您的工作负载要求,您可以酌情省略 cloud.google.com/gke-accelerator-count 选择器。

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  nodeSelector:
    cloud.google.com/gke-accelerator: GPU_TYPE
    cloud.google.com/gke-accelerator-count: GPU_COUNT
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: GPU_QUANTITY

替换以下内容:

  • GPU_TYPE:GPU 硬件的类型。允许的值包括:
    • nvidia-h100-80gb:NVIDIA H100 (80GB)(仅适用于加速器计算类)
    • nvidia-a100-80gb:NVIDIA A100 (80GB)
    • nvidia-tesla-a100:NVIDIA A100 (40GB)
    • nvidia-l4:NVIDIA L4
    • nvidia-tesla-t4:NVIDIA T4
  • GPU_COUNT:可用于挂接到节点的 GPU 总数。必须大于或等于 GPU_QUANTITY 以及您选择的 GPU 类型支持的 GPU 数量。如果省略此 nodeSelector,Autopilot 会在每个 GPU 节点上放置一个 Pod。
  • GPU_QUANTITY:要分配给容器的 GPU 数量。必须小于或等于 GPU_COUNT 以及您选择的 GPU 类型支持的 GPU 数量

如需详细了解在 Autopilot 模式下使用加速器的计费方式,请参阅价格部分。

您必须在 Pod 规范中同时指定 GPU 类型和 GPU 数量。如果您省略其中任一值,Autopilot 将拒绝您的 Pod。

部署此清单时,Autopilot 会自动为节点 GKE 版本安装默认 NVIDIA 驱动程序。在 1.29.2-gke.1108000 及更高版本中,您可以选择向清单中添加以下节点选择器,以选择为该 GKE 版本安装最新的驱动程序版本:

spec:
  nodeSelector:
    cloud.google.com/gke-gpu-driver-version: "DRIVER_VERSION"

DRIVER_VERSION 替换为以下某个值:

  • default - 适用于节点 GKE 版本的默认稳定驱动程序。如果您在清单中省略 nodeSelector,则这是默认选项。
  • latest - 适用于节点 GKE 版本的最新可用驱动程序版本。

Autopilot GPU Pod 的 CPU 和内存请求

定义 GPU Pod 时,您还应请求 CPU 和内存资源,以便使容器按预期运行。Autopilot 根据 GPU 类型和数量强制执行特定的 CPU 和内存最小值、最大值和默认值。如果在单个节点上运行多个 GPU Pod,请指定 CPU 和内存,否则默认将使用该节点的全部容量。如需了解详情,请参阅 Autopilot 中的资源请求

您的 Pod 规范应类似于以下示例,该示例请求四个 T4 GPU:

apiVersion: v1
kind: Pod
metadata:
  name: t4-pod
spec:
  nodeSelector:
    cloud.google.com/gke-accelerator: "nvidia-tesla-t4"
  containers:
  - name: t4-container-1
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: 3
        cpu: "54"
        memory: "54Gi"
      requests:
        cpu: "54"
        memory: "54Gi"
  - name: t4-container-2
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: 1
        cpu: "18"
        memory: "18Gi"
      requests:
        cpu: "18"
        memory: "18Gi"

此清单为 CPU 和内存资源指定 limits。如果您在 GKE 1.29.2-gke.1060000 及更高版本中省略 CPU 或内存的 limits,GKE 会为 Pod 提供 Burstable QoS 类,并让您的 Pod 从节点上的资源请求总和中使用未用的资源。如需了解详情,请参阅在 GKE 中配置 Pod 爆发

Autopilot GPU Pod 的临时存储请求

您还可以在需要短期存储的 Pod 中请求临时存储。最大可用临时存储空间和使用的存储硬件类型取决于 Pod 请求的 GPU 类型和数量。 如果您使用 NVIDIA L4 GPU、加速器计算类,并运行 GKE 补丁 1.28.6-gke.1369000 及更高版本或 1.29.1-gke.1575000 及更高版本,则可以将本地 SSD 用于临时存储。

如需将本地 SSD 用于临时存储,请将 cloud.google.com/gke-ephemeral-storage-local-ssd: "true" nodeSelector 添加到您的工作负载清单。请参阅将本地 SSD 支持的临时存储空间与 Autopilot 集群搭配使用中的示例清单。NVIDIA H100 (80GB) GPU 和 NVIDIA A100 (80GB) GPU 始终使用本地 SSD 进行临时存储,您无法为这些 GPU 指定此节点选择器。

验证 GPU 分配

如需检查已部署的 GPU 工作负载是否具有所请求的 GPU,请运行以下命令:

kubectl describe node NODE_NAME

NODE_NAME 替换为在其上安排了 Pod 的节点的名称。

输出类似于以下内容:


apiVersion: v1
kind: Node
metadata:
...
  labels:
    ...
    cloud.google.com/gke-accelerator: nvidia-tesla-t4
    cloud.google.com/gke-accelerator-count: "1"
    cloud.google.com/machine-family: custom-48
    ...
...

检查 GPU 驱动程序版本

在 Autopilot 集群中,GKE 会自动在所有 GPU 节点上安装 NVIDIA 设备驱动程序。如需查找 GKE 在集群中安装的驱动程序版本,请运行以下命令:

kubectl logs --selector=k8s-app=nvidia-gpu-device-plugin \
    --container="nvidia-gpu-device-plugin" \
    --tail=-1 \
    --namespace=kube-system | grep Driver

输出类似于以下内容:

I1206 18:37:08.251742    5851 metrics.go:144] nvml initialized successfully. Driver version: 535.104.12

GPU 分配在 Autopilot 中的工作原理

在您为 Pod 中的容器请求 GPU 类型和数量并部署 Pod 后,会发生以下情况:

  1. 如果不存在可分配的 GPU 节点,Autopilot 会预配新的 GPU 节点以调度 Pod。Autopilot 会自动安装 NVIDIA 的驱动程序以使用硬件。
  2. Autopilot 会向 GPU 节点添加节点污点,并为 Pod 添加相应的容忍。这可以防止 GKE 在 GPU 节点上安排其他 Pod。

Autopilot 在每个 GPU 节点上放置一个 GPU Pod,以及在所有节点上运行的任何 GKE 管理的工作负载,以及您配置以容忍所有节点污点的任何 DaemonSet。

在每个节点上运行 DaemonSet

建议您在每个节点(即使是应用了污点的节点)上运行 DaemonSet。例如,某些日志记录和监控代理必须在集群中的每个节点上运行。您可以将这些 DaemonSet 配置为忽略节点污点,以便 GKE 将这些工作负载放置在每个节点上。

如需在集群中的每个节点(包括 GPU 节点)上运行 DaemonSet,请将以下容忍添加到规范中:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logging-agent
spec:
  tolerations:
  - key: ""
    operator: "Exists"
    effect: ""
  containers:
  - name: logging-agent-v1
    image: IMAGE_PATH

如需在集群中的特定 GPU 节点上运行 DaemonSet,请将以下内容添加到规范中:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logging-agent
spec:
  nodeSelector:
    cloud.google.com/gke-accelerator: "GPU_TYPE"
  tolerations:
  - key: ""
    operator: "Exists"
    effect: ""
  containers:
  - name: logging-agent-v1
    image: IMAGE_PATH

GPU_TYPE 替换为目标节点中的 GPU 类型。可以是下列选项之一:

  • nvidia-h100-80gb:NVIDIA H100 (80GB)(仅适用于加速器计算类)
  • nvidia-a100-80gb:NVIDIA A100 (80GB)
  • nvidia-tesla-a100:NVIDIA A100 (40GB)
  • nvidia-l4:NVIDIA L4
  • nvidia-tesla-t4:NVIDIA T4

Autopilot 中的 GPU 用例

您可以将 GPU 分配给 Autopilot Pod 中的容器,以便处理如下工作负载:

  • 机器学习 (ML) 推理
  • 机器学习训练
  • 渲染

支持的 GPU 数量

在 Pod 规范中请求 GPU 时,您必须根据 GPU 类型使用以下数量:

GPU 数量
NVIDIA L4
nvidia-l4
1、2、4、8
NVIDIA T4
nvidia-tesla-t4
1、2、4
NVIDIA A100 (40GB)
nvidia-tesla-a100
1、2、4、8、16
NVIDIA A100 (80GB)
nvidia-a100-80gb
1、2、4、8
NVIDIA H100 (80GB)
nvidia-h100-80gb
8

如果您请求该类型不支持的 GPU 数量,Autopilot 将拒绝您的 Pod。

监控 GPU 节点工作负载性能

如果您的 GKE 集群启用了系统指标,则 Cloud Monitoring 中提供以下指标来监控 GPU 工作负载的性能:

  • 工作周期 (container/accelerator/duty_cycle):加速器活跃处理的时间占过去的采样周期(10 秒)的百分比。介于 1 到 100 之间。
  • 内存用量 (container/accelerator/memory_used):已分配的加速器内存量(以字节为单位)。
  • 内存容量 (container/accelerator/memory_total):加速器内存总量(以字节为单位)。

您可以使用预定义的信息中心来监控具有 GPU 节点的集群。如需了解详情,请参阅查看可观测性指标。如需了解有关监控集群及其资源的一般信息,请参阅 GKE 可观测性

查看工作负载的用量指标

您可以在 Google Cloud 控制台的工作负载信息中心内查看工作负载 GPU 用量指标。

如需查看工作负载 GPU 用量,请执行以下步骤:

  1. 进入 Google Cloud 控制台中的工作负载页面。

    进入“工作负载”
  2. 选择工作负载。

“工作负载”信息中心会显示 GPU 内存用量和容量以及 GPU 工作周期的图表。

查看 NVIDIA 数据中心 GPU 管理器 (DCGM) 指标

您可以使用 Google Cloud Managed Service for Prometheus 收集并直观呈现 NVIDIA DCGM 指标。对于 Autopilot 集群,GKE 会安装这些驱动程序。 对于 Standard 集群,您必须安装 NVIDIA 驱动程序。

如需了解如何部署 GKE 管理的 DCGM 软件包,请参阅收集和查看 NVIDIA Data Center GPU Manager (DCGM) 指标

后续步骤