GPU

本页面介绍如何在 Google Kubernetes Engine (GKE) 集群的节点中使用 NVIDIA® 图形处理器 (GPU) 硬件加速器。

概览

利用 GKE,您可以创建配备了 NVIDIA Tesla® K80P100P4V100T4 GPU 的节点池。GPU 提供的计算能力可用于完成深度学习任务,如图片识别、自然语言处理,以及视频转码和图片处理等其他计算密集型任务。

如果您的工作负载可以容忍频繁的节点中断,您也可以将 GPU 用于抢占式虚拟机。使用抢占式虚拟机可降低运行 GPU 的费用。如需了解详情,请参阅抢占式实例上的 GPU

要求

GKE 上的 GPU 具有以下要求:

  • Kubernetes 版本:对于使用 Container-Optimized OS 节点映像的节点池,GPU 节点适用于 GKE 版本 1.9 或更高版本。对于使用 Ubuntu 节点映像的节点池,GPU 节点适用于 GKE 版本 1.11.3 或更高版本。
  • GPU 配额:您必须在所需地区拥有 Compute Engine GPU 配额才能创建 GPU 节点。如需确保项目中有充足的 GPU 配额,请参阅 Google Cloud Console 中的配额

    如果您需要额外的 GPU 配额,则必须在 Cloud Console 中申请 GPU 配额。如果您已有结算帐号,则在您提交申请后,您的项目应该会自动获得配额。

  • NVIDIA GPU 驱动程序:您必须将 NVIDIA GPU 驱动程序手动安装到节点上。在本页面的后面部分,我们将介绍如何安装驱动程序

限制

在使用 GKE 上的 GPU 之前,请注意以下限制:

  • 您无法将 GPU 添加到现有节点池。
  • 在维护事件期间,GPU 节点无法进行实时迁移
  • GPU 仅受通用 N1 机器类型支持。

可用情况

GPU 仅在特定区域和地区可用。当您申请 GPU 配额时,请考虑要在哪些区域运行集群。

如需查看适用区域和地区的完整列表,请参阅 Compute Engine 上的 GPU

您还可以使用 gcloud 命令行工具查看您的地区中可用的 GPU。如需查看每个地区支持的所有 GPU 加速器类型的列表,请运行以下命令:

gcloud compute accelerator-types list

价格

如需了解 GPU 价格,请参阅 GCP GPU 页面上的价格表

GPU 配额

您的 GPU 配额是可以在 GCP 项目中运行的 GPU 的总数。 要创建使用 GPU 的集群,您的项目必须拥有足够的 GPU 配额。

您的 GPU 配额至少应该等于您打算在集群中运行的 GPU 的总数。如果您启用集群自动调节功能,则申请的 GPU 配额至少应该等于集群的最大节点数乘以每个节点的 GPU 数所得的值。

例如,如果您创建一个包含三个节点的集群,每个节点运行两个 GPU,则您的项目至少需要六个 GPU 配额。

申请 GPU 配额

如需申请 GPU 配额,请使用 Cloud Console。如需详细了解如何申请配额,请参阅 Compute Engine 文档中的申请更多配额

如需搜索 GPU 配额,请在 Cloud Console 中执行以下步骤:

  1. 访问 Cloud Console 中的 Identity and Access Management (IAM) 配额菜单。

    访问“配额”菜单

  2. 指标下拉菜单中,点击,然后在搜索字段中输入“gpus”。

  3. 从搜索结果中,选择所需的 GPU:

    “指标”下拉菜单的屏幕截图,其中显示了选定的 GPU 指标。

  4. 关闭指标下拉菜单。

提交配额申请

如需提交配额申请,请在 Cloud Console 中执行以下步骤:

  1. 从 GPU 配额列表中,为所需区域(如 us-central1)选择配额。
  2. 点击修改配额。此时,Cloud Console 的右侧将打开申请表。
  3. 填写每个配额申请的新配额上限字段。
  4. 申请说明字段中,填写有关您的申请的详细信息。
  5. 点击完成
  6. 点击提交申请 (Submit request)。

运行 GPU

以下部分介绍了如何在 GKE 集群中运行 GPU。

创建可自动扩缩的 GPU 节点池

为了最好地发挥 GKE 上的 GPU 的最具成本效益的优势,并充分利用集群自动扩缩功能,我们建议在集群中创建单独的 GPU 节点池。

当您将 GPU 节点池添加到已运行非 GPU 节点池的现有集群时,GKE 会自动使用以下节点污点污染 GPU 节点:

  • nvidia.com/gpu
  • 效果NoSchedule

