使用 SageMaker 托管的暖池进行训练 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 SageMaker 托管的暖池进行训练

SageMaker 托管的温池允许您在训练作业完成后保留和重复使用预配置的基础架构,以减少重复性工作负载(例如迭代实验或连续运行许多作业)的延迟。与指定参数匹配的后续训练作业在保留的暖池基础设施上运行,这将减少预置资源所花费的时间,从而加快启动速度。

重要

SageMaker 托管的温池是一种可计费的资源。有关更多信息,请参阅 Billing

工作方式

要使用 SageMaker 托管的温池并减少相似的连续训练作业之间的延迟,请创建一个在其中指定KeepAlivePeriodInSeconds值的训练作业ResourceConfig。此值表示将配置的资源保留在暖池中以供后续训练作业使用的持续时间(以秒为单位)。如果您需要使用相似的配置运行多个训练作业,则可使用专用的持久性缓存目录在不同的作业中存储和重用您的信息,来进一步减少延迟和计费时间。

暖池生命周期

  1. 创建一个 KeepAlivePeriodInSeconds 值大于 0 的初始训练作业。在运行此第一个训练作业时,将“冷启动”具有典型启动时间的集群。

  2. 第一个训练作业完成后,在 KeepAlivePeriodInSeconds 值中指定的时间段内,预置的资源将在暖池中保持活动状态。只要集群正常运行且暖池在指定的 KeepAlivePeriodInSeconds 内,暖池状态就会为 Available

  3. 暖池一直保持 Available 状态,直到它识别出匹配的训练作业以供重用,或者它超出指定的 KeepAlivePeriodInSeconds 且被终止。允许的 KeepAlivePeriodInSeconds 的最长时间为 3600 秒(60 分钟)。如果暖池状态为 Terminated,则暖池生命周期已结束。

  4. 如果暖池识别第二个具有匹配规格(例如,实例数或实例类型)的训练作业,则暖池将从第一个训练作业移至第二个训练作业以供重用。第一个训练作业暖池的状态将变为 Reused。这表示第一个训练作业的暖池生命周期结束。

  5. 已重用暖池的第二个训练作业的状态将变为 InUse。第二个训练作业完成后,在第二个训练作业中指定的 KeepAlivePeriodInSeconds 持续时间内,暖池为 Available。暖池最多可在 28 天内继续移至后续的匹配训练作业。

  6. 如果暖池不再可供重用,则暖池的状态将变为 Terminated。在以下情况下,暖池不再可用:由用户终止、为了进行补丁更新或超出指定的 KeepAlivePeriodInSeconds

有关温池状态选项的更多信息,请参阅 Amazon SageMaker API 参考WarmPoolStatus中的。

暖池创建

如果初始训练作业成功完成且其 KeepAlivePeriodInSeconds 值大于 0,则将创建一个暖池。如果您在集群启动后停止训练作业,则仍将保留暖池。如果训练作业因算法或客户端错误而失败,则仍将保留暖池。如果训练作业因任何其他可能损害集群运行状况的原因而失败,则不会创建暖池。

要验证是否已成功创建暖池,请检查训练作业的暖池状态。如果已成功预置暖池,则暖池状态为 Available。如果未能预置暖池,则暖池状态为 Terminated

匹配的训练作业

为了让暖池持续存在,必须在 KeepAlivePeriodInSeconds 值中指定的时间内找到匹配的训练作业。如果以下值相同,则下一个训练作业是匹配项:

  • RoleArn

  • ResourceConfig 值:

    • InstanceCount

    • InstanceType

    • VolumeKmsKeyId

    • VolumeSizeInGB

  • VpcConfig 值:

    • SecurityGroupIds

    • Subnets

  • EnableInterContainerTrafficEncryption

  • EnableNetworkIsolation

  • 如果您为训练作业传递的会话标签在训练作业TrueEnableSessionTagChaining设置为SessionChainingConfig,则匹配的训练作业也必须设置EnableSessionTagChainingTrue并且具有相同的会话密钥。有关更多信息,请参阅 用于多租户培训的基于属性的访问控制 (ABAC)

