运行多实例 GPU


本页面介绍如何对 NVIDIA A100 或 H100 图形处理器 (GPU) 进行分区,以便在 Google Kubernetes Engine (GKE) 上的多个容器中共享单个 GPU。

本页面假定您熟悉 Kubernetes 概念,例如Pod节点部署命名空间,并熟悉 GKE 概念,例如节点池自动扩缩自动配置

简介

即使容器只需要部分 GPU 来处理其工作负载,Kubernetes 也会为每个容器分配一个完整的 GPU,这可能会导致资源浪费和成本超支,尤其是在使用最新一代功能强大的 GPU 的情况下。为了提高 GPU 利用率,多实例 GPU 可让您将单个受支持的 GPU 进行分区,最多可分为七个切片。每个切片可以独立分配给节点上的一个容器,每个 GPU 最多支持 7 个容器。多实例 GPU 在工作负载之间提供硬件隔离,并为 GPU 上运行的所有容器提供一致且可预测的 QoS。

对于 CUDA 应用,多实例 GPU 基本上透明。每个 GPU 分区都显示为常规 GPU 资源,并且编程模型保持不变。

如需详细了解多实例 GPU,请参阅 NVIDIA 多实例 GPU 用户指南

支持的 GPU

以下 GPU 类型支持多实例 GPU:

  • NVIDIA A100 (40GB)
  • NVIDIA A100 (80GB)
  • NVIDIA H100 (80GB)

多实例 GPU 分区

A100 GPU 和 H100 GPU 由 7 个计算单元和 8 个内存单元组成,可以划分为多个大小不同的 GPU 实例。GPU 分区大小使用以下语法:[compute]g.[memory]gb。例如,GPU 分区大小为 1g.5gb,是一个包含一个计算单元(GPU 的流式多处理器的 1/7),以及一个内存单元(5 GB)的 GPU 实例。您可以在部署 Autopilot 工作负载或创建 Standard 集群时指定 GPU 的分区大小。

NVIDIA 多实例 GPU 用户指南中的分区表列出了所有不同的 GPU 分区大小,以及每个 GPU 分区上可用的计算和内存资源数量。该表还显示了可以在 GPU 上创建的每个分区大小的 GPU 实例的数量。

下表列出了 GKE 支持的分区大小:

