将 Cloud Storage 用作已装载的文件系统

借助 Cloud Storage FUSE,您可以将训练数据加载到 Cloud Storage 存储桶中,并像访问已装载的文件系统一样,从自定义训练作业访问这些数据。使用 Cloud Storage FUSE 具有以下优势:

  • 训练数据会流式传输到训练作业,而不是下载到副本中,这有助于在作业开始运行时更快地加载和设置数据。
  • 训练作业可以大规模处理输入和输出,而无需进行 API 调用、处理响应或与客户端库集成。
  • Cloud Storage FUSE 可为大型文件顺序读取和分布式训练场景提供高吞吐量。

使用场景

在以下情况下,我们建议您使用 Cloud Storage 来存储训练数据:

  • 您的训练数据是非结构化数据,例如图片、文本和视频。
  • 您的训练数据是 TFRecord 等格式的结构化数据。
  • 您的训练数据包含大型文件,例如 RAW 格式的视频。
  • 您使用分布式训练。

运作方式

自定义训练作业可以将 Cloud Storage 存储桶作为根 /gcs 目录的子目录进行访问。例如,如果您的训练数据位于 gs://example-bucket/data.csv,您可以从 Python 训练应用对存储桶进行读写,如下所示:

读取存储桶

with open('/gcs/example-bucket/data.csv', 'r') as f:
  lines = f.readlines()

写入存储桶

with open('/gcs/example-bucket/epoch3.log', 'a') as f:
  f.write('success!\n')

存储桶访问权限

默认情况下,自定义训练作业可以使用 Vertex AI Custom Code Service Agent 访问同一 Google Cloud 项目中的任何 Cloud Storage 存储桶。如需控制对存储桶的访问权限,您可以为作业分配自定义服务账号。在这种情况下,被授予的 Cloud Storage 存储桶访问权限取决于与自定义服务账号的 Cloud Storage 角色关联的权限。

例如,如果您要向自定义训练作业授予存储桶 A 的读写权限和存储桶 B 的只读权限,则可以为该作业分配具有以下角色的服务账号:

  • roles/storage.objectAdmin(用于存储桶 A)
  • roles/storage.objectViewer(用于存储桶 B)

如果训练作业尝试写入存储桶 B,系统会返回“没有权限”错误。

如需详细了解 Cloud Storage 角色,请参阅适用于 Cloud Storage 的 IAM 角色

最佳做法

  • 避免重命名目录。在 Cloud Storage FUSE 中,重命名不是原子操作。如果操作中断,某些文件会保留在旧目录中。
  • 避免不必要地关闭 (close()) 或刷新文件 (flush())。关闭或刷新文件会将文件推送到 Cloud Storage,这会产生费用。

性能优化准则

将 Cloud Storage 用作文件系统时,为了获得最佳读取吞吐量,我们建议您遵循以下准则:

  • 为了减少在存储桶中查找和打开对象导致的延迟,将数据存储在少量较大的文件中。
  • 使用分布式训练来最大化带宽利用率。
  • 缓存经常访问的文件以提高读取性能。 如需了解详情,请参阅 Cloud Storage FUSE 中的缓存概览
  • 使用本地存储空间(而非 Cloud Storage)进行检查点和日志记录。

限制

如需了解 Cloud Storage FUSE 的限制,包括 Cloud Storage FUSE 和 POSIX 文件系统之间的差异,请参阅限制和与 POSIX 文件系统的区别

使用 Cloud Storage FUSE

如需将 Cloud Storage FUSE 用于自定义训练,请执行以下操作:

  1. 创建 Cloud Storage 存储桶
  2. 将训练数据上传到存储桶。如需了解详情,请参阅上传

    如需了解将数据转移到 Cloud Storage 的其他选项,请参阅数据转移选项

  3. 安装 Cloud Storage FUSE

  4. 在训练应用中装载存储桶

后续步骤