Debugger 和自訂訓練容器搭配使用 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Debugger 和自訂訓練容器搭配使用

Amazon SageMaker 調試器可用於您帶到 Amazon 的任何深度學習模型 SageMaker。API 和偵錯工具 SageMaker Estimator API 可讓您使用任何 Docker 基礎映像檔來建置和自訂容器,以訓練模型。 AWS CLI若要 Debugger 和自訂容器搭配使用,您需要對訓練指令碼進行最小的變更,才能實施 Debugger 勾點回呼,並從訓練任務擷取張量。

您需要下列資源,才能使用 Debugger 建置自訂容器。

end-to-end 如需搭配自訂訓練容器使用偵錯工具的範例,請參閱下列範例筆記本。

提示

使用 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 ResNet 50 模型的訓練指令碼結構,以及如何將偵錯工具掛接傳遞為 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()

如需註冊支援架構和演算法之 SageMaker Debugger 勾點的詳細資訊,請參閱 SMDebug 用戶端程式庫中的下列連結:

在下列範例筆記本的訓練指令碼中,您可以找到更多有關如何將 Debugger 勾點新增至訓練指令碼,並收集詳細輸出張量的範例:

  • 使用 TensorFlow 2.1 框架在腳本模式下進行調試

    若要查看在深度學習容器和指令碼模式中使用偵錯工具之間的差異,請開啟此筆記本,然後將它和先前的除錯工具並排放入深度學習容器 TensorFlow v2.1 筆記本範例中

    在指令碼模式下,勾點組態部分會從您設定估算器的指令碼中移除。相反地,偵錯工具掛接功能會合併到訓練指令碼中,即指令碼模式下的 TensorFlow Keras ResNet 訓練指令碼。訓練指令碼會在必要的 TensorFlow Keras 環境中匯入程式smdebug庫,以便與 TensorFlow ResNet 50 演算法進行通訊。它還通過在smdebugtraincallbacks=[hook]數內添加參數(在第 49 行)以及添加通過 SageMaker Python SDK 提供的手動鉤子配置(第 89 行)來手動實現鉤子功能。

    此指令碼模式範例在 TF 2.1 架構中執行訓練任務,可直接與 TF 2.1 範例中完全不變更指令碼做比較。在指令碼模式中設定偵錯工具的好處是可以彈性選擇 AWS Deep Learning Containers 未涵蓋的架構版本。

  • 在指令碼模式下在 PyTorch 容器中使用 Amazon SageMaker 偵錯工具

    此筆記本在 PyTorch v1.3.1 框架中以腳本模式啟用調試器。 PyTorch SageMaker 容器支援 v1.3.1,此範例顯示如何修改訓練指令碼的詳細資訊。

    預設情況下, SageMaker PyTorch 估算器已經處於指令碼模式。在筆記本中,啟用 script_mode 的那一行程式碼並未包含在估算器組態中。

    此筆記本顯示將原始 PyTorch 訓練指令碼變更為已修改版本以啟用偵錯工具的詳細步驟。此外,這個範例會顯示如何使用 Debugger 內建規則,來偵測消失梯度問題之類的訓練問題,以及 Debugger 試用功能,來呼叫和分析儲存的張量。

建立並設定一個 Dockerfile

debugger_custom_container_test_folder在此範例中,開啟您的 SageMaker JupyterLab 並建立新資料夾,以儲存訓練指令碼和Dockerfile。下列程式碼範例是一個包含基本 Docker 建置命令的 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"]

如果您想要使用預先建置的 AWS Deep Learning Containers 映像檔,請參閱可用的 AWS 深度學習容器映像檔

建置自訂訓練容器並將其推送至 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 深度學習容器基礎映像,請執行下列程式碼登入 Amazon ECR 並存取深度學習容器映像存放庫。

! 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() 之後,Debugger 會收集並監控輸出張量,然後偵測訓練問題。使用儲存的張量,您可以使用 smdebug 核心功能和工具,進一步分析訓練任務。使用 Amazon E CloudWatch vents 設定偵錯程式規則監控程序的工作流程 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()