本页面介绍了如何在 Google Kubernetes Engine (GKE) Standard 集群的节点中使用 NVIDIA® 图形处理器 (GPU) 硬件加速器。如需详细了解 GKE 中的 GPU,请参阅 GKE 中的 GPU 简介。
您还可以直接在 Autopilot Pod 中使用 GPU。如需查看相关说明,请参阅在 Autopilot 中部署 GPU 工作负载。
概览
利用 GKE,您可以创建配备了 NVIDIA Tesla® K80、P100、P4、V100、T4、L4 和 A100 GPU 的节点池。GPU 提供的计算能力可用于完成深度学习任务,如图片识别、自然语言处理,以及视频转码和图片处理等其他计算密集型任务。
如果您的工作负载可以容忍频繁的节点中断,您也可以将 GPU 用于 Spot 虚拟机。使用 Spot 虚拟机可降低运行 GPU 的费用。如需了解详情,请参阅将 Spot 虚拟机与 GPU 节点池搭配使用。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
使用要求
GKE 上的 GPU 具有以下要求:
- Kubernetes 版本:对于使用 Container-Optimized OS 节点映像的节点池,GPU 节点适用于 GKE 版本 1.9 或更高版本。对于使用 Ubuntu 节点映像的节点池,GPU 节点适用于 GKE 版本 1.11.3 或更高版本。
GPU 配额:您必须在所需地区拥有 Compute Engine GPU 配额才能创建 GPU 节点。如需确保项目中有充足的 GPU 配额,请参阅 Google Cloud 控制台中的配额。
如果您需要额外的 GPU 配额,则必须在 Google Cloud 控制台中申请 GPU 配额。如果您已有结算账号,则在您提交申请后,您的项目应该会自动获得配额。
NVIDIA GPU 驱动程序:创建集群或节点池时,您可以指示 GKE 根据您的 GKE 版本自动安装驱动程序版本。如果您不指示 GKE 自动安装 GPU 驱动程序,则必须手动安装驱动程序。
A100 GPU:只有 a2 机器类型支持 A100 GPU,并且需要 GKE 1.18.6-gke.3504 版或更高版本。 您必须确保底层 A2 机器类型有足够的配额来使用 A100 GPU。
L4 GPU:
- 您必须使用 GKE 1.22.17-gke.5400 或更高版本。
- 您选择的 GKE 版本必须在 Container-Optimized OS 中包含 NVIDIA 驱动程序版本 525 或更高版本。如果驱动程序版本 525 或更高版本不是 GKE 版本中的默认版本或最新版本,则必须在节点上手动安装受支持的驱动程序。
限制
在使用 GKE 上的 GPU 之前,请注意以下限制:
- 您无法将 GPU 添加到现有节点池。
- 在维护事件期间,GPU 节点无法进行实时迁移。
可以使用的 GPU 类型取决于机器系列,如下所示:
您应该确保您的项目中有足够的配额用于与您选择的 GPU 类型和数量对应的机器系列。
Windows Server 节点池不支持 GPU。
在 GKE 1.22 到 1.25 版本中,集群自动扩缩器仅支持对 L4 GPU 的节点进行基本纵向扩容和缩容。此限制不适用于 GKE 1.26 及更高版本。
是否空闲
GPU 仅在特定区域和可用区可用。当您申请 GPU 配额时,请考虑要在哪些区域运行集群。
如需查看适用区域和可用区的完整列表,请参阅 Compute Engine 上的 GPU。
您还可以使用 Google Cloud CLI 查看您的可用区中可用的 GPU。如需查看每个可用区支持的所有 GPU 加速器类型的列表,请运行以下命令:
gcloud compute accelerator-types list
价格
如需了解 GPU 价格信息,请参阅 Google Cloud GPU 页面上的价格表。
GPU 配额
您的 GPU 配额是可在 Google Cloud 项目中运行的 GPU 的总数。要创建使用 GPU 的集群,您的项目必须拥有足够的 GPU 配额。
您的 GPU 配额至少应该等于您打算在集群中运行的 GPU 的总数。如果您启用集群自动扩缩功能,则申请的 GPU 配额至少应该等于集群的最大节点数乘以每个节点的 GPU 数所得的值。
例如,如果您创建一个包含三个节点的集群,每个节点运行两个 GPU,则您的项目至少需要六个 GPU 配额。
申请 GPU 配额
如需申请 GPU 配额,请使用 Google Cloud 控制台。如需详细了解如何申请配额,请参阅 Compute Engine 文档中的 GPU 配额。
如需搜索 GPU 配额并提交配额申请,请使用 Google Cloud 控制台:
转到 Google Cloud 控制台中的 IAM 和管理配额页面。
在过滤条件框中,执行以下操作:
- 选择配额属性,输入 GPU 模型的名称,然后按 Enter 键。
- (可选)如需应用更高级的过滤条件来缩小结果范围,请选择维度(如位置)属性,添加您正在使用的区域或可用区的名称,然后按 Enter 键。
从 GPU 配额列表中,选择要更改的配额。
点击修改配额。系统会打开申请表单。
填写每个配额申请的新配额上限字段。
在申请说明字段中,填写有关您的申请的详细信息。
点击下一步。
在替换确认对话框中,点击确认。
在详细联系信息屏幕中,输入您的姓名和电话号码,供审批人用来完成配额更改请求。
点击提交请求。
您会收到确认电子邮件以跟踪配额更改。
运行 GPU
如需在 GKE Standard 集群中运行 GPU,请创建挂接了 GPU 的节点池。当您将 GPU 节点池添加到已运行非 GPU 节点池的现有集群时,GKE 会自动为 GPU 节点添加以下节点污点:
- 键:
nvidia.com/gpu
- 效果:
NoSchedule
此外,GKE 通过运行 ExtendedResourceToleration 准入控制器自动将相应的容忍设置应用于请求 GPU 的 Pod。
此操作会导致在 GPU 节点上仅调度请求 GPU 的 Pod,这样可实现更高效的自动扩缩:如果没有足够的 Pod 请求 GPU,则 GPU 节点可以快速缩减。
为了在 GKE 上提高 GPU 的成本效益、可靠性和可用性,我们建议执行以下操作:
- 创建单独的 GPU 节点池。对于每个节点池,将节点位置限制为可使用 GPU 的可用区。
- 在每个节点池中启用自动扩缩。
- 使用区域级集群跨区域中的可用区复制 Kubernetes 控制平面,从而提高可用性。
- 指示 GKE 自动在节点池上安装默认或最新 GPU 驱动程序,这样您就无需手动安装和管理驱动程序版本。
创建 GPU 节点池
如需在现有集群中创建单独的 GPU 节点池,您可以使用 Google Cloud 控制台或 Google Cloud CLI。您还可以使用 Terraform 预配 GKE 集群和 GPU 节点池。
如果您使用的是 gcloud CLI 或 Terraform,可以指示 GKE 自动安装与 Container-Optimized OS 版本对应的默认或最新 NVIDIA 驱动程序版本。如果使用 Google Cloud 控制台,则必须在创建节点池后手动安装驱动程序。
gcloud
要在集群中创建具有 GPU 的节点池,请运行以下命令:
gcloud container node-pools create POOL_NAME \
--accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
[--machine-type MACHINE_TYPE] \
--region COMPUTE_REGION --cluster CLUSTER_NAME \
--node-locations COMPUTE_ZONE1[,COMPUTE_ZONE2] \
[--num-nodes NUM_NODES] \
[--enable-autoscaling \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES]
请替换以下内容:
POOL_NAME
:您为节点池选择的名称。GPU_TYPE
:GPU 类型。可以是下列选项之一:nvidia-tesla-k80
nvidia-tesla-p100
nvidia-tesla-p4
nvidia-tesla-v100
nvidia-tesla-t4
nvidia-tesla-a100
nvidia-a100-80gb
nvidia-l4
DRIVER_VERSION
:要安装的 NVIDIA 驱动程序版本。可以是下列选项之一:default
:为您的 GKE 版本安装默认驱动程序版本。latest
:为您的 GKE 版本安装最新可用的驱动程序版本。仅适用于使用 Container-Optimized OS 的节点。disabled
:跳过自动驱动程序安装。创建节点池后,您必须手动安装驱动程序。 如果您省略gpu-driver-version
,则这是默认选项。
AMOUNT
:要挂接到节点池中节点的 GPU 数量。MACHINE_TYPE
:节点的 Compute Engine 机器类型。在GPU_TYPE
为nvidia-tesla-a100
或nvidia-a100-80gb
(只能使用 A2 机器类型)或者GPU_TYPE
为nvidia-l4
(只能使用 G2 机器类型)时必需。对于所有其他 GPU,此标志是可选的。COMPUTE_REGION
:集群的 Compute Engine 区域,例如us-central1
。选择一个区域,该区域至少有一个提供请求的 GPU 的可用区。CLUSTER_NAME
:要在其中创建节点池的集群的名称。COMPUTE_ZONE1,COMPUTE_ZONE2,[...]
:GKE 在其中创建 GPU 节点的特定可用区。可用区必须与集群位于同一区域,由--region
标志指定。您定义的 GPU 类型必须在每个所选可用区中可用。我们建议您在创建节点池时始终使用--node-locations
标志,以指定包含所请求 GPU 的一个或多个可用区。NUM_NODES
:要创建的初始节点数。MIN_NODES
:任何时候节点池中每个可用区的节点数下限。仅当使用--enable-autoscaling
标志时,此值才相关。MAX_NODES
:任何时候节点池中每个可用区的节点数上限。仅当使用--enable-autoscaling
标志时,此值才相关。
例如,以下命令会在区域级集群 p100-cluster
中创建一个高可用性自动扩缩节点池 p100
,每个节点有两个 P100 GPU。GKE 会自动在这些节点上安装默认驱动程序。
gcloud container node-pools create p100 \
--accelerator type=nvidia-tesla-p100,count=2,gpu-driver-version=default \
--region us-central1 --cluster p100-cluster \
--node-locations us-central1-c \
--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling
控制台
如需创建具有 GPU 的节点池,请运行以下命令:
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
点击 add_box 添加节点池。
(可选)在节点池详情页面上,选中启用自动扩缩复选框。
根据需要配置您的节点池。
在导航窗格中,选择节点。
在机器配置下,点击 GPU。
选择要在每个节点上运行的 GPU 类型和 GPU 数量。
阅读警告,然后选择我了解这些限制。
点击创建。
创建节点池后,您必须手动安装 GPU 驱动程序。在本文档中,请参阅手动安装 NVIDIA GPU 驱动程序。
Terraform
您可以通过 Terraform 模块创建一个使用具有 GPU 的 Terraform 的区域级集群。
通过在
variables.tf
文件中添加以下块来设置 Terraform 变量:variable "project_id" { default = PROJECT_ID description = "the gcp_name_short project where GKE creates the cluster" } variable "region" { default = CLUSTER_REGION description = "the gcp_name_short region where GKE creates the cluster" } variable "zone" { default = "COMPUTE_ZONE1,COMPUTE_ZONE2" description = "the GPU nodes zone" } variable "cluster_name" { default = "CLUSTER_NAME" description = "the name of the cluster" } variable "gpu_type" { default = "GPU_TYPE" description = "the GPU accelerator type" } variable "gpu_driver_version" { default = "DRIVER_VERSION" description = "the NVIDIA driver version to install" }
请替换以下内容:
PROJECT_ID
:您的项目 ID。CLUSTER_NAME
:GKE 集群的名称。CLUSTER_REGION
:集群的计算区域。COMPUTE_ZONE1,COMPUTE_ZONE2,[...]
:GKE 在其中创建 GPU 节点的特定可用区。可用区必须在region
变量指定的区域内。这些可用区必须具有您定义的 GPU 类型。如需了解哪些可用区具有 GPU,请参阅可用性。在创建 GPU 节点池时,应使用node_locations
变量来指定包含所请求 GPU 的一个或多个可用区。GPU_TYPE
:GPU 类型。可以是下列选项之一:nvidia-tesla-k80
nvidia-tesla-p100
nvidia-tesla-p4
nvidia-tesla-v100
nvidia-tesla-t4
nvidia-tesla-a100
nvidia-a100-80gb
nvidia-l4
DRIVER_VERSION
:GKE 自动安装的 GPU 驱动程序版本。此字段是可选字段。 支持以下值:INSTALLATION_DISABLED
:停用 GPU 驱动程序自动安装。 您必须手动安装驱动程序才能运行 GPU。DEFAULT
:自动安装与节点操作系统版本对应的默认驱动程序版本。LATEST
:自动安装节点操作系统版本可用的最新驱动程序版本。
如果省略此字段,GKE 不会自动安装驱动程序。使用节点自动预配功能的节点池不支持此字段。如需手动安装驱动程序,请参阅本文档中的手动安装 NVIDIA GPU 驱动程序。
将以下块添加到 Terraform 配置中:
provider "google" { project = var.project_id region = var.region } resource "google_container_cluster" "ml_cluster" { name = var.cluster_name location = var.region node_locations = [var.zone] } resource "google_container_node_pool" "gpu_pool" { name = google_container_cluster.ml_cluster.name location = var.region cluster = google_container_cluster.ml_cluster.name node_count = 3 autoscaling { total_min_node_count = "1" total_max_node_count = "5" } management { auto_repair = "true" auto_upgrade = "true" } node_config { oauth_scopes = [ "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring", "https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/trace.append", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/servicecontrol", ] labels = { env = var.project_id } guest_accelerator { type = var.gpu_type count = 1 gpu_driver_installation_config { gpu_driver_version = var.gpu_driver_version } } image_type = "cos_containerd" machine_type = "n1-standard-1" tags = ["gke-node", "${var.project_id}-gke"] disk_size_gb = "30" disk_type = "pd-standard" metadata = { disable-legacy-endpoints = "true" } } }
Terraform 会调用 Google Cloud API,以设置一个包含使用 GPU 的节点池的新集群。节点池最初有三个节点,并且启用了自动扩缩功能。如需详细了解 Terraform,请参阅 google_container_node_pool
资源规范。
您还可以使用 GPU 创建新集群,并使用 --node-locations
标志指定可用区。不过,我们建议您在现有集群中创建单独的 GPU 节点池,如本部分所示。
手动安装 NVIDIA GPU 驱动程序
如果您在创建 GPU 节点池时选择了停用自动设备驱动程序安装,或者如果使用的 GKE 版本低于自动安装支持的最低版本,则必须手动在节点上安装兼容的 NVIDIA GPU 驱动程序。Google 提供了一个 DaemonSet,可应用于安装驱动程序。在使用 Container-Optimized OS 的 GPU 节点上,您还可以选择默认 GPU 驱动程序版本或更新版本。
我们建议您尽可能使用自动驱动程序安装,方法是在创建标准集群时在 --accelerator
标志中指定 gpu-driver-version
选项。如果您已在 2023 年 1 月 25 日或之前使用安装 DaemonSet 来手动安装 GPU 驱动程序,您可能获取重新应用 DaemonSet 以获得忽略使用自动驱动程序安装的节点的版本。
以下说明介绍了如何使用 Terraform 在 Container-Optimized OS (COS) 和 Ubuntu 节点上安装驱动程序。
COS
要部署 DaemonSet 的安装并安装默认的 GPU 驱动程序版本,请运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
或者,如需安装较新的 GPU 驱动程序版本(请参阅下表),请运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded-latest.yaml
安装需要几秒钟才能完成。安装完成后,NVIDIA GPU 设备插件通过 Kubernetes API 显示 NVIDIA GPU 容量。
每个版本的 Container-Optimized OS 映像都至少有一个受支持的 NVIDIA GPU 驱动程序版本。如需了解默认支持的版本,请参阅主要 Container-Optimized OS LTS 里程碑的版本说明。
下表列出了每个 GKE 版本中可用的驱动程序版本:
GKE 版本 | NVIDIA 驱动程序 |
---|---|
1.26 | R470(默认)、R510 或 R525 |
1.25 | R470(默认)、R510 或 R525 |
1.24 | R470(默认)、R510 或 R525 |
1.23 | R450(默认)、R470、R510 或 R525 |
1.22 | R450(默认)、R470、R510 或 R525 |
1.21 | R450(默认)、R470 或 R510 |
1.20 | R450(默认)、R470 |
Ubuntu
如需为 NVIDIA L4 GPU 之外的所有 GPU 部署安装 DaemonSet,请运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml
安装需要几秒钟才能完成。安装完成后,NVIDIA GPU 设备插件通过 Kubernetes API 显示 NVIDIA GPU 容量。
对于 NVIDIA L4 GPU,请使用以下命令安装 R525
驱动程序:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R525.yaml
下表列出了每个 GKE 版本中可用的驱动程序版本:
GKE 版本 | NVIDIA 驱动程序 |
---|---|
1.27 | R470 |
1.26 | R470 |
1.25 | R470 |
1.24 | R470 |
1.23 | R470 |
1.22 | R450 |
1.21 | R450 |
1.20 | R450 |
Terraform
您可以使用 Terraform 根据节点类型安装默认的 GPU 驱动程序版本。在这两种情况下,您都必须配置 kubectl_manifest
Terraform 资源类型。
如需安装 DaemonSet on COS,请在 Terraform 配置中添加以下块:
data "http" "nvidia_driver_installer_manifest" { url = "https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml" } resource "kubectl_manifest" "nvidia_driver_installer" { yaml_body = data.http.nvidia_driver_installer_manifest.body }
如需安装 DaemonSet on Ubuntu,请在 Terraform 配置中添加以下块:
data "http" "nvidia_driver_installer_manifest" { url = "https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml" } resource "kubectl_manifest" "nvidia_driver_installer" { yaml_body = data.http.nvidia_driver_installer_manifest.body }
将节点自动预配与 GPU 搭配使用
将节点自动预配与 GPU 搭配使用时,默认情况下,自动预配的节点池没有足够的范围来安装驱动程序。如需授予所需的范围,请修改节点自动预配的默认范围,以添加 logging.write
、monitoring
、devstorage.read_only
和 compute
,如以下示例所示。
gcloud container clusters update CLUSTER_NAME --enable-autoprovisioning \
--min-cpu=1 --max-cpu=10 --min-memory=1 --max-memory=32 \
--autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/compute
如需详细了解自动预配,请参阅使用节点自动预配。
配置 Pod 使用 GPU
您可以使用资源限制来配置 Pod,以使用 GPU。您可以使用以下键值对在 Pod 规范中指定资源限制
- 键:
nvidia.com/gpu
- 值:要使用的 GPU 数量
以下示例显示了使用 GPU 的 Pod 规范:
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
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: 2
使用多种 GPU 类型
如果每个集群要使用多种 GPU 加速器类型,那么您必须创建多个节点池,每个节点池都具有各自的加速器类型。 GKE 将特有的节点选择器附加到 GPU 节点,以帮助您将 GPU 工作负载置于具有特定 GPU 类型的节点上:
- 键:
cloud.google.com/gke-accelerator
- 值:
nvidia-tesla-k80
、nvidia-tesla-p100
、nvidia-tesla-p4
、nvidia-tesla-v100
、nvidia-tesla-t4
、nvidia-tesla-a100
、nvidia-a100-80gb
或nvidia-l4
。
您可以将此节点选择器添加到工作负载的 Pod 规范中,以定位特定的 GPU 类型。例如:
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
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: 2
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-tesla-k80
关于 NVIDIA CUDA-X 库
CUDA 是 NVIDIA 的并行计算平台和 GPU 的编程模型。如需使用 CUDA 应用,您使用的映像必须具有库。如需添加 NVIDIA CUDA-X 库,请使用以下任一方法:
- 建议:使用预装了 NVIDIA CUDA-X 库的映像。例如,您可以使用 Deep Learning Containers。 这些容器预安装了关键数据科学框架、NVIDIA CUDA-X 库和工具。或者,NVIDIA CUDA 映像仅包含 NVIDIA CUDA-X 库。
- 构建并使用您自己的映像。在这种情况下,请在容器规范的
LD_LIBRARY_PATH
环境变量中添加以下值:/usr/local/cuda-CUDA_VERSION/lib64
:NVIDIA CUDA-X 库在节点上的位置。将CUDA_VERSION
替换为您使用的 CUDA-X 映像版本。某些版本还在/usr/local/nvidia/bin
中包含调试实用程序。如需了解详情,请参阅 DockerHub 上的 NVIDIA CUDA 映像。/usr/local/nvidia/lib64
:NVIDIA 设备驱动程序的位置。
如需查看您的 CUDA 版本所需的最低 GPU 驱动程序版本,请参阅 CUDA 工具包和兼容驱动程序版本。确保节点上运行的 GKE 补丁程序版本包含与您选择的 CUDA 版本兼容的 GPU 驱动程序版本。如需查看与 GKE 版本关联的 GPU 驱动程序版本列表,请参阅 GKE 当前版本表中链接的相应 Container-Optimized OS 页面。
监控 GPU 节点
如果您的 GKE 集群启用了系统指标,则 Cloud Monitoring 中提供以下指标来监控 GPU 工作负载的性能:
- 工作周期 (
container/accelerator/duty_cycle
):加速器活跃处理的时间占过去的采样周期(10 秒)的百分比。介于 1 到 100 之间。 - 内存用量 (
container/accelerator/memory_used
):已分配的加速器内存量(以字节为单位)。 - 内存容量 (
container/accelerator/memory_total
):加速器内存总量(以字节为单位)。
如需详细了解如何监控集群及其资源,请参阅 Monitoring。
查看用量指标
您可以在 Google Cloud 控制台的工作负载信息中心内查看工作负载 GPU 用量指标。
如需查看工作负载 GPU 用量,请执行以下步骤:
进入 Google Cloud 控制台中的工作负载页面。
进入“工作负载”- 选择工作负载。
“工作负载”信息中心会显示 GPU 内存用量和容量以及 GPU 工作周期的图表。