访问训练数据 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

访问训练数据

创建训练作业时,可以指定训练数据集的位置以及用于访问数据集的输入模式。在数据定位方面,亚马逊 SageMaker 支持亚马逊简单存储服务 (Amazon S3)、亚马逊弹性文件系统 (Amazon EFS) 和适用于 Lustre 的亚马逊 FSx。输入模式决定是实时流式传输数据集的数据文件,还是在训练作业开始时下载整个数据集。

注意

您的输入数据集必须与训练作业 Amazon Web Services 区域 相同。

SageMaker 输入模式和 Amazon 云存储

本节总结了亚马逊 S3 的 SageMaker 输入模式以及亚马逊 EFS 中的文件系统和 Lustre 版 Amazon FSx 中的文件系统。

  • 文件模式向训练容器显示数据集的文件系统视图。如果您没有明确指定其他两个选项之一,这就是默认输入模式。如果您使用文件模式,则会将训练数据从存储位置 SageMaker 下载到 Docker 容器中的本地目录。训练会在完整数据集下载完毕后开始。在文件模式下,训练实例必须有足够的存储空间来容纳整个数据集。文件模式的下载速度取决于数据集的大小、文件的平均大小和文件数量。您可以通过提供 Amazon S3 前缀、清单文件或增强清单文件来将数据集配置为文件模式。当所有数据集文件都使用通用 S3 前缀寻址时,应使用 S3 前缀。文件模式与SageMaker 本地模式兼容(在几秒钟内以交互方式启动 SageMaker 训练容器)。对于分布式训练,您可以使用 ShardedByS3Key 选项将数据集分成多个实例。

  • 快速文件模式允许文件系统访问 Amazon S3 数据来源,同时利用管道模式的性能优势。在训练开始时,快速文件模式标识数据文件但不下载它们。无需等待下载整个数据集即可开始训练。这意味着,在带有所提供的 Amazon S3 前缀的文件较少的情况下,启动训练所需的时间会缩短。

    与管道模式相反,快速文件模式适用于随机访问数据。但在按顺序读取数据时,它的性能最好。快速文件模式不支持增强清单文件。

    快速文件模式使用符合 POSIX 的文件系统界面显示 S3 对象,就好像这些文件在训练实例的本地磁盘上可用一样。当您的训练脚本使用数据时,它会根据需要流式传输 S3 内容。这意味着您的数据集不再需要作为一个整体放入训练实例的存储空间,也无需等待数据集下载到训练实例后再开始训练。快速文件模式目前仅支持 S3 前缀(它不支持清单和增强清单)。快速文件模式与 SageMaker 本地模式兼容。

  • 管道模式直接从 Amazon S3 数据来源流式传输数据。与文件模式相比,流式传输可以缩短启动时间并提高吞吐量。

    直接流式传输数据时,您可以减小训练实例使用的 Amazon EBS 卷的大小。管道模式只需要足够的磁盘空间来存储最终模型构件。

    这是另一种流媒体模式,在很大程度上已被更新和 simpler-to-use快速的文件模式所取代。在管道模式下,会以高并发性和吞吐量从 Amazon S3 预取数据,然后流式传输到命名管道中,该管道也因其行为而被称为先入先出 (FIFO) 管道。每个管道只能由一个进程读取。一种 SageMaker特定的扩展,可 TensorFlow 方便地将 Pipe 模式集成到用于流式传输文本、TFRecordio 或 Recordio 文件格式的本机 TensorFlow 数据加载器中。管道模式还支持对数据进行托管分片和随机排序。

  • Amazon S3 Express On e Zone 是一种高性能的单一可用区存储类别,可以为包括模型训练在内的对延迟最敏感的应用程序提供一致的个位数毫秒数据访问。 SageMaker Amazon S3 Express One Zone 允许客户将其对象存储和计算资源配置在单个 Amazon 可用区中,从而通过提高数据处理速度来优化计算性能和成本。为了进一步提高访问速度并支持每秒数十万个请求,数据存储在新的存储桶类型,即 Amazon S3 目录存储桶中。

    SageMaker 模型训练支持高性能 Amazon S3 Express One Zone 目录存储桶作为文件模式、快速文件模式和管道模式的数据输入位置。要使用 Amazon S3 Express One Zone,请输入 Amazon S3 Express One Zone 目录存储桶的位置,而不是亚马逊 S3 存储桶的位置。为 IAM 角色提供 ARN 以及所需的访问控制和权限策略。有关详细信息,请参阅AmazonSageMakerFullAccesspolicy。有关更多信息,请参阅 Amazon S3 Express One Zone

  • 适用于 Lustre 的 Amazon FSx – 适用于 Lustre 的 FSx 可以扩展到数百 GB 的吞吐量和数百万 IOPS,所以检索文件时的延迟较低。启动训练作业时,将 FSx for Lustre 文件系统 SageMaker挂载到训练实例文件系统,然后启动训练脚本。挂载本身是一个相对较快的操作,它不依赖于适用于 Lustre 的 FSx 中存储的数据集的大小。

    要访问 FSx for Lustre,您的训练作业必须连接到亚马逊虚拟私有云 (VPC),这需要设置和参与。 DevOps 为避免发生数据传输成本,文件系统使用单个可用区,您需要在运行训练作业时指定一个映射到此可用区 ID 的 VPC 子网。

  • Amazon EFS — 要使用 Amazon EFS 作为数据源,数据在训练之前必须已经存在于 Amazon EFS 中。 SageMaker 将指定的 Amazon EFS 文件系统挂载到训练实例,然后启动您的训练脚本。您的训练作业必须连接到 VPC 才能访问 Amazon EFS。

    提示

    要详细了解如何为 SageMaker 估算器指定 VPC 配置,请参阅 Pyth SageMakeron SDK 文档中的使用文件系统作为训练输入