所有这些值都必须相同,暖池才能移至后续训练作业以供重用。

最长暖池持续时间

单个训练作业的最大 KeepAlivePeriodInSeconds 为 3600 秒(60 分钟),暖池集群可以继续运行连续训练作业的最长时间为 28 天。

后续的每个训练作业还必须指定一个 KeepAlivePeriodInSeconds 值。当暖池移至下一个训练作业时,它会继承该训练作业的 ResourceConfig 中指定的新 KeepAlivePeriodInSeconds 值。这样一来,您可以在最长 28 天内将暖池从一个训练作业移至另一个训练作业。

如果未指定 KeepAlivePeriodInSeconds,则训练作业完成后,暖池将结束。

使用持久性缓存

创建温池时,会在卷上 SageMaker 挂载一个特殊目录,该目录将在温池的整个生命周期中持续存在。该目录还可用于存储要在其他作业中重用的信息。

对于需要以下项的作业,与单独使用暖池相比,使用持久性缓存可以减少延迟和计费时间:

  • 使用相似配置进行多次交互

  • 增量训练作业

  • 超参数优化

例如,通过在持久性缓存目录中设置 pip 缓存目录,可以避免在重复运行时下载相同的 Python 依赖项。您完全负责管理该目录的内容。以下是可放入持久性缓存中以便减少延迟和计费时间的信息类型示例。

  • 由 pip 管理的依赖项。

  • 由 conda 管理的依赖项。

  • 检查点信息

  • 训练期间生成的任何其他信息。

持久性缓存的位置是 /opt/ml/sagemaker/warmpoolcache。环境变量 SAGEMAKER_MANAGED_WARMPOOL_CACHE_DIRECTORY 指向持久性缓存目录的位置。

以下代码示例说明如何设置暖池并使用持久性缓存来存储 pip 依赖项以供后续作业使用。后续作业必须在参数 keep_alive_period_in_seconds 给定的时间范围内运行。

import sagemakerfrom sagemaker import get_execution_rolefrom sagemaker.tensorflow import TensorFlow # Creates a SageMaker session and gets execution role session = sagemaker.Session() role = get_execution_role() # Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='2.2', py_version='py37', job_name='my-training-job-1', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 1, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, environment={"PIP_CACHE_DIR": "/opt/ml/sagemaker/warmpoolcache/pip"} )

在上一个代码示例中,使用环境参数导出环境变量 PIP_CACHE_DIRECTORY 以指向目录 /opt/ml/sagemaker/warmpoolcache/pip。导出此环境变量会将 pip 存储其缓存的位置更改为新位置。您在持久性缓存目录中创建的任何目录(包括嵌套目录)都可在后续训练运行中重用。在上一个代码示例中,名为 pip 的目录已更改为默认位置,以缓存使用 pip 安装的所有依赖项。

也可以使用环境变量从 Python 训练脚本中访问持久性缓存位置,如以下代码示例所示。

import os import shutil if __name__ == '__main__': PERSISTED_DIR = os.environ["SAGEMAKER_MANAGED_WARMPOOL_CACHE_DIRECTORY"] # create a file to be persisted open(os.path.join(PERSISTED_DIR, "test.txt"), 'a').close() # create a directory to be persisted os.mkdir(os.path.join(PERSISTED_DIR, "test_dir")) # Move a file to be persisted shutil.move("path/of/your/file.txt", PERSISTED_DIR)

Billing

SageMaker 托管的温池是一种可计费的资源。检索训练作业的暖池状态以查看暖池的计费时间。您可以通过使用亚马逊 SageMaker控制台或直接通过 DescribeTrainingJobAPI 命令检查温池状态。有关更多信息,请参阅 Amazon SageMaker API 参考WarmPoolStatus中的。

注意

在参数 KeepAlivePeriodInSeconds 指定的时间结束后,暖池和持久性缓存将关闭,并且内容将被删除。

暖池资源限额

首先,您必须先申请提高 SageMaker 托管温池的服务限制。暖池的默认资源限额为 0。

