将调试器用于自定义训练容器 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

将调试器用于自定义训练容器

Amazon SageMaker 调试器适用于您带给 Amazon SageMaker 的任何深度学习模型。这些区域有:Amazon CLI,SageMakerEstimatorAPI 和调试器 API 使您能够使用任何 Docker 基本映像来构建和自定义容器以训练模型。要将调试器与自定义容器一起使用,您需要对训练脚本进行最小的更改,以实现调试器钩子回调并从训练作业中检索张量。

您需要以下资源来使用调试器构建自定义容器。

有关将调试程序与自定义训练容器结合使用的端到端示例,请参阅以下示例笔记本。

提示

这个带调试器指南的自定义容器是调整您自己的训练容器指南向您详细介绍如何构建自定义培训容器并将其推送到 Amazon ECR。

准备构建自定义训练容器

要构建 docker 容器,文件的基本结构应如下所示:

├── debugger_custom_container_test_notebook.ipynb # a notebook to run python snippet codes └── debugger_custom_container_test_folder # this is a docker folder ├── your-training-script.py # your training script with Debugger hook └── Dockerfile # a Dockerfile to build your own container

将调试器挂钩注册到你的训练脚本

要调试模型训练,您需要在训练脚本中添加调试程序挂钩。

注意

此步骤是收集模型参数(输出张量)以调试模型训练所必需的。如果您只想监控和配置文件,则可跳过该挂钩注册步骤并排除debugger_hook_config构造估计器时的参数。

以下示例代码显示了使用 Keras resNet50 模型的训练脚本的结构以及如何将调试器挂接作为 Keras 回调函数传递以进行调试。要查找完整的训练脚本,请参阅使用 SageMaker 调试器挂钩的 TensorFlow 训练脚本.

# An example of training script (your-training-script.py) import tensorflow.compat.v2 as tf from tensorflow.keras.applications.resnet50 import ResNet50 import smdebug.tensorflow as smd def train(batch_size, epoch, model, hook): ... model.fit(X_train, Y_train, batch_size=batch_size, epochs=epoch, validation_data=(X_valid, Y_valid), shuffle=True, # smdebug modification: Pass the Debugger hook in the main() as a Keras callback callbacks=[hook]) def main(): parser=argparse.ArgumentParser(description="Train resnet50 cifar10") # hyperparameter settings parser.add_argument(...) args = parser.parse_args() model=ResNet50(weights=None, input_shape=(32,32,3), classes=10) # Add the following line to register the Debugger hook for Keras. hook=smd.KerasHook.create_from_json_file() # Start the training. train(args.batch_size, args.epoch, model, hook) if __name__ == "__main__": main()

有关为受支持的框架和算法注册调试器挂接的更多信息,请参阅 SMDebug 客户端库中的以下链接:

在以下示例笔记本的训练脚本中,您可以找到更多关于如何将调试器挂钩添加到训练脚本中并详细收集输出张量的示例:

  • 使用 TensorFlow 2.1 框架的脚本模式下的调试程序

    要查看在深度学习容器中与在脚本模式下使用调试程序之间的区别,请打开该笔记本并将其与前面的“深度学习容器 Tensorflow v2.1 中的调试程序”笔记本示例并排放置。

    在脚本模式下,挂钩配置部分将从您设置评估程序的脚本中删除。而将调试程序挂钩功能合并到训练脚本中,脚本模式下的 TensorFlow Keras resNet 训练脚本. 训练脚本在所需的 Tensorflow Keras 环境中导入 smdebug 库以与 Tensorflow ResNet50 算法进行通信。它还会手动实施 smdebug 挂钩功能,方法是在 train 函数中添加 callbacks=[hook] 参数(第 49 行),并添加通过 SageMaker Python 开发工具包提供的手动挂钩配置(第 89 行)。

    该脚本模式示例在 TF 2.1 框架中运行训练作业,以便与 TF 2.1 示例中的零脚本更改进行直接比较。在脚本模式下设置调试程序的好处是可以灵活地选择框架版本未涵盖的框架版本。AmazonDeep Learning Containers。

  • 以脚本模式在 PyTorch 容器中使用 Amazon SageMaker 调试程序

    该笔记本在 PyTorch v1.3.1 框架中以脚本模式启用调试程序。SageMaker 容器支持 PyTorch v1.3.1,该示例显示了如何修改训练脚本的详细信息。

    默认情况下,SageMaker PyTorch 评估程序已处于脚本模式下。在该笔记本中,在评估程序配置中不包含激活 script_mode 的行。

    本笔记本显示了更改的详细步骤原始 PyTorch 训练脚本启用了调试器的修改版本. 此外,该示例还说明了如何使用调试程序内置规则检测训练问题(如梯度消失问题),以及如何使用调试程序试验功能调用和分析保存的张量。

