本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Debugger 和自訂訓練容器搭配使用
Amazon SageMaker 調試器可用於您帶到 Amazon 的任何深度學習模型 SageMaker。API 和偵錯工具 SageMaker Estimator
API 可讓您使用任何 Docker 基礎映像檔來建置和自訂容器,以訓練模型。 AWS CLI若要 Debugger 和自訂容器搭配使用,您需要對訓練指令碼進行最小的變更,才能實施 Debugger 勾點回呼,並從訓練任務擷取張量。
您需要下列資源,才能使用 Debugger 建置自訂容器。
您選擇的 Docker 基礎映像
已註冊 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 演算法進行通訊。它還通過在smdebug
train
函callbacks=[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()