使用 Debugger 和自定义训练容器 - 亚马逊 SageMaker AI

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

使用 Debugger 和自定义训练容器

Amazon SageMaker Debugger 可用于您引入 Amazon SageMaker AI 中的任何深度学习模型。借助 AWS CLI、SageMaker AI Estimator API 和 Debugger API,您能够使用任何 Docker 基本映像来构建和自定义容器以训练模型。要将 Debugger 与自定义容器结合使用,您只需对训练脚本进行极少的更改,以实施 Debugger 钩子回调并从训练作业中检索张量。以下部分介绍了如何使用 Debugger 和自定义训练容器。

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

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

提示

此带 Debugger 的自定义容器指南是对调整自己的训练容器指南的扩展,向您详细介绍如何构建自定义训练容器并将其推送到 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 钩子

要调试模型训练,您需要在训练脚本中添加 Debugger 钩子。

注意

此步骤是收集模型参数(输出张量)以调试模型训练所必需的。如果您只想进行监控和分析,则可以跳过此钩子注册步骤,并在构造估算器时排除 debugger_hook_config 参数。

以下示例代码显示了使用 Keras ResNet50 模型的训练脚本的结构,以及如何将 Debugger 钩子作为 Keras 回调传递用于调试。要查找完整的训练脚本,请参阅使用 SageMaker Debugger 钩子的 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()

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

在以下示例笔记本的训练脚本中,您可以找到更多示例,详细说明了如何将 Debugger 钩子添加到训练脚本和收集输出张量:

  • TensorFlow 2.1 框架中脚本模式下的 Debugger

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

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

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

  • 在脚本模式下,在 PyTorch 容器中使用 Amazon SageMaker Debugger

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

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

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

创建和配置 Dockerfile

打开您的 SageMaker AI 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"]

如果您要使用预构建的 AWS Deep Learning Container 映像,请参阅可用的 AWS Deep Learning Container 映像

创建并向 Amazon ECR 推送自定义训练映像

创建测试笔记本 debugger_custom_container_test_notebook.ipynb,然后在笔记本单元中运行以下代码。这将访问 debugger_byoc_test_docker 目录,使用指定的 algorithm_name 构建 Docker,然后将 Docker 容器推送到 Amazon 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
提示

如果您使用 AWS Deep Learning Container 基础映像之一,请运行以下代码登录以 Amazon ECR 并访问 Deep Learning Container 映像存储库。

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

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

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

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()