此外,GKE 通过运行 ExtendedResourceToleration 准入控制器自动将相应的容忍机制设置应用于请求 GPU 的 Pod。

此操作会导致在 GPU 节点上仅调度请求 GPU 的 Pod,这样可实现更高效的自动扩缩:如果没有足够的 Pod 请求 GPU,则 GPU 节点可以快速缩减。

您可以使用 Cloud Console 或 gcloud 命令行工具在现有集群中创建 GPU 节点池。

gcloud

如需创建具有 GPU 的节点池,请运行以下命令:

gcloud container node-pools create pool-name \
  --accelerator type=gpu-type,count=amount \
  --zone compute-zone --cluster cluster-name \
  [--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling]

替换以下内容:

  • pool-name:您为节点池选择的名称。
  • gpu-type:GPU 类型,可以是 nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4
  • amount:要挂接到节点池中节点的 GPU 数量。
  • compute-zone:要在其中创建节点池的计算区域,例如 us-central1-c。集群必须已在指定的区域运行。
  • cluster-name:要在其中创建节点池的集群的名称。

其他选项如下所示:

  • --num-nodes 指定要创建的初始节点数。
  • --min-nodes 指定在任意指定时间运行的最小节点数。
  • --max-nodes 指定可以运行的最大节点数。
  • --enable-autoscaling 允许节点池在工作负载需求发生变化时进行自动扩缩。

例如,以下命令会在集群 p100-cluster 中创建一个名为 p100 的自动扩缩节点池,该节点池带有两个 P100 GPU:

gcloud container node-pools create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c --cluster p100-cluster \
  --num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

控制台

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 选择所需的集群。

  3. 点击修改

  4. 点击添加节点池

  5. (可选)选中启用自动扩缩复选框。

  6. 根据需要配置您的节点池。

  7. 从左侧面板中,选择节点,然后展开 CPU 平台和 GPU

  8. 点击添加 GPU

  9. GPU 数量下拉列表中,选择您希望每个节点要运行的 GPU 数量。

  10. GPU 类型下拉列表中,选择所需的 GPU 类型。

  11. 选择我了解这些限制复选框,以确认警告。

  12. 点击保存

创建具有 GPU 的新区域级集群

您可以使用 Cloud Console 或 gcloud 命令行工具创建运行 GPU 的区域级集群。

gcloud

如需创建区域级集群(GPU 在其默认节点池中运行),请运行以下命令:

gcloud container clusters create cluster-name \
  --accelerator type=gpu-type,count=amount \
  --zone compute-zone

替换以下内容:

  • cluster-name:您为集群选择的名称。
  • gpu-type:GPU 类型,可以是 nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4
  • amount:要在默认节点池中运行的 GPU 数量。
  • compute-zone:集群的计算区域,例如 us-central1-c

例如,以下命令将创建一个名为 p100 的集群,其中包含三个节点(忽略 --num-nodes 时的默认设置),每个节点有两个 P100 GPU:

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c

控制台

  1. 转到 GPU 加速计算集群模板

    转到“GPU 加速计算”模板

  2. 根据需要配置集群。然后自定义 GPU 节点池或添加其他 GPU 节点池。

  3. 选择我了解这些限制,以确认警告。

  4. 点击创建

创建具有 GPU 的新地区级集群

默认情况下,地区级集群在一个区域的三个地区创建节点。但是,Google Cloud 区域并非在所有三个地区都有 GPU。在创建具有 GPU 的地区级集群时,您必须使用 --node-locations 命令指定区域。您也可以在创建集群后使用此命令。如需了解哪些地区具有 GPU,请参阅可用性

您可以使用 gcloud 命令行工具或 Cloud Console 创建区域级 GPU 集群。

gcloud

如需创建具有 GPU 的地区级集群,请运行以下命令:

gcloud container clusters create cluster-name \
  --accelerator type=gpu-type,count=amount \
  --region compute-region \
  --node-locations compute-zone,compute-zone

替换以下内容:

  • cluster-name:您为集群选择的名称。
  • gpu-type:GPU 类型:nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4
  • amount:每个节点运行的 GPU 数量。
  • compute-region:集群所在的地区,例如 us-central1
  • compute-zone:地区内的计算区域,例如 us-central1-c。区域必须具有您指定的 GPU 类型。

例如,以下命令在 us-central1 内的两个地区中创建了一个名为 p100 的集群,其中包含三个节点(忽略 --num-nodes 时的默认设置),每个节点有两个 P100 GPU:

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --region us-central1 \
  --node-locations us-central1-a,us-central1-c