创建和配置 Dockerfile

打开 SageMaker JupyterLab 并创建一个新文件夹,debugger_custom_container_test_folder在此示例中,要保存训练脚本并Dockerfile. 下面的代码示例是Dockerfile这包括必不可少的 docker 构建赞扬。将以下代码粘贴到Dockerfile并将其保存到文本文件。将训练脚本上传到同一个文件夹。

# Specify a docker base image FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3 RUN /usr/bin/python3 -m pip install --upgrade pip RUN pip install --upgrade protobuf # Install required packages to enable the SageMaker Python SDK and the smdebug library RUN pip install sagemaker-training RUN pip install smdebug CMD ["bin/bash"]

如果你想使用预构建的Amazon深度学习容器镜像,请参阅AvailableAmazonDeep Learning Containers 映像.

构建自定义培训容器并将其推送到亚马逊 ECR

创建测试笔记本,debugger_custom_container_test_notebook.ipynb,并在笔记本单元中运行以下代码。这将访问debugger_byoc_test_docker目录中,使用指定的构建 dockeralgorithm_name,然后将码头容器推送到您的亚马逊 ECR 中。

import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'sagemaker-debugger-mnist-byoc-tf2' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) !docker build -t $ecr_repository docker !$(aws ecr get-login --region $region --registry-ids $account_id --no-include-email) !aws ecr create-repository --repository-name $ecr_repository !docker tag {ecr_repository + tag} $byoc_image_uri !docker push $byoc_image_uri
提示

如果您使用其中一个Amazon深度学习容器基础映像,运行以下代码登录 Amazon ECR 并访问深度学习容器映像存储库。

! aws ecr get-login-password --region {region} | docker login --username Amazon --password-stdin 763104351884.dkr.ecr.us-east-1.amazonaws.com

使用自定义训练容器运行和调试培训作业

在构建码头容器并将其推送到 Amazon ECR 之后,请使用训练脚本和调试器特定参数配置 SageMaker 估计器。执行之后estimator.fit(),调试器将收集输出张量、监控它们并检测训练问题。使用保存的张量,你可以使用smdebug核心功能和工具。使用 Amazon CloudWatch Events 配置调试器规则监控流程的工作流程和Amazon Lambda,只要调试器规则发现训练问题,就可以自动执行停止训练作业流程。

import sagemaker from sagemaker.estimator import Estimator from sagemaker.debugger import Rule, DebuggerHookConfig, CollectionConfig, rule_configs profiler_config=ProfilerConfig(...) debugger_hook_config=DebuggerHookConfig(...) rules=[ Rule.sagemaker(rule_configs.built_in_rule()), ProfilerRule.sagemaker(rule_configs.BuiltInRule()) ] estimator=Estimator( image_uri=byoc_image_uri, entry_point="./debugger_custom_container_test_folder/your-training-script.py" role=sagemaker.get_execution_role(), base_job_name='debugger-custom-container-test', instance_count=1, instance_type='ml.p3.2xlarge', # Debugger-specific parameters profiler_config=profiler_config, debugger_hook_config=debugger_hook_config, rules=rules ) # start training estimator.fit()