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

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

将调试器与自定义训练容器一起使用

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

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

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

提示

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

准备构建自定义训练容器

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

├── 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 训练脚本启用了调试器的修改版本. 此外,该示例还说明了如何使用调试程序内置规则检测训练问题(如梯度消失问题),以及如何使用调试程序试验功能调用和分析保存的张量。

创建和配置码头文件

打开 SageMaker JupyterLab 并创建一个新文件夹,debugger_custom_container_test_folder,以保存训练脚本和Dockerfile. 下面的代码示例是Dockerfile,其中包括基本的码头构建赞扬。将以下代码粘贴到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目录中,使用指定的algorithm_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()