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

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

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

重要

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

工作方式

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

暖池生命周期

  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

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

最长暖池持续时间

单个训练作业的最大 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)

计费

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

注意

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

暖池资源限额

要开始使用,您必须先请求增加 SageMaker 托管的暖池的服务限额。暖池的默认资源限额为 0。

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

请求增加暖池限额

使用 Amazon 服务限额控制台请求增加暖池限额。

注意

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

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

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

  3. 搜索并选择 Amazon SageMaker

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

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

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

  7. 选择请求

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

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

如何使用 SageMaker 托管的暖池

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

使用 SageMaker Python SDK

使用 SageMaker Python SDK 创建、更新或终止暖池。

注意

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

创建暖池

要创建暖池,请使用 SageMaker Python SDK 创建一个 keep_alive_period_in_seconds 值大于 0 的估算器并调用 fit()。训练作业完成后,暖池将保留。有关训练脚本和估算器的更多信息,请参阅使用 SageMaker Python 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 值或有对集群的补丁更新时,暖池将自动终止。

使用 Amazon SageMaker 控制台

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

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

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

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

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

使用低级 SageMaker API

将 SageMaker 托管的暖池与 SageMaker API 或 Amazon CLI 结合使用。

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 } } } ] }

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

注意事项

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

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

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

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

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