本页面介绍如何对 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.5gb
和 3g.20gb
GPU 分区,则必须创建两个节点池:一个 GPU 分区大小设置为 1g.5gb
,另一个分区大小为 3g.20gb
。
当您创建需要不同分区大小的工作负载时,GKE Autopilot 集群会自动创建具有正确分区配置的节点。
每个节点标有节点上可用的 GPU 分区的大小。此类标签允许工作负载定位具有所需 GPU 分区大小的节点。例如,在具有 1g.5gb
GPU 实例的节点上,节点标记为:
cloud.google.com/gke-gpu-partition-size=1g.5gb
工作原理
如需使用多实例 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
以及 acceleratorType
和 acceleratorCount
。acceleratorType
必须是 nvidia-tesla-a100
、nvidia-a100-80gb
或 nvidia-h100-80gb
。
以下示例演示了如何创建具有一个节点的 GKE 集群,以及在节点上创建大小为 1g.5gb
的 7 个 GPU 分区。本页面中的其他步骤使用的 GPU 分区大小为 1g.5gb
,这将在每个 GPU 上创建 7 个分区。您还可以使用前面提到的任何受支持的 GPU 分区大小。
如需使用 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
,则这是默认选项。
配置
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 的容器。
下面是一个示例,它启动
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。
- 通过设置
验证七个 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
使用上一个命令中任何 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)
后续步骤
- 详细了解 GPU。
- 了解如何在 GPU 上配置分时功能。
- 详细了解集群多租户
- 了解企业级多租户最佳做法。