使用 SageMaker Python 软件开发工具包选择数据输入模式

SageMaker Python SDK 为用于启动训练作业的机器学习框架提供了通用 E stimator 类及其变体。在配置 SageMaker Estimator类或Estimator.fit方法时,可以指定其中一种数据输入模式。以下代码模板显示指定输入模式的两种方法。

使用 Estimator 类指定输入模式

from sagemaker.estimator import Estimator from sagemaker.inputs import TrainingInput estimator = Estimator( checkpoint_s3_uri='s3://my-bucket/checkpoint-destination/', output_path='s3://my-bucket/output-path/', base_job_name='job-name', input_mode='File' # Available options: File | Pipe | FastFile ... ) # Run the training job estimator.fit( inputs=TrainingInput(s3_data="s3://my-bucket/my-data/train") )

欲了解更多信息,请参阅 Python SDK 文档中的 sagemaker.estimator.estimator.estimat or 类。SageMaker

通过 Estimator 拟合方法指定输入模式

from sagemaker.estimator import Estimator from sagemaker.inputs import TrainingInput estimator = Estimator( checkpoint_s3_uri='s3://my-bucket/checkpoint-destination/', output_path='s3://my-bucket/output-path/', base_job_name='job-name', ... ) # Run the training job estimator.fit( inputs=TrainingInput( s3_data="s3://my-bucket/my-data/train", input_mode='File' # Available options: File | Pipe | FastFile ) )

欲了解更多信息,请参阅 sagemaker.estimator.e stimator.fit 类方法和 sagemaker.inputs。TrainingInputSageMaker Python 软件开发工具包文档中的类。

提示

建议将数据输入模式与 Amazon S3、Amazon EFS 和适用于 Lustre 的 FSx 集成,从而优化数据来源的配置以获得最佳实践。您可以使用 SageMaker 托管存储选项和输入模式从战略上提高数据加载性能,但它不受严格限制。您可以直接在训练容器中编写自己的数据读取逻辑。例如,您可以设置为从不同的数据来源读取,编写自己的 S3 数据加载器类,或者在训练脚本中使用第三方框架的数据加载函数。但是,您必须确保指定 SageMaker可以识别的正确路径。

提示

如果您使用自定义训练容器,请务必安装有助于为SageMaker 训练作业设置环境的 SageMaker 培训工具包。否则,您必须在 Dockerfile 中明确指定环境变量。有关更多信息,请参阅使用自己的算法和模型创建容器

有关如何使用低级 SageMaker API 设置数据输入模式的更多信息亚马逊如何 SageMaker 提供培训信息,请参阅 CreateTrainingJobAPI 和TrainingInputMode中的AlgorithmSpecification

将数据输入通道配置为使用适用于 Lustre 的 Amazon FSx

了解如何使用适用于 Lustre 的 Amazon FSx 作为数据来源,通过缩短数据加载时间来提高吞吐量和训练速度。

将 Amazon S3 与适用于 Lustre 的 Amazon FSx 同步

要将您的 Amazon S3 与适用于 Lustre 的 Amazon FSx 关联并上传您的训练数据集,请执行以下操作。

  1. 准备好您的数据集并上传到 Amazon S3 存储桶。例如,假设训练数据集和测试数据集的 Amazon S3 路径采用以下格式。

    s3://my-bucket/data/train s3://my-bucket/data/test
  2. 要创建与包含训练数据的 Amazon S3 存储桶关联的、适用于 Lustre 的 FSx 文件系统,请完成《适用于 Lustre 的 Amazon FSx 用户指南》将您的文件系统与 Amazon S3 存储桶关联中的步骤。请务必在您的 VPC 中添加一个允许访问 Amazon S3 的端点。有关更多信息,请参阅 创建 Amazon S3 VPC 端点。指定数据存储库路径时,请提供包含您的数据集的文件夹的 Amazon S3 存储桶 URI。例如,根据步骤 1 中的 S3 路径示例,数据存储库路径应如下所示。

    s3://my-bucket/data
  3. 创建适用于 Lustre 的 FSx 文件系统后,通过运行以下命令检查配置信息。

    aws fsx describe-file-systems && \ aws fsx describe-data-repository-association

    这些命令返回 FileSystemIdMountNameFileSystemPathDataRepositoryPath。输出应该类似以下示例。

    # Output of aws fsx describe-file-systems "FileSystemId": "fs-0123456789abcdef0" "MountName": "1234abcd" # Output of aws fsx describe-data-repository-association "FileSystemPath": "/ns1", "DataRepositoryPath": "s3://my-bucket/data/"

    在 Amazon S3 和 Amazon FSx 之间完成同步后,您的数据集将保存在 Amazon FSx 中的以下目录中。

    /ns1/train # synced with s3://my-bucket/data/train /ns1/test # synced with s3://my-bucket/data/test

将 Amazon FSx 文件系统路径设置为训练的数据输入通道 SageMaker

以下过程将引导您完成将 Amazon FSx 文件系统设置为 SageMaker 训练作业数据源的过程。

Using the SageMaker Python SDK

要正确将 Amazon FSx 文件系统设置为数据源,请配置 SageMaker估算器类并FileSystemInput使用以下指令。

  1. 配置 FileSystemInput 类对象。

    from sagemaker.inputs import FileSystemInput train_fs = FileSystemInput( file_system_id="fs-0123456789abcdef0", file_system_type="FSxLustre", directory_path="/1234abcd/ns1/", file_system_access_mode="ro", )
    提示

    指定 directory_path 时,请务必提供以 MountName 开头的 Amazon FSx 文件系统路径。

  2. 使用用于 Amazon FSx 文件系统的 VPC 配置来配置 SageMaker 估算器。

    from sagemaker.estimator import Estimator estimator = Estimator( ... role="your-iam-role-with-access-to-your-fsx", subnets=["subnet-id"], # Should be the same as the subnet used for Amazon FSx security_group_ids="security-group-id" )
  3. 通过在 Amazon FSx 文件系统中运行 estimator.fit 方法来启动训练作业。

    estimator.fit(train_fs)

要查找更多代码示例,请参阅 SageMaker Python SDK 文档中的使用文件系统作为训练输入

Using the SageMaker CreateTrainingJob API

作为CreateTrainingJob请求 JSON 的一部分,请按以下方式进行配置InputDataConfig

"InputDataConfig": [ { "ChannelName": "string", "DataSource": { "FileSystemDataSource": { "DirectoryPath": "/1234abcd/ns1/", "FileSystemAccessMode": "ro", "FileSystemId": "fs-0123456789abcdef0", "FileSystemType": "FSxLustre" } } } ],
提示

指定 DirectoryPath 时,请务必提供以 MountName 开头的 Amazon FSx 文件系统路径。

配置适用于 Lustre 的 FSx 时的提示和注意事项

  1. 当您使用启用 EFA 的实例(例如 P4d 和 P3dn)时,请确保在安全组中设置适当的入站和输出规则。特别是, SageMaker 要在训练作业中访问 Amazon FSx 文件系统,就必须打开这些端口。要了解更多信息,请参阅使用 Amazon VPC 进行文件系统访问控制

  2. 确保用于启动 SageMaker 训练作业的 IAM 角色可以访问 Amazon FSx。

选择数据来源和输入模式的最佳实践

训练作业的最佳数据来源取决于工作负载特征,例如数据集的大小、文件格式、文件的平均大小、训练持续时间、顺序或随机数据加载器读取模式以及模型消耗训练数据的速度。以下最佳实践为开始使用最适合您的使用案例的输入模式和数据存储提供了指导。

This flowchart summarizes and visualizes best practices of choosing the best storage as the data source and input file mode. All of the cases in the flowchart are described in the following sections.

何时使用 Amazon EFS

如果您的数据集存储在 Amazon Elastic File System 中,您可能有使用 Amazon EFS 进行存储的预处理或注释应用程序。您可以运行已配置为数据通道指向 Amazon EFS 文件系统的训练作业。有关更多信息,请参阅 SageMaker 使用适用于 Lustre 的 Amazon FSx 和 Amazon EFS 文件系统加快在亚马逊上的培训速度。如果您无法获得更好的性能,请按照 Amazon Elastic File System 性能指南检查您的优化选项,或者考虑使用不同的输入模式或数据存储。

为小型数据集使用文件模式

如果数据集存储在 Amazon Simple Storage Service 中,并且其总体容量相对较小(例如,小于 50-100 GB),请尝试使用文件模式。下载 50 GB 数据集的开销可能因文件总数而异。例如,如果将数据集分为 100 MB 的分片,则需要大约 5 分钟。该启动开销是否可以接受主要取决于训练作业的总体持续时间,因为更长的训练阶段意味着下载阶段相应地缩小。

对多个小文件进行序列化

如果您的数据集大小较小(小于 50-100 GB)、但由许多小文件组成(每个文件小于 50 MB),则文件模式下的下载开销会增加,因为每个文件都需要从 Amazon Simple Storage Service 单独下载到训练实例卷。为了总体上减少这种开销和数据遍历时间,可以考虑使用文件格式(例如 TFRecord for、for 和 R ecordio f or MXnet),将此类小文件组序列化为 TensorFlow较少的大文件容器(例如每个文件 150 MB)。 WebDataset PyTorch

何时使用快速文件模式

对于文件较大(每个文件超过 50 MB)的较大数据集,第一种选择是尝试使用快速文件模式,该模式比适用于 Lustre 的 FSx 更为直接,因为它不需要创建文件系统或连接到 VPC。快速文件模式非常适合大型文件容器(超过 150 MB),可能还适用于大于 50 MB 的文件。由于快速文件模式提供 POSIX 界面,因此它支持随机读取(读取非顺序字节范围)。但这不是理想的使用案例,您的吞吐量可能会低于顺序读取的吞吐量。不过,如果您有一个相对较大的计算密集型机器学习模型,则快速文件模式可能仍然能够让训练管线的有效带宽达到饱和,而不会导致 IO 瓶颈。您需要进行试验以确定效果。要从文件模式切换到快速文件模式(然后切换),只需在使用 SageMaker Python SDK 定义输入通道时添加(或删除)input_mode='FastFile'参数即可:

sagemaker.inputs.TrainingInput(S3_INPUT_FOLDER, input_mode = 'FastFile')

何时使用适用于 Lustre 的 Amazon FSx

如果您的数据集对于文件模式来说太大,有许多无法轻松序列化的小文件,或者您的数据集使用随机读取访问模式,那么适用于 Lustre 的 FSx 是一个不错的选择。它的文件系统可扩展到每秒数百 GB (GB/s) 的吞吐量和数百万的 IOPS,是小文件数量较多时的理想选择。但请注意,由于延迟加载以及设置和初始化适用于 Lustre 的 FSx 文件系统的开销,可能会出现冷启动问题。

提示

要了解更多信息,请参阅为您的 Amazon SageMaker 训练作业选择最佳数据源。这篇 Amazon 机器学习博客进一步讨论了数据源和输入模式的案例研究和性能基准。

用于多租户培训的基于属性的访问控制 (ABAC)

在多租户环境中,确保每个租户的数据是隔离的,并且只有授权实体才能访问,这一点至关重要。 SageMaker 支持使用基于属性的访问控制 (ABAC) 来实现训练作业的这种隔离。您无需为每个租户创建多个 IAM 角色,而是可以通过配置会话链配置来为所有租户使用相同的 IAM 角色,该配置使用 Amazon Security Token Service (Amazon STS) 会话标签为您的训练作业请求临时的、有限权限的证书以访问特定租户。有关会话标签的更多信息,请参阅中的传递会话标签 Amazon STS

创建训练作业时,您的会话链接配置使用 Amazon STS 来请求临时安全证书。此请求会生成一个会话,该会话已被标记。每个 SageMaker 训练作业只能使用所有训练作业共享的单个角色访问特定的租户。通过使用会话链接实现 ABAC,您可以确保每个训练作业只能访问会话标签指定的租户,从而有效地隔离和保护每个租户。以下部分将指导您完成使用 Pyth SageMaker on SDK 设置和使用 ABAC 进行多租户训练作业隔离的步骤。

先决条件

要开始使用 ABAC 进行多租户训练作业隔离,您必须具备以下条件:

  • 不同地点命名一致的租户。例如,如果租户的输入数据 Amazon S3 URI 为s3://your-input-s3-bucket/example-tenant,则该租户的 Amazon FSx 目录应为/fsx-train/train/example-tenant,输出数据 Amazon S3 URI 应为。s3://your-output-s3-bucket/example-tenant

  • 创造 SageMaker 就业机会的角色。您可以使用 Amazon 角色管理器创建 SageMaker 任务创建 SageMaker角色。有关信息,请参阅使用角色管理器

  • 在其信任策略中具有sts:AssumeRolests:TagSession权限的 SageMaker 执行角色。有关 SageMaker 执行角色的更多信息,请参阅SageMaker角色

    执行角色还应有一个策略,允许任何基于属性的多租户架构中的租户从附加到主体标签的前缀中读取。以下是一个策略示例,该策略将 SageMaker 执行角色限制为有权访问与tenant-id密钥关联的值。有关命名标签密钥的更多信息,请参阅 IAM 和 STS 中的标签规则

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::<your-input-s3-bucket>/${aws:PrincipalTag/tenant-id}/*" ], "Effect": "Allow" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::<your-output-s3-bucket>/${aws:PrincipalTag/tenant-id}/*" }, { "Action": "s3:ListBucket", "Resource": "*", "Effect": "Allow" } ] }

创建启用会话标签链接的训练作业

以下过程向您展示如何使用支持 ABAC 的多租户训练的 SageMaker Python SDK 创建带有会话标签链的训练作业。

注意

除了多租户数据存储外,您还可以使用 ABAC 工作流程将会话标签传递给您的 Amazon VPC 执行角色以及您允许调用的任何其他服务 Amazon Key Management Service SageMaker

为 ABAC 启用会话标签链接
  1. 导入boto3和 SageMaker Python 开发工具包。支持 ABAC 的训练作业隔离仅在 Python SDK 的 2.217 或更高版本中可用。 SageMaker

    import boto3 import sagemaker from sagemaker.estimator import Estimator from sagemaker.inputs import TrainingInput
  2. 设置 Amazon STS 和 SageMaker 客户端,以使用标有租户标签的会话标签。您可以更改标签值以指定其他租户。

    # Start an AWS STS client sts_client = boto3.client('sts') # Define your tenants using tags # The session tag key must match the principal tag key in your execution role policy tags = [] tag = {} tag['Key'] = "tenant-id" tag['Value'] = "example-tenant" tags.append(tag) # Have AWS STS assume your ABAC-enabled job creation role response = sts_client.assume_role( RoleArn="arn:aws:iam::<account-id>:role/<your-training-job-creation-role>", RoleSessionName="SessionName", Tags=tags) credentials = response['Credentials'] # Create a client with your job creation role (which was assumed with tags) sagemaker_client = boto3.client( 'sagemaker', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'] ) sagemaker_session = sagemaker.Session(sagemaker_client=sagemaker_client)

    "tenant-id=example-tenant"将标签附加到任务创建角色时,执行角色会提取这些标签以使用以下策略:

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::<your-input-s3-bucket>/example-tenant/*" ], "Effect": "Allow" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::<your-output-s3-bucket>/example-tenant/*" }, { "Action": "s3:ListBucket", "Resource": "*", "Effect": "Allow" } ] }
  3. 使用 Pyth SageMaker on SDK 定义一个估计器来创建训练作业。设置enable_session_tag_chainingTrue,允许您的 SageMaker训练执行角色从您的任务创建角色中检索标签。

    # Specify your training input trainingInput = TrainingInput( s3_data='s3://<your-input-bucket>/example-tenant', distribution='ShardedByS3Key', s3_data_type='S3Prefix' ) # Specify your training job execution role execution_role_arn = "arn:aws:iam::<account-id>:role/<your-training-job-execution-role>" # Define your esimator with session tag chaining enabled estimator = Estimator( image_uri="<your-training-image-uri>", role=execution_role_arn, instance_count=1, instance_type='ml.m4.xlarge', volume_size=20, max_run=3600, sagemaker_session=sagemaker_session, output_path="s3://<your-output-bucket>/example-tenant", enable_session_tag_chaining=True ) estimator.fit(inputs=trainingInput, job_name="abac-demo")

SageMaker 只能读取训练任务请求中提供的标签,不能代表您向资源添加任何标签。

用于 SageMaker 训练的 ABAC 与 SageMaker 托管温池兼容。要将 ABAC 与温池一起使用,匹配的训练作业必须具有相同的会话标签。有关更多信息,请参阅 匹配的训练作业