将持久性块存储挂接到 TPU 虚拟机

TPU 虚拟机包含一个 100 GiB 的启动磁盘。在某些情况下,TPU 虚拟机可能需要额外的存储空间进行训练或预处理。您可以添加 Google Cloud Hyperdisk永久性磁盘(PD)卷来扩展本地磁盘容量。

为了获得最高性能和高级功能,Google 建议您使用 Hyperdisk(如果适用于 TPU)。否则,请使用永久性磁盘。如需详细了解 Compute Engine 中的块存储选项,请参阅选择磁盘类型

TPU 对 Hyperdisk 和永久性磁盘的支持

下表展示了每个 TPU 版本支持的磁盘类型:

TPU 版本 支持的磁盘类型 每个虚拟机的永久性磁盘 (PD) 数量上限
(包括启动磁盘)
v6e Hyperdisk Balanced
Hyperdisk ML
v6e 不支持 PD
v5p 平衡永久性磁盘 128
v5e 平衡永久性磁盘 128
v4 平衡永久性磁盘 128
v3 平衡永久性磁盘 128
v2 平衡永久性磁盘 128

访问模式

您可以将磁盘配置为以单写入者模式或只读模式挂接到 TPU,如下表所示:

访问模式 说明 Compute Engine API 中的值 Cloud TPU API 中的值 支持的磁盘类型
单写入者模式 这是默认访问模式。允许磁盘在任何时候最多挂接到一个实例。实例具有对磁盘的读写权限。 READ_WRITE_SINGLE read-write
  • 平衡 Hyperdisk
  • Hyperdisk ML
  • 平衡永久性磁盘
只读模式 允许以只读模式同时挂接到多个实例。实例无法将数据写入此模式下的磁盘。此模式对于只读共享是必需的。 READ_ONLY_MANY read-only
  • 平衡 Hyperdisk
  • 平衡永久性磁盘

您可以将磁盘配置为以单写入者模式或只读模式挂接到单主机 TPU(例如 v6e-8、v5p-8 或 v5litepod-8)。

将磁盘挂接到多主机 TPU 时,该磁盘会挂接到该 TPU 中的每个虚拟机。为了防止两个或多个 TPU 虚拟机同时写入磁盘,您必须将挂接到多主机 TPU 的所有磁盘都配置为只读。只读磁盘可用于存储在 TPU 切片上处理的数据集。

前提条件

在按照以下过程操作之前,您需要先设置 Google Cloud 账号和项目。如需了解详情,请参阅设置 Cloud TPU 环境

创建磁盘

使用以下命令创建磁盘:

$ gcloud compute disks create DISK_NAME \
    --size DISK_SIZE  \
    --zone ZONE \
    --type DISK_TYPE

命令标志说明

DISK_NAME
新磁盘的名称。
DISK_SIZE
新磁盘的大小。该值必须是一个整数,后跟大小单位(GB 表示吉比字节,或 TB 表示太比字节)。如果未指定大小单位,则假定为 GB。
ZONE
要在其中创建新磁盘的可用区的名称。该可用区必须是用于创建 TPU 的可用区。
DISK_TYPE
磁盘的类型。请使用以下某个值:hyperdisk-balancedhyperdisk-mlpd-balanced

对于 Hyperdisk,您可以选择使用以下某个值指定 --access-mode 标志:

  • READ_WRITE_SINGLE:从一个实例进行读写访问。这是默认值。
  • READ_ONLY_MANY:(仅限 Hyperdisk ML)从多个实例同时进行只读访问。

如需详细了解如何创建磁盘,请参阅创建新的 Hyperdisk 卷创建新的永久性磁盘卷

挂接磁盘

您可以在创建 TPU 虚拟机时将磁盘卷挂接到 TPU 虚拟机,也可以在创建 TPU 虚拟机后挂接一个磁盘卷。

在创建 TPU 虚拟机时挂接磁盘

创建 TPU 虚拟机时,请使用 --data-disk 标志来挂接磁盘卷。

如果您要创建多主机 TPU,则必须指定 mode=read-only(仅限 Hyperdisk ML 和平衡永久性磁盘)。如果您要创建单主机 TPU,可以指定 mode=read-only(仅限 Hyperdisk ML 和平衡永久性磁盘)或 mode=read-write。如需了解详情,请参阅访问模式

