使用抢占式 TPU

抢占式 TPU 节点是运行费用远低于普通节点的 Cloud TPU 节点。但是,如果 Cloud TPU 需要使用这些资源服务其他目的,可能会随时终止(抢占)这些节点。

创建抢占式 TPU

您可以使用 Cloud Console、gcloud 命令行工具或 ctpu 实用程序创建抢占式 TPU 节点。

控制台

  1. 转到主页面上 Compute Engine 下的 TPU 页面
  2. 点击创建 TPU 节点以打开 TPU 节点创建页面。
  3. 在“创建 Cloud TPU”页面的底部,点击标签和说明以显示抢占选项。
  4. 点击抢占选项,使此新 TPU 节点可抢占。
  5. 为此 TPU 节点指定其余属性。
  6. 在页面底部,点击创建以创建 TPU 节点。

gcloud

如需进行自定义设置,您可能需要使用 gcloud 命令而不是 ctpu 来创建和管理 TPU 资源。如需详细了解自定义设置,请参阅创建和删除 TPU 页面。如需创建抢占式 TPU,请使用创建普通 TPU 时所用的 gcloud compute tpus create 命令,但应添加 --preemptible 标志:

$ gcloud compute tpus create demo-tpu \
  --version=2.1 \
  --preemptible
  

其中:

  • demo-tpu 是用于标识您所创建的 TPU 的名称。
  • --version 指定与 TPU 搭配使用的 TensorFlow 版本。
  • --preemptible 允许 Cloud TPU 抢占此 TPU。

ctpu

如需创建抢占式 TPU,请使用创建普通 TPU 时所用的 ctpu up 命令,但应添加 --preemptible 标志:

$ ctpu up --preemptible

请注意,每次为该抢占式 TPU 运行 ctpu up 命令时,都必须指定 --preemptible 标志。命令行标志及其默认值单独应用于每次命令调用。

TPU 是否可抢占与虚拟机实例是否可抢占无关。请参阅下面关于抢占式虚拟机和 TPU 的讨论。

抢占式 TPU 的价格与配额

抢占式 TPU 的价格远低于普通 TPU。 如需了解详情,请参阅价格页面。如果 TPU 在您创建后第一分钟就被抢占,您不需要支付费用。

抢占式 TPU 的配额通常更高,并且独立于普通 TPU 的配额。请参阅配额页面

抢占式虚拟机和抢占式 TPU

快速入门指南中所述,您需要一个 Compute Engine 虚拟机 (VM) 才能连接到 TPU。请注意,TPU 是否可抢占与虚拟机实例是否可抢占无关。您可以将 TPU 定义为抢占式,而虚拟机定义为非抢占式,反之亦可。您也可以将它们都定义为抢占式。

最常见的组合是抢占式 TPU非抢占式虚拟机。请注意以下几点:

  • 虚拟机的费用可能比 TPU 费用低。虚拟机的费用取决于您使用的机器类型。如需了解相对费用的简单示例,请参阅价格页面
  • Cloud TPU 不会协调虚拟机和 TPU 的抢占状态。如果您将它们都定义为抢占式,则虚拟机和 TPU 可能会在不同时间被抢占。
  • 如果 Compute Engine 抢占虚拟机,您仍然需要为 TPU 付费(除非 TPU 本身被抢占)。请注意,在虚拟机被抢占时,TPU 处于空闲状态。
  • 抢占式实例(无论是 Compute Engine 虚拟机还是 Cloud TPU 实例)在运行 24 小时后一定会被抢占。某些操作会重置此 24 小时计数器。

您可以使用 ctpu 命令或 gcloud 命令来定义抢占式虚拟机:

ctpu

如需创建抢占式虚拟机,请使用对普通虚拟机创建 TPU 时所用的 ctpu up 命令,但应添加 --preemptible-vm 标志:

$ ctpu up --preemptible-vm