如果创建一个训练作业并指定 KeepAlivePeriodInSeconds,但未请求增加暖池限额,则在该训练作业完成后,将不会保留暖池。仅在暖池限额包含足量的资源时才创建暖池。创建暖池后,当资源移至匹配的训练作业或 KeepAlivePeriodInSeconds 过期(如果暖池状态为 ReusedTerminated)时,将释放资源。

请求增加暖池限额

使用 Service Quotas 控制台申请增加温池配 Amazon 额。

注意

所有温池实例的使用量都计入您的 SageMaker 训练资源限制。增加暖池资源限额不会增加您的实例限额,而是会将一部分资源限额分配给暖池训练。

  1. 打开 Amazon 服务限额控制台

  2. 在左侧导航面板上,选择 Amazon 服务

  3. 搜索并选择 Amazon SageMaker

  4. 搜索关键字 warm pool 以查看所有可用的暖池服务限额。

  5. 找到要为其增加暖池限额的实例类型,为该实例类型选择暖池服务限额,然后选择请求增加限额

  6. 更改限额值下输入您请求的实例限额数。新值必须大于当前应用的限额值

  7. 选择请求

可为每个账户保留的实例数量存在限制,具体取决于实例类型。您可以在 S Amazon ervice Quotas 控制台中查看资源限制,也可以直接使用 list-service-quotas Amazon CLI 命令查看资源限制。有关 Amazon 服务限额的更多信息,请参阅服务限额用户指南中的请求增加服务限额

您还可以使用 Amazon 支持中心请求增加暖池限额。有关按地区划分的可用实例类型的列表,请参阅 Amazon SageMaker 定价,然后在按需定价表中选择培训

如何使用 SageMaker 托管的温池

您可以通过 SageMaker Python 软件开发工具包、Amazon SageMaker 控制台或低级 API 使用 SageMaker 托管的温池。管理员可以选择使用 sagemaker:KeepAlivePeriod 条件键来进一步限定某些用户或组的 KeepAlivePeriodInSeconds 上限。

使用 SageMaker Python 开发工具包

使用 SageMaker Python 软件开发工具包创建、更新或终止温池。

注意

此功能在 SageMaker Python SDK v2.110.0 及更高版本中可用。

创建暖池

要创建温池,请使用 SageMaker Python SDK 创建一个keep_alive_period_in_seconds值大于 0 的估计器并调用。fit()训练作业完成后,暖池将保留。有关训练脚本和估算器的更多信息,请参阅使用 Pyth SageMaker on SDK 训练模型。如果您的脚本未创建暖池,请参阅暖池创建以查看可能的说明。

import sagemaker from sagemaker import get_execution_role from sagemaker.tensorflow import TensorFlow # Creates a SageMaker session and gets execution role session = sagemaker.Session() role = get_execution_role() # Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='2.2', py_version='py37', job_name='my-training-job-1', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 1, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, ) # Starts a SageMaker training job and waits until completion estimator.fit('s3://my_bucket/my_training_data/')

接下来,创建第二个匹配的训练作业。在此示例中,我们创建了 my-training-job-2,它具有与 my-training-job-1 匹配的所有必要属性,但具有用于实验的其他超参数。第二个训练作业重用暖池,其启动速度比第一个训练作业快。以下代码示例使用 Tensorflow 估算器。暖池功能可以与 Amazon 上运行的任何训练算法一起使用 SageMaker。有关需要匹配的属性的更多信息,请参阅匹配的训练作业

# Creates an example estimator estimator = TensorFlow( ... entry_point='my-training-script.py', source_dir='code', role=role, model_dir='model_dir', framework_version='py37', py_version='pyxy', job_name='my-training-job-2', instance_type='ml.g4dn.xlarge', instance_count=1, volume_size=250, hyperparameters={ "batch-size": 512, "epochs": 2, "learning-rate": 1e-3, "beta_1": 0.9, "beta_2": 0.999, }, keep_alive_period_in_seconds=1800, ) # Starts a SageMaker training job and waits until completion estimator.fit('s3://my_bucket/my_training_data/')

检查两个训练作业的暖池状态,以确认 my-training-job-1 的暖池为 Reusedmy-training-job-2 的暖池为 InUse

注意

训练作业名称具有日期/时间后缀。示例训练作业名称 my-training-job-1my-training-job-2 应替换为实际的训练作业名称。您可以使用 estimator.latest_training_job.job_name 命令来获取实际的训练作业名称。

session.describe_training_job('my-training-job-1') session.describe_training_job('my-training-job-2')

describe_training_job 的结果提供了有关给定训练作业的所有详细信息。找到 WarmPoolStatus 属性以检查有关训练作业的暖池的信息。您的输出应类似于以下示例:

# Warm pool status for training-job-1 ... 'WarmPoolStatus': {'Status': 'Reused', 'ResourceRetainedBillableTimeInSeconds': 1000, 'ReusedByName': my-training-job-2} ... # Warm pool status for training-job-2 ... 'WarmPoolStatus': {'Status': 'InUse'} ...

更新暖池

在训练作业完成且暖池状态为 Available 时,便能更新 KeepAlivePeriodInSeconds 值。

session.update_training_job(job_name, resource_config={"KeepAlivePeriodInSeconds":3600})

终止暖池

要手动终止暖池,请将 KeepAlivePeriodInSeconds 值设置为 0。

session.update_training_job(job_name, resource_config={"KeepAlivePeriodInSeconds":0})

当暖池超过指定的 KeepAlivePeriodInSeconds 值或有对集群的补丁更新时,暖池将自动终止。

使用亚马逊 SageMaker控制台

通过此控制台,您可以创建暖池、释放暖池或查看特定训练作业的暖池状态和计费时间。您还可以查看哪个匹配的训练作业重用了暖池。

  1. 打开 Amazon SageMaker 控制台,然后从导航窗格中选择培训作业。如果适用,每个训练作业的暖池状态都将显示在暖池状态列中,活动暖池的剩余时间将显示在剩余时间列中。

  2. 要从控制台创建使用暖池的训练作业,请选择创建训练作业。之后,请务必在配置训练作业资源时为保持活动期字段指定一个值。此值必须是介于 1 和 3600 之间的整数,它表示持续时间(以秒为单位)。

  3. 要从控制台释放暖池,请选择特定的训练作业,然后从操作下拉菜单中选择释放集群

  4. 要查看有关暖池的更多信息,请选择训练作业名称。在作业详细信息页面中,向下滚动到暖池状态部分以查找暖池状态、暖池状态为 Available 的剩余时间、暖池计费秒数以及已重用暖池的训练作业的名称(如果暖池状态为 Reused)。

使用低级 API SageMaker

SageMaker 通过 API 或 Amazon CLI 使用 SageMaker 托管温池。

SageMaker API

使用 SageMaker API 使用以下命令设置 SageMaker 托管的温池:

Amazon CLI

使用 Amazon CLI 使用以下命令设置 SageMaker 托管的温池:

IAM 条件键

管理员可以选择使用sagemaker:KeepAlivePeriod条件键进一步限制某些用户或群组的KeepAlivePeriodInSeconds限制。 SageMaker 托管的温池的KeepAlivePeriodInSeconds值限制为 3600 秒(60 分钟),但管理员可以根据需要降低此限制。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceKeepAlivePeriodLimit", "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob" ], "Resource": "*", "Condition": { "NumericLessThanIfExists": { "sagemaker:KeepAlivePeriod": 1800 } } } ] }

有关更多信息,请参阅《服务授权参考》 SageMaker中的 Amazon 条件密钥

注意事项

使用 SageMaker 托管温池时,请考虑以下事项。

  • SageMaker 托管的温池不能用于异构集群训练。

  • SageMaker 托管的温池不能用于竞价型实例。

  • SageMaker 托管的温池的KeepAlivePeriodInSeconds值限制为 3600 秒(60 分钟)。

  • 如果暖池继续成功匹配指定 KeepAlivePeriodInSeconds 值内的训练作业,则集群最多只能继续运行 28 天。