配置 调试程序 挂钩以保存张量 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

配置 调试程序 挂钩以保存张量

张量 是从每次训练迭代的向后和向前传递更新的参数的数据收集,而 调试程序 收集输出张量来分析训练作业的状态。Amazon SageMaker 调试程序 和 CollectionConfig API 操作提供将张量分组到DebuggerHookConfig集合中并将张量保存到目标 S3 存储桶的方法。

注意

默认情况下,对于所有 SageMaker 训练作业,调试程序 每 500 个步骤从训练作业收集损失和准确性输出标量,而不在 调试程序 评估程序中指定任何特定于 SageMaker 的参数。调试程序 将输出数据保存在默认 S3 存储桶中。默认 S3 存储桶 URI 的格式为 s3://sagemaker-<region>-<12digit_account_id>/<training-job-name>/debug-output/

在构造 SageMaker 评估程序时,通过指定挂钩配置参数 调试程序 来启用 debugger_hook_config。 以下步骤包括有关如何使用 debugger_hook_configCollectionConfig API 操作设置 DebuggerHookConfig 以从训练作业中提取张量并保存这些张量的示例。如果您使用 调试程序 支持的 AWS 容器进行零脚本更改,则可以直接运行训练作业,而无需更改训练脚本。您还可以将 调试程序 用于使用脚本模式在任何其他 调试程序 支持的 AWS 容器中运行的训练作业,并对训练脚本进行最少的更改。

使用收集 API 操作配置 调试程序 张量集合

使用 CollectionConfig API 操作配置张量集合。如果使用 调试程序 支持的深度学习框架和机器学习算法,则 调试程序 提供参数的各种正则表达式(正则表达式)的预构建张量集合。如以下示例代码中所示,添加要调试的内置张量集合。

from sagemaker.debugger import CollectionConfig collection_configs=[ CollectionConfig(name="weights"), CollectionConfig(name="gradients") ]

上述集合将设置 调试程序 挂钩,以便根据默认 "save_interval" 值每 500 个步骤保存张量。

有关可用 调试程序 内置集合的完整列表,请参阅 调试程序 内置集合

如果要自定义内置集合(例如,更改保存间隔和张量正则表达式),请使用以下 CollectionConfig 模板调整参数。

from sagemaker.debugger import CollectionConfig collection_configs=[ CollectionConfig( name="tensor_collection", parameters={ "key_1": "value_1", "key_2": "value_2", ... "key_n": "value_n" } ) ]

有关可用参数键的更多信息,请参阅 中的 CollectionConfigAmazon SageMaker Python SDK。例如,以下代码示例说明如何在不同的训练阶段调整“损失”张量的收集保存间隔:在训练阶段每 100 个步骤保存损失,在验证阶段每 10 个步骤保存损失。

from sagemaker.debugger import CollectionConfig collection_configs=[ CollectionConfig( name="losses", parameters={ "train.save_interval": "100", "eval.save_interval": "10" } ) ]
提示

此张量集合配置对象可用于 DebuggerHookConfigRule (规则) API 操作。

配置 调试程序 挂钩以保存张量

使用 DebuggerHookConfig 类通过您在上一步中创建的 对象来创建 debugger_hook_config 对象。collection_configs

from sagemaker.debugger import DebuggerHookConfig debugger_hook_config=DebuggerHookConfig( collection_configs=collection_configs )

调试程序 将模型训练输出张量保存到默认 S3 存储桶中。默认 S3 存储桶 URI 的格式为 s3://sagemaker-<region>-<12digit_account_id>/<training-job-name>/debug-output/.

如果您要指定确切的 S3 存储桶 URI,请使用以下代码示例:

from sagemaker.debugger import DebuggerHookConfig debugger_hook_config=DebuggerHookConfig( s3_output_path="specify-your-s3-bucket-uri" collection_configs=collection_configs )

有关更多信息,请参阅Amazon SageMaker Python SDK中的DebuggerHookConfig

用于配置调试程序挂钩的示例笔记本和代码示例

