- 训练数据会流式传输到训练作业,而不是下载到副本中,这有助于在作业开始运行时更快地加载和设置数据。
- 训练作业可以大规模处理输入和输出,而无需进行 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 用于自定义训练,请执行以下操作:
- 创建 Cloud Storage 存储桶。
将训练数据上传到存储桶。如需了解详情,请参阅上传。
如需了解将数据转移到 Cloud Storage 的其他选项,请参阅数据转移选项。
后续步骤
- 参阅 Cloud Storage FUSE 文档。
- 了解 Cloud Storage FUSE 价格。
- 准备训练应用以在 Vertex AI 上使用。