控制台

  1. 转到 GPU 加速计算集群模板

    转到“GPU 加速计算”模板

  2. 位置类型中,选择区域级。从区域中,选择所需的区域。

  3. 根据需要配置集群。然后自定义 GPU 节点池或添加其他 GPU 节点池。

  4. 选择我了解这些限制,以确认警告。

  5. 点击创建

安装 NVIDIA GPU 设备驱动程序

将 GPU 节点添加到集群后,您需要将 NVIDIA 的设备驱动程序安装到节点。Google 提供了一个 DaemonSet,它可以自动为您安装驱动程序。

如需了解 Container-Optimized OS (COS) 和 Ubuntu 节点的安装说明,请参阅下一部分。

COS

要部署 DaemonSet 的安装,请运行以下命令:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

安装需要几秒钟才能完成。安装完成后,NVIDIA GPU 设备插件通过 Kubernetes API 显示 NVIDIA GPU 容量。

下表列出了支持各 Nvidia 驱动程序版本的 GKE 版本:

GKE 版本 Nvidia 驱动程序版本
1.14.2-gke.3 及更高版本 418.67
1.14.2-gke.2 及更低版本 418.67
1.13.6-gke.6 及更高版本 418.67
1.13.6-gke.5 及更低版本 410.79
1.12.x 410.79
1.11.5 及更高版本 410.79
1.10.5-gke.4 及更高版本 396.46
1.10.2-gke.3 及更高版本 390.46

Ubuntu

请注意,v1.11.3 或更高版本的 Ubuntu 节点才支持 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 驱动程序版本的 GKE 版本:

GKE 版本 Nvidia 驱动程序版本
1.14.6-gke.13 及更高版本 418.74
1.14.6-gke.12 及更低版本 410.104
1.13.9-gke.11 及更高版本 418.74
1.13.9-gke.10 及更低版本 410.104
1.12.6-gke.6 及更高版本 410.104
1.12.6-gke.5 及更低版本 384.111
1.11.8-gke.4 及更高版本 410.104
1.11.8-gke.3 及更低版本 384.111

配置 Pod 以使用 GPU

您可以使用资源限制配置 Pod 使用 GPU。您可以使用以下键值对在 Pod 规范中指定资源限制

  • nvidia/gpu
  • :要使用的 GPU 数量

以下示例显示了使用 GPU 的 Pod 规范:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash"]
    resources:
      limits:
       nvidia.com/gpu: 2

使用多种 GPU 类型

如果每个集群要使用多种 GPU 加速器类型,那么您必须创建多个节点池,每个节点池都具有各自的加速器类型。 GKE 将特有的节点选择器附加到 GPU 节点,以帮助您将 GPU 工作负载置于具有特定 GPU 类型的节点上:

  • cloud.google.com/gke-accelerator
  • nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4

您可以将此节点选择器添加到工作负载的 Pod 规范中,以定位特定的 GPU 类型。例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash"]
    resources:
      limits:
       nvidia.com/gpu: 2
  nodeSelector:
    cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4

关于 CUDA 库

CUDA® 是 NVIDIA 的并行计算平台和 GPU 的编程模型。您在集群中安装的 NVIDIA 设备驱动程序包含 CUDA 库

CUDA 库和调试实用程序分别在 /usr/local/nvidia/lib64/usr/local/nvidia/bin 的容器内提供。

对于使用 NVIDIA GPU 的 Pod,其中运行的 CUDA 应用需要动态发现 CUDA 库。这需要在 LD_LIBRARY_PATH 环境变量中包含 /usr/local/nvidia/lib64

对于 GKE 中已正确设置了 LD_LIBRARY_PATH 的 CUDA 应用,建议您使用基于 Ubuntu 的 CUDA Docker 基础映像。在 COS (1.11.5+) 和 Ubuntu(1.11.8-gke.4+、1.12.6-gke.6+)上,所支持的最新 CUDA 版本均为 10.0

监控 GPU 节点

GKE 公开了使用 GPU 的容器的以下 Stackdriver Monitoring 指标。您可以使用这些指标监控 GPU 工作负载的性能:

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

Stackdriver 中提供了这些指标。

如需详细了解如何监控集群及其资源,请参阅监控

查看用量指标

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

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

  1. 访问 Cloud Console 中的工作负载菜单。

    访问 Google Kubernetes Engine 菜单

  2. 选择所需的工作负载。

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

后续步骤