搭配自訂訓練容器使用偵錯工具 - Amazon SageMaker

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

搭配自訂訓練容器使用偵錯工具

Amazon SageMaker Debugger 適用於您帶到 Amazon 的任何深度學習模型 SageMaker。 AWS CLI、 SageMaker Estimator API和 Debugger APIs可讓您使用任何 Docker 基礎映像來建置和自訂容器來訓練模型。若要 Debugger 和自訂容器搭配使用,您需要對訓練指令碼進行最小的變更,才能實施 Debugger 勾點回呼,並從訓練任務擷取張量。下列各節將逐步說明如何將 Debugger 與自訂訓練容器搭配使用。

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

如需 end-to-end搭配自訂訓練容器使用 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_hook_config 參數。

下列範例程式碼顯示使用 Keras ResNet50 模型的訓練指令碼結構,以及如何將偵錯工具掛鉤傳遞為 Keras 回呼進行偵錯。若要尋找完整的訓練指令碼,請參閱TensorFlow 使用 SageMaker Debugger hook 的訓練指令碼

# 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用戶端程式庫中的下列連結:

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

  • 使用 TensorFlow 2.1 架構在指令碼模式下偵錯

    若要查看在深度學習容器和指令碼模式下使用 Debugger 之間的差異,請開啟此筆記本,並將其和先前的 Debugger 並排放入深度學習容器 TensorFlow v2.1 筆記本範例

    在指令碼模式下,勾點組態部分會從您設定估算器的指令碼中移除。反之,偵錯工具掛鉤功能會合併到訓練指令碼中,即 TensorFlow 指令碼模式 中的 Keras ResNet 訓練指令碼。訓練指令碼會在所需的 TensorFlow Keras 環境中匯入smdebug程式庫,以與 TensorFlow ResNet50 個演算法通訊。它還透過在train函數內新增callbacks=[hook]引數 (第 49 行),以及新增透過 SageMaker Python 提供的手動smdebug掛鉤組態 (第 89 行) 來手動實作掛鉤功能SDK。

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

  • 在指令碼模式下的 PyTorch 容器中使用 Amazon SageMaker Debugger

    此筆記本在 v1 PyTorch .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 深度學習容器映像,請參閱可用的 AWS 深度學習容器映像

建置自訂訓練映像並將其推送至 Amazon ECR

建立測試筆記本debugger_custom_container_test_notebook.ipynb,並在筆記本儲存格中執行下列程式碼。這將存取debugger_byoc_test_docker目錄、使用指定的 建置 Dockeralgorithm_name,並將 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,請使用訓練指令碼和 Debugger 特定參數來設定 SageMaker 估算器。在執行 estimator.fit() 之後,Debugger 會收集並監控輸出張量,然後偵測訓練問題。使用儲存的張量,您可以使用 smdebug 核心功能和工具,進一步分析訓練任務。使用 Amazon CloudWatch Events 和 設定 Debugger 規則監控程序的工作流程 AWS Lambda,只要 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()