分区大小 GPU 实例
GPU:NVIDIA A100 (40GB) (nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU:NVIDIA A100 (80GB) nvidia-a100-80gb
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU:NVIDIA H100 (80GB) (nvidia-h100-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1

节点池中每个节点上的每个 GPU 的以相同的方式进行分区。例如,假设节点池包含两个节点、每个节点上有四个 GPU,分区大小为 1g.5gb。GKE 会在每个 GPU 上创建 7 个大小为 1g.5gb 的分区。由于每个节点有 4 个 GPU,因此每个节点上会有 28 个 1g.5gb GPU 分区。由于节点池中有两个节点,因此整个节点池中总共可以使用 56 个 1g.5gb GPU 分区。

如需创建具有多个类型的 GPU 分区的 GKE Standard 集群,您必须创建多个节点池。例如,如果您希望集群中的节点具有 1g.5gb3g.20gb GPU 分区,则必须创建两个节点池:一个 GPU 分区大小设置为 1g.5gb,另一个分区大小为 3g.20gb

当您创建需要不同分区大小的工作负载时,GKE Autopilot 集群会自动创建具有正确分区配置的节点。

每个节点标有节点上可用的 GPU 分区的大小。此类标签允许工作负载定位具有所需 GPU 分区大小的节点。例如,在具有 1g.5gb GPU 实例的节点上,节点标记为:

cloud.google.com/gke-gpu-partition-size=1g.5gb

工作原理

如需使用多实例 GPU,请执行以下任务:

  1. 创建一个启用了多实例 GPU 的集群
  2. 手动安装驱动程序
  3. 验证节点上 GPU 资源的数量
  4. 使用多实例 GPU 部署容器

价格

多实例 GPU 是 A100 GPU 和 H100 GPU 独有的,除用于运行工作负载的任何其他产品外,还要受相应的 GPU 价格的影响。您只能将整个 GPU 挂接到集群中的节点进行分区。如需了解 GPU 价格,请参阅 GPU 价格页面。

限制

  • 对于不受信任的工作负载,不推荐将多实例 GPU 分区与 GKE 搭配使用。
  • GKE 1.20.7-gke.400 或更高版本全面支持自动扩缩和自动预配 GPU 分区。在较低版本中,只有至少具有一个节点的节点池才能根据工作负载对特定 GPU 分区大小的需求自动扩缩。
  • GPU 利用率指标(例如 duty_cycle)不适用于 GPU 实例。
  • 多实例将物理 GPU 拆分为独立的实例,每个实例都在硬件级别与其他实例隔离开来。使用多实例 GPU 实例的容器只能访问该实例可用的 CPU 和内存资源。
  • 一个 Pod 最多只能使用一个多实例 GPU 实例。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 在 Autopilot 中,GKE 1.29.3-gke.1093000 及更高版本支持多实例 GPU。
  • 您必须有足够的 NVIDIA A100 GPU 配额。请参阅申请增加配额
  • 如果您要将多实例 GPU 与 Autopilot 搭配使用,可以参阅在 Autopilot 中部署 GPU 工作负载,详细了解如何将 GPU 与 Autopilot 搭配使用。
  • GKE 会将 Accelerator 计算类分配给 Autopilot 集群中的所有多实例 GPU 工作负载。

创建一个启用了多实例 GPU 的集群

如果您使用 GKE Standard,则必须在集群中启用多实例 GPU。默认情况下,运行 1.29.3-gke.1093000 及更高版本的 Autopilot 集群会启用多实例 GPU。如需在 Autopilot 中使用多实例 GPU,请参阅本文档中的使用多实例 GPU 部署容器部分。

创建使用多实例 GPU 的 Standard 集群时,您必须指定 gpuPartitionSize 以及 acceleratorTypeacceleratorCountacceleratorType 必须是 nvidia-tesla-a100nvidia-a100-80gbnvidia-h100-80gb

以下示例演示了如何创建具有一个节点的 GKE 集群,以及在节点上创建大小为 1g.5gb 的 7 个 GPU 分区。本页面中的其他步骤使用的 GPU 分区大小为 1g.5gb,这将在每个 GPU 上创建 7 个分区。您还可以使用前面提到的任何受支持的 GPU 分区大小。

  1. 如需使用 Google Cloud CLI 创建已启用多实例 GPU 的集群,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME  \
        --project=PROJECT_ID  \
        --zone ZONE  \
        --cluster-version=CLUSTER_VERSION  \
        --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
        --machine-type=a2-highgpu-1g  \
        --num-nodes=1
    

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • PROJECT_ID:您的 Google Cloud 项目的 ID。
    • ZONE:集群控制层面的计算可用区
    • CLUSTER_VERSION:版本必须为 1.19.7-gke.2503 或更高版本。
    • DRIVER_VERSION:要安装的 NVIDIA 驱动程序版本。可以是以下各项之一:
      • default:为您的 GKE 版本安装默认驱动程序版本。
      • latest:为您的 GKE 版本安装最新可用的驱动程序版本。仅适用于使用 Container-Optimized OS 的节点。
      • disabled:跳过自动驱动程序安装。创建集群后,您必须手动安装驱动程序。 如果您省略 gpu-driver-version,则这是默认选项。
  2. 配置 kubectl 以连接到新创建的集群:

    gcloud container clusters get-credentials CLUSTER_NAME
    

安装驱动程序

如果您在创建集群时选择了停用自动驱动程序安装,或者运行的 GKE 版本低于 1.27.2-gke.1200,则必须在创建完成后手动安装兼容的 NVIDIA 驱动程序。多实例 GPU 需要 450.80.02 或更高版本的 NVIDIA 驱动程序。

安装驱动程序后,系统将启用多实例 GPU 模式。如果自动安装了驱动程序,则节点会在 GPU 设备插件开始创建 GPU 分区时重新启动。如果手动安装了驱动程序,则节点会在驱动程序安装完成后重新启动。重启可能需要几分钟才能完成。

验证节点上 GPU 资源的数量

运行以下命令,验证 nvidia.com/gpu 资源的容量和可分配计数是否为 7:

kubectl describe nodes

下面是该命令的输出结果:

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

使用多实例 GPU 部署容器

您可以在节点上为每个多实例 GPU 设备最多部署一个容器。在本示例中,分区大小为 1g.5gb,该节点上有 7 个多实例 GPU 分区。因此,您最多可以在该节点上部署七个请求 GPU 的容器。

  1. 下面是一个示例,它启动 cuda:11.0.3-base-ubi7 容器并运行 nvidia-smi 来输出容器内 GPU 的 UUID。本示例中有 7 个容器,每个容器都会收到一个 GPU 分区。此示例还将 cloud.google.com/gke-gpu-partition-size 节点选择器设置为具有 1g.5gb GPU 分区的节点。

    Autopilot

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                  cloud.google.com/gke-accelerator: nvidia-tesla-a100
                  cloud.google.com/gke-accelerator-count: "1"
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    此清单执行以下操作:

    • 通过设置 cloud.google.com/gke-accelerator 节点选择器来请求 nvidia-tesla-a100 GPU 类型。
    • 将 GPU 拆分为 1g.5gb 分区大小。
    • 通过设置 cloud.google.com/gke-accelerator-count 节点选择器,将单个 GPU 挂接到节点。

    标准

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    此清单执行以下操作:

    • 请求分区大小为 1g.5gb 的单个 GPU。
  2. 验证七个 Pod 是否正都在运行:

    kubectl get pods
    

    下面是该命令的输出结果:

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. 使用上一个命令中任何 Pod 的名称,查看日志以查看 GPU UUID:

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    下面是该命令的输出结果:

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

后续步骤