以下示例展示了如何在使用已排队的资源创建 TPU 虚拟机时挂接磁盘卷:

$ gcloud compute tpus queued-resources create QR_NAME \
    --node-id=TPU_NAME
    --project PROJECT_ID \
    --zone=ZONE \
    --accelerator-type=ACCELERATOR_TYPE \
    --runtime-version=TPU_SOFTWARE_VERSION \
    --data-disk source=projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME,mode=MODE

命令标志说明

QR_NAME
已排队的资源请求的名称。
TPU_NAME
新 TPU 的名称。
PROJECT_ID
要在其中创建 TPU 的 Google Cloud 项目的 ID。
ZONE
要在其中创建 Cloud TPU 的可用区的名称。
ACCELERATOR_TYPE
加速器类型用于指定您要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
TPU_SOFTWARE_VERSION
TPU 软件版本
DISK_NAME
要挂接到 TPU 虚拟机的磁盘的名称。
MODE
磁盘的模式。模式必须是 read-onlyread-write 之一。如果未指定,则默认模式为 read-write。如需了解详情,请参阅访问模式

您还可以在使用 gcloud compute tpus tpu-vm create 命令创建 TPU 虚拟机时挂接磁盘:

$ gcloud compute tpus tpu-vm create TPU_NAME \
    --project PROJECT_ID \
    --zone=ZONE \
    --accelerator-type=ACCELERATOR_TYPE \
    --version=TPU_SOFTWARE_VERSION \
    --data-disk source=projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME,mode=MODE

命令标志说明

TPU_NAME
新 TPU 的名称。
PROJECT_ID
要在其中创建 TPU 的 Google Cloud 项目的 ID。
ZONE
要在其中创建 Cloud TPU 的可用区的名称。
ACCELERATOR_TYPE
加速器类型用于指定您要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
TPU_SOFTWARE_VERSION
TPU 软件版本
DISK_NAME
要挂接到 TPU 虚拟机的磁盘的名称。
MODE
磁盘的模式。模式必须是 read-onlyread-write 之一。如果未指定,则默认模式为 read-write。如需了解详情,请参阅访问模式

将磁盘挂接到现有 TPU 虚拟机

使用 gcloud alpha compute tpus tpu-vm attach-disk 命令将磁盘挂接到现有 TPU 虚拟机。

$ gcloud alpha compute tpus tpu-vm attach-disk TPU_NAME \
    --zone=ZONE \
    --disk=DISK_NAME \
    --mode=MODE

命令标志说明

TPU_NAME
TPU 的名称。
ZONE
Cloud TPU 所在的可用区
DISK_NAME
要挂接到 TPU 虚拟机的磁盘的名称。
MODE
磁盘的模式。模式必须是 read-onlyread-write 之一。如果未指定,则默认模式为 read-write。这必须与磁盘的访问模式相对应。

如果您的虚拟机因任何原因而关停,您可能需要在重启虚拟机后装载磁盘。如需了解如何使磁盘在虚拟机重启时自动装载,请参阅配置系统重启时的自动装载

如需详细了解如何自动删除磁盘,请参阅修改Hyperdisk修改永久性磁盘

格式化并装载磁盘

如果您将新的空白磁盘挂接到 TPU 虚拟机,则必须先格式化并装载磁盘,然后才能使用磁盘。如果挂接的磁盘已包含数据,则必须先装载该磁盘,然后才能使用它。