请注意,每次为该抢占式 TPU 运行 ctpu up 命令时,都必须指定 --preemptible-vm 标志。命令行标志及其默认值单独应用于每次命令调用。

gcloud

如需进行自定义设置,您可能需要使用 gcloud 命令而不是 ctpu 来创建和管理 TPU 资源。如需详细了解自定义设置,请参阅创建和删除 TPU 页面。如需创建抢占式虚拟机,请使用创建普通虚拟机时所用的 gcloud compute instances create 命令,但应添加 --preemptible 标志:

$ gcloud compute instances create tpu-demo-vm \
  --machine-type=n1-standard-2 \
  --image-project=ml-images \
  --image-family=tf-1-15 \
  --scopes=cloud-platform \
  --preemptible

其中:

  • tpu-demo-vm 是用于标识您所创建的虚拟机实例的名称。
  • --machine-type=n1-standard-2 是具有 4 个虚拟 CPU 和 15 GB 内存的标准机器类型。请参阅可用机器类型
  • --image-project=ml-images 是一个共享的映像集合,使 tf-1-15 映像可供您使用。
  • --image-family=tf-1-15 是一个包含 TensorFlow 所需 pip 软件包的映像。
  • --scopes=cloud-platform 允许虚拟机访问 Google Cloud API。
  • --preemptible 可让 Compute Engine 抢占虚拟机实例。

请参阅有关创建抢占式虚拟机实例的 Compute Engine 文档。

检测 TPU 是否已被抢占

您可以使用 ctpu 命令或 gcloud 命令检查 Cloud TPU 服务是否已抢占您的 TPU:

ctpu

检查 TPU 的状态:

$ ctpu status

以上命令用于显示您创建的 TPU 的详细信息。TPU 抢占式的显示值指示 TPU 是否已被抢占。如果显示的 TPU 状态READY,则表示 TPU 尚未被抢占。如果 TPU 已被抢占,则状态会从 READY 更改为 PREEMPTED

gcloud

列出您的可用 TPU:

(vm)$ gcloud compute tpus list

以上命令用于显示您创建的 TPU 的详细信息。如果显示的 STATUSREADY,则表示 TPU 尚未被抢占。如果 TPU 已被抢占,则状态会从 READY 更改为 PREEMPTED。例如:

NAME       ZONE           ACCELERATOR_TYPE  NETWORK_ENDPOINT   NETWORK  RANGE          STATUS
demo-tpu   us-central1-b  v2-8              10.240.1.2:8470    default  10.240.1.0/29  PREEMPTED

检测虚拟机实例是否已被抢占

如需检查虚拟机实例是否已被抢占,请使用 gcloud compute operations list 命令获取最近的系统操作:添加 name 过滤条件以仅显示您当前运行的实例,或添加 operationType 过滤条件以仅显示已被抢占的资源。例如,使用以下命令可仅显示具有指定实例名称的实例:

$ gcloud compute operations list--filter="name=( 'NAME' my-vm)"

以下示例仅显示已被抢占的资源:

$ gcloud compute operations list --filter="operationType=compute.instances.preempted"

如需了解详情,请参阅 Compute Engine 指南

将机器学习应用设计为可在抢占式 TPU 上运行

通过定期保存模型检查点,同时配置应用以在重启时恢复最近的检查点,从而确保您的应用能够灵活应对虚拟机和 TPU 的重启。

TensorFlow TPUEstimator API 负责为您保存并恢复模型检查点。如果您使用 TPUEstimator,则无需担心保存或恢复 TPU 或虚拟机的检查点。详细了解将 TPUEstimator 与 Cloud TPU 搭配使用

最佳做法是按照上述说明将 TPUEstimator 与 Cloud TPU 搭配使用。但是,如果您想深入了解如何自行将检查点保存和恢复功能编写到您的模型中,请参阅 TensorFlow tf.train 模块中的以下资源:

后续步骤