在以下部分中,提供了有关如何使用调试程序挂钩保存、访问和可视化输出张量的笔记本和代码示例。

张量可视化示例笔记本

以下两个笔记本示例显示了 Amazon SageMaker 调试程序 可视化张量的高级用法。 调试程序 提供了训练深度学习模型的透明视图。

  • 使用 MXNet 的 SageMaker Studio 笔记本中的交互式张量分析

    该笔记本示例说明了如何使用Amazon SageMaker 调试程序可视化保存的张量。通过可视化张量,您可以在训练深度学习算法时轻松查看张量值如何变化。此笔记本包括具有配置错误的神经网络的训练作业,并使用 Amazon SageMaker 调试程序 聚合和分析张量,包括梯度、激活输出和权重。例如,下图显示了出现梯度消失问题的卷积层的梯度分布情况。

    
                        该图显示了出现梯度消失问题的卷积层的梯度分布情况

    该笔记本还说明了正确的初始超参数设置如何生成相同的张量分布图,从而改进了训练过程。

  • 从 MXNet 模型训练可视化和调试张量

    该笔记本示例说明了如何使用 Amazon SageMaker 调试程序从 MXNet Gluon 模型训练作业中保存张量并进行可视化。它说明调试程序设置为将所有张量保存到 Amazon S3 存储桶,并检索可视化的 ReLu 激活输出。下图显示了 ReLu 激活输出的三维可视化。颜色方案设置为蓝色以表示接近于 0 的值,设置为黄色以表示接近于 1 的值。

    
                        ReLU 激活输出的可视化

    在此笔记本中,从 导入的 TensorPlottensor_plot.py设计用于绘制卷积神经网络 (CNNs这些网络将二维图像作为输入。笔记本附带的tensor_plot.py脚本使用 检索张量调试程序并可视化 CNN。您可以在 SageMaker Studio 上运行该笔记本以重现张量可视化内容,并为其实施您自己的卷积神经网络模型。

  • 使用 MXNet 的SageMaker笔记本中的实时张量分析

    此示例将指导您安装在 Amazon SageMaker 训练作业中发出张量所需的组件,并在训练运行时使用 调试程序 API 操作访问这些张量。Gluon CNN 模型在 Fashion MNIST 数据集上训练。当作业正在运行时,您将看到 如何从 100 个批处理中的每个批处理调试程序中检索第一个卷积层的激活输出并对其进行可视化。此外,这将向您演示如何在作业完成后可视化权重。

使用调试程序内置集合保存张量

您可以使用 CollectionConfig API 使用内置的张量集合,并使用 DebuggerHookConfig API 保存这些集合。以下示例说明如何使用调试程序挂钩配置的默认设置来构造 SageMaker TensorFlow评估程序。您还可以将此项用于 MXNet、PyTorch 和 XGBoost 评估程序。

注意

在以下示例代码中, 的 s3_output_path 参数DebuggerHookConfig是可选的。如果您未指定它,则 将张量调试程序保存在 s3://<output_path>/debug-output/,其中 <output_path> 是SageMaker训练作业的默认输出路径。例如:

"s3://sagemaker-us-east-1-111122223333/sagemaker-debugger-training-YYYY-MM-DD-HH-MM-SS-123/debug-output"
import sagemaker from sagemaker.tensorflow import TensorFlow from sagemaker.debugger import DebuggerHookConfig, CollectionConfig # use Debugger CollectionConfig to call built-in collections collection_configs=[ CollectionConfig(name="weights"), CollectionConfig(name="gradients"), CollectionConfig(name="losses"), CollectionConfig(name="biases") ] # configure Debugger hook # set a target S3 bucket as you want sagemaker_session=sagemaker.Session() BUCKET_NAME=sagemaker_session.default_bucket() LOCATION_IN_BUCKET='debugger-built-in-collections-hook' hook_config=DebuggerHookConfig( s3_output_path='s3://{BUCKET_NAME}/{LOCATION_IN_BUCKET}'. format(BUCKET_NAME=BUCKET_NAME, LOCATION_IN_BUCKET=LOCATION_IN_BUCKET), collection_configs=collection_configs ) # construct a SageMaker TensorFlow estimator sagemaker_estimator=TensorFlow( entry_point='directory/to/your_training_script.py', role=sm.get_execution_role(), base_job_name='debugger-demo-job', train_instance_count=1, train_instance_type="ml.m4.xlarge", framework_version="2.3.0", py_version="py37", # debugger-specific hook argument below debugger_hook_config=hook_config ) sagemaker_estimator.fit()

要查看调试程序内置集合的列表,请参阅调试程序内置集合

使用调试程序修改过的内置集合保存张量

您可以使用 调试程序 API 操作修改CollectionConfig内置集合。以下示例说明如何调整内置losses集合并构建 SageMaker TensorFlow评估程序。您还可以将此参数用于 MXNet、PyTorch 和 XGBoost 评估程序。

import sagemaker from sagemaker.tensorflow import TensorFlow from sagemaker.debugger import DebuggerHookConfig, CollectionConfig # use Debugger CollectionConfig to call and modify built-in collections collection_configs=[ CollectionConfig( name="losses", parameters={"save_interval": "50"})] # configure Debugger hook # set a target S3 bucket as you want sagemaker_session=sagemaker.Session() BUCKET_NAME=sagemaker_session.default_bucket() LOCATION_IN_BUCKET='debugger-modified-collections-hook' hook_config=DebuggerHookConfig( s3_output_path='s3://{BUCKET_NAME}/{LOCATION_IN_BUCKET}'. format(BUCKET_NAME=BUCKET_NAME, LOCATION_IN_BUCKET=LOCATION_IN_BUCKET), collection_configs=collection_configs ) # construct a SageMaker TensorFlow estimator sagemaker_estimator=TensorFlow( entry_point='directory/to/your_training_script.py', role=sm.get_execution_role(), base_job_name='debugger-demo-job', train_instance_count=1, train_instance_type="ml.m4.xlarge", framework_version="2.3.0", py_version="py37", # debugger-specific hook argument below debugger_hook_config=hook_config ) sagemaker_estimator.fit()

有关CollectionConfig参数的完整列表,请参阅 调试程序 CollectionConfig API。

使用调试程序自定义集合保存张量

您还可以保存减少的张量数而不是完整的张量集(例如,如果您要减少 Amazon S3 存储桶中保存的数据量)。以下示例说明如何自定义调试程序挂钩配置以指定要保存的目标张量。您可以将它用于 TensorFlow、MXNet、PyTorch 和 XGBoost 评估程序。

import sagemaker from sagemaker.tensorflow import TensorFlow from sagemaker.debugger import DebuggerHookConfig, CollectionConfig # use Debugger CollectionConfig to create a custom collection collection_configs=[ CollectionConfig( name="custom_activations_collection", parameters={ "include_regex": "relu|tanh", # Required "reductions": "mean,variance,max,abs_mean,abs_variance,abs_max" }) ] # configure Debugger hook # set a target S3 bucket as you want sagemaker_session=sagemaker.Session() BUCKET_NAME=sagemaker_session.default_bucket() LOCATION_IN_BUCKET='debugger-custom-collections-hook' hook_config=DebuggerHookConfig( s3_output_path='s3://{BUCKET_NAME}/{LOCATION_IN_BUCKET}'. format(BUCKET_NAME=BUCKET_NAME, LOCATION_IN_BUCKET=LOCATION_IN_BUCKET), collection_configs=collection_configs ) # construct a SageMaker TensorFlow estimator sagemaker_estimator=TensorFlow( entry_point='directory/to/your_training_script.py', role=sm.get_execution_role(), base_job_name='debugger-demo-job', train_instance_count=1, train_instance_type="ml.m4.xlarge", framework_version="2.3.0", py_version="py37", # debugger-specific hook argument below debugger_hook_config=hook_config ) sagemaker_estimator.fit()

有关CollectionConfig参数的完整列表,请参阅 调试程序 CollectionConfig