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

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

将 调试程序 与自定义训练容器结合使用

Amazon SageMaker 调试程序 可用于引入到 Amazon SageMaker 中的任何深度学习模型。借助 AWS CLI、SageMaker Estimator API 和 调试程序 APIs,您可以使用任何 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 回调传递以进行调试。要查找完整的训练脚本,请参阅使用 TensorFlow SageMaker 挂钩的 调试程序 训练脚本

# 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 训练脚本。训练脚本在所需的 smdebug Keras 环境中导入 TensorFlow 库以与 TensorFlow ResNet50 算法进行通信。它还会手动实施 smdebug 挂钩功能,方法是在 train 函数中添加 callbacks=[hook] 参数(第 49 行),并添加通过 SageMaker Python 开发工具包提供的手动挂钩配置(第 89 行)。

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

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

    此笔记本在 调试程序 v1.3.1 框架中以脚本模式启用 PyTorch。PyTorch 容器支持 SageMaker 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"]

如果要使用预构建的 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 后,请使用训练脚本和特定于 SageMaker 的参数配置 调试程序 评估程序。在执行 estimator.fit() 后,调试程序 将收集输出张量、监控它们并检测训练问题。通过使用保存的张量,您可以使用 smdebug 核心功能和工具进一步分析训练作业。使用 调试程序 和 Amazon CloudWatch Events 配置 AWS 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()