在 Autopilot 中部署 GPU 工作负载


本页面介绍如何在 Google Kubernetes Engine (GKE) Autopilot 工作负载中请求硬件加速器 (GPU)。

Autopilot 提供专用 Accelerator 计算类来运行 GPU Pod。使用此计算类,GKE 会在每个 GPU 节点上放置一个 Pod,为 Pod 提供使用虚拟机 (VM) 高级功能的权限。您还可以酌情在不选择 Accelerator 计算类的情况下运行 GPU Pod。如需详细了解 Accelerator 计算类的优势,请参阅何时使用特定计算类

价格

根据您请求 Accelerator 计算类来运行 GPU 工作负载,Autopilot 的计费方式有所不同。

使用 Accelerator 计算类? 价格 与 GKE 功能的兼容性
您需要支付运行 GPU 工作负载的 Compute Engine 硬件的费用,还需要支付自动节点管理和可伸缩性的 Autopilot 高级层级。如需了解详情,请参阅 Autopilot 模式价格

兼容以下各项:

您需要根据 GPU Pod 资源请求付费。如需了解详情,请参阅 Kubernetes Engine 价格中的“GPU 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 区域和可用区可用性
  • 如果您明确为 Pod 请求特定的现有 GPU 节点,则 Pod 必须使用该节点上的所有 GPU 资源。例如,如果现有节点具有 8 个 GPU 并且 Pod 的容器请求总共 4 个 GPU,则 Autopilot 会拒绝 Pod。
  • 对于 NVIDIA A100 (80GB) GPU,无论 Pod 是否使用该容量,您都需要为附加到节点的本地 SSD 支付固定价格。

在容器中请求 GPU

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

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  nodeSelector:
    cloud.google.com/compute-class: "Accelerator"
    cloud.google.com/gke-accelerator: GPU_TYPE
  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_QUANTITY:要分配给容器的 GPU 数量。必须是所选 GPU 类型的受支持的 GPU 数量

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

Autopilot GPU Pod 的 CPU 和内存请求

定义 GPU Pod 时,您还应请求 CPU 和内存资源,以便使容器按预期运行。Autopilot 根据 GPU 类型和数量强制执行特定的 CPU 和内存最小值、最大值和默认值。如需了解详情,请参阅 Autopilot 中的资源请求

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

apiVersion: v1
kind: Pod
metadata:
  name: t4-pod
spec:
  nodeSelector:
    cloud.google.com/compute-class: "Accelerator"
    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"

Autopilot GPU Pod 的临时存储请求

您还可以在需要短期存储的 Pod 中请求临时存储。最大可用临时存储空间和使用的存储硬件类型取决于 Pod 请求的 GPU 类型和数量。 如果您使用 NVIDIA L4 GPU、Accelerator 计算类,并运行 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 中的工作原理

在您为 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 工作周期的图表。

后续步骤