如需详细了解如何格式化和装载非启动磁盘,请参阅在 Linux 虚拟机上格式化和装载非启动磁盘

  1. 使用 SSH 连接到 TPU 虚拟机:

    $ gcloud compute tpus tpu-vm ssh TPU_NAME --zone ZONE

    如果您使用的是多主机 TPU,此命令会将您连接到 TPU 切片中的第一个 TPU(也称为工作器 0)。

  2. 从 TPU 虚拟机中,列出挂接到 TPU 虚拟机的磁盘:

    (vm)$ sudo lsblk

    lsblk 命令的输出类似于以下内容:

    NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0     7:0    0  55.5M  1 loop /snap/core18/1997
    loop1     7:1    0  67.6M  1 loop /snap/lxd/20326
    loop2     7:2    0  32.3M  1 loop /snap/snapd/11588
    loop3     7:3    0  32.1M  1 loop /snap/snapd/11841
    loop4     7:4    0  55.4M  1 loop /snap/core18/2066
    sda       8:0    0   300G  0 disk
    ├─sda1    8:1    0 299.9G  0 part /
    ├─sda14   8:14   0     4M  0 part
    └─sda15   8:15   0   106M  0 part /boot/efi
    sdb       8:16   0    10G  0 disk
    

    在此示例中,sda 是启动磁盘,sdb 是新挂接的磁盘的名称。挂接的磁盘的名称取决于挂接到虚拟机的磁盘数量。

    使用多主机 TPU 时,您需要将磁盘装载到 TPU 切片中的所有 TPU 虚拟机上。所有 TPU 虚拟机的磁盘名称应相同,但不保证一定如此。例如,如果您先分离再重新挂接磁盘,设备名称会递增,从 sdb 更改为 sdc

  3. 如果磁盘尚未格式化,请使用 mkfs 工具格式化挂接的磁盘。如果磁盘具有不同的设备名称,请替换 sdb。如果您想使用不同的文件系统,请替换 ext4

    (vm)$ sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
  4. 创建一个用于装载 TPU 上的磁盘的目录。

    如果您使用的是单主机 TPU,请从 TPU 运行以下命令来创建用于装载磁盘的目录:

    (vm)$ sudo mkdir -p /mnt/disks/MOUNT_DIR

    MOUNT_DIR 替换为用于装载磁盘的目录。

    如果您使用的是多主机 TPU,请在 TPU 虚拟机之外运行以下命令。此命令会在 TPU 切片中的所有 TPU 虚拟机上创建该目录。

    (vm)$ gcloud compute tpus tpu-vm ssh TPU_NAME --worker=all --command="sudo mkdir -p /mnt/disks/MOUNT_DIR"
  5. 使用 mount 工具将磁盘装载到 TPU 上。

    如果您使用的是单主机 TPU,请运行以下命令以在 TPU 虚拟机上装载磁盘:

    (vm)$ sudo mount -o discard,defaults /dev/sdb /mnt/disks/MOUNT_DIR

    如果您使用的是多主机 TPU,请在 TPU 虚拟机之外运行以下命令。该命令会在 TPU 切片中的所有 TPU 虚拟机上装载磁盘。

    (vm)$ gcloud compute tpus tpu-vm ssh TPU_NAME --worker=all --command="sudo mount -o discard,defaults /dev/sdb /mnt/disks/MOUNT_DIR"
  6. 配置对磁盘的读写权限。例如,以下命令会为所有用户授予对磁盘的写入权限。

    (vm)$ sudo chmod a+w /mnt/disks/MOUNT_DIR

卸载磁盘

如需从 TPU 虚拟机中卸载(分离)磁盘,请运行以下命令:

$ gcloud alpha compute tpus tpu-vm detach-disk TPU_NAME \
    --zone=ZONE \
    --disk=DISK_NAME

命令标志说明

TPU_NAME
TPU 的名称。
ZONE
Cloud TPU 所在的可用区
DISK_NAME
要从 TPU 虚拟机中分离的磁盘的名称。

清理

使用完 Cloud TPU 和 Compute Engine 资源后,请将其删除。

  1. 断开与 Cloud TPU 的连接(如果您尚未这样做):

    (vm)$ exit

    您的提示符现在应为 username@projectname,表明您位于 Cloud Shell 中。

  2. 删除您的 Cloud TPU:

    $ gcloud compute tpus tpu-vm delete TPU_NAME \
        --zone=ZONE
  3. 验证 Cloud TPU 是否已删除。删除操作可能需要几分钟时间才能完成。

    $ gcloud compute tpus tpu-vm list --zone=ZONE
  4. 通过列出您在其中创建磁盘的可用区中的所有磁盘,验证磁盘在 TPU 虚拟机删除时是否已自动删除:

    $ gcloud compute disks list --filter="zone:( ZONE )"

    如果磁盘在 TPU 虚拟机删除时未删除,请使用以下命令将其删除:

    $ gcloud compute disks delete DISK_NAME \
        --zone ZONE