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

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

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

为 Hyperdisk 和 Persistent Disk 提供 TPU 支持

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

TPU 版本 支持的磁盘类型
v6e Hyperdisk Balanced
Hyperdisk ML
v5p 平衡永久性磁盘
v5e 平衡永久性磁盘
v4 平衡永久性磁盘
v3 平衡永久性磁盘
v2 平衡永久性磁盘

访问模式

您可以将挂接到 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 卷创建新的 Persistent Disk 卷

挂接磁盘

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

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

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

如果您要创建多主机 TPU,则必须指定 mode=read-only(仅限 Hyperdisk ML 和 Balanced 永久性磁盘)。如果您要创建单主机 TPU,可以指定 mode=read-only(仅限 Hyperdisk ML 和平衡 Persistent Disk)或 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