

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# カスタムトレーニングで Debugger を使用する
<a name="debugger-bring-your-own-container"></a>

Amazon SageMaker Debugger は、Amazon SageMaker AI に持ち込むすべての深層学習モデルで使用できます。 AWS CLI、SageMaker AI `Estimator` API、およびデバッガー APIs を使用すると、任意の Docker ベースイメージを使用してコンテナを構築およびカスタマイズしてモデルをトレーニングできます。カスタマイズされたコンテナと共にデバッガーを使うには、トレーニングスクリプトに最小限の変更を加えてデバッガーフックコールバックを実装し、トレーニングジョブからテンソルを取得する必要があります。以下のセクションでは、カスタムのトレーニングコンテナでデバッガーを使用する方法を説明します。

デバッガーと一体のカスタマイズされたコンテナを構築するには、次のリソースが必要です。
+ [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable)
+ [SMDebug オープンソースクライアントライブラリ](https://github.com/awslabs/sagemaker-debugger)
+ 任意の Docker ベースイメージ
+ デバッガーフックが登録されたトレーニングスクリプト - デバッガーフックをトレーニングスクリプトに登録する方法の詳細については、「[デバッガーフックをトレーニングスクリプトに登録する](#debugger-script-mode)」を参照してください。

カスタムトレーニングコンテナと共にデバッガーを使用するエンドツーエンドの例については、次のサンプルノートブックを参照してください。
+ [カスタムトレーニングコンテナを構築し、デバッガーでトレーニングジョブをデバッグする](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/build_your_own_container_with_debugger/debugger_byoc.html)

**ヒント**  
このカスタムコンテナとデバッガーのガイドは、カスタムトレーニングコンテナを構築し、Amazon ECR にプッシュする方法を具体的に説明する「[独自のトレーニングコンテナの適応](adapt-training-container.md)」ガイドの拡張版です。

## カスタムトレーニングコンテナ構築の準備をする
<a name="debugger-bring-your-own-container-1"></a>

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
```

## デバッガーフックをトレーニングスクリプトに登録する
<a name="debugger-script-mode"></a>

モデルトレーニングをデバッグするには、トレーニングスクリプトにデバッガーフックを追加する必要があります。

**注記**  
このステップは、モデルトレーニングをデバッグするためのモデルパラメータ (出力テンソル) を収集するために必要です。モニタリングとプロファイリングのみを行う場合は、このフック登録ステップを省略でき、推定器を構築するときに `debugger_hook_config` パラメータを除外できます。

次のサンプルコードは、Keras ResNet50 モデルを使用したトレーニングスクリプトの構造と、デバッグのための Keras コールバックとしてデバッガーフックを渡す方法を示しています。完全なトレーニングスクリプトについては、「[SageMaker デバッガーフックを使用した TensorFlow トレーニングスクリプト](https://github.com/aws/amazon-sagemaker-examples/blob/master/sagemaker-debugger/build_your_own_container_with_debugger/docker/tf_keras_resnet_byoc.py)」を参照してください。

```
# 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 クライアントライブラリの次のリンクを参照してください。
+ [SMDebug TensorFlow フック](https://github.com/awslabs/sagemaker-debugger/blob/master/docs/tensorflow.md)
+ [SMDebug PyTorch フック](https://github.com/awslabs/sagemaker-debugger/blob/master/docs/pytorch.md)
+ [SMDebug MXNet フック](https://github.com/awslabs/sagemaker-debugger/blob/master/docs/mxnet.md)
+ [SMDebug XGBoost フック](https://github.com/awslabs/sagemaker-debugger/blob/master/docs/xgboost.md)

次のサンプルノートブックのトレーニングスクリプトには、デバッガーフックをトレーニングスクリプトに追加し、詳細な出力テンソルを収集する方法についてのより多くの例が含まれています。
+ [TensorFlow 2.1 フレームワークを使用したスクリプトモードのデバッガー](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/tensorflow2/tensorflow2_keras_custom_container/tf2-keras-custom-container.html)

  Deep Learning Containers での Debugger の使用とスクリプトモードでの Debugger の使用の違いを確認するには、このノートブックを開き、[Deep Learning Containers TensorFlow v2.1 での前の Debugger のノートブック例](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/tensorflow2/tensorflow2_zero_code_change/tf2-keras-default-container.html)を並べて配置してください。

   スクリプトモードでは、フック設定部分は、推定器を設定するスクリプトから削除されます。代わりに、 デバッガーフック機能は、トレーニングスクリプトである[スクリプトモードの TensorFlow Keras ResNet トレーニングスクリプト](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/sagemaker-debugger/tensorflow2/tensorflow2_keras_custom_container/src/tf_keras_resnet_byoc.py)にマージされます。トレーニングスクリプトにより、TensorFlow ResNet50 アルゴリズムと通信するために必要な TensorFlow Keras 環境に `smdebug` ライブラリがインポートされます。また、`train` 関数内に `callbacks=[hook]` 引数を追加し (49 行目)、SageMaker Python SDK で提供されている手動フック設定 (89 行目) を追加することで、`smdebug` フック機能も手動で実装します。

  このスクリプトモードの例では、TF 2.1 の例のスクリプト変更なしと直接比較するために TF 2.1 フレームワークでトレーニングジョブを実行します。スクリプトモードでデバッガーを設定する利点は、 AWS Deep Learning Containers でカバーされていないフレームワークバージョンを柔軟に選択できることです。
+ [PyTorch コンテナでスクリプトモードの Amazon SageMaker デバッガーを使用する](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker-debugger/pytorch_custom_container)

  このノートブックは、PyTorch v1.3.1 フレームワークでスクリプトモードのデバッガーを有効にします。PyTorch v1.3.1 は SageMaker AI コンテナのサポート対象であり、この例では、トレーニングスクリプトを変更する方法の詳細を示しています。

  SageMaker AI PyTorch 推定器は、デフォルトで既にスクリプトモードになっています。ノートブックでは、`script_mode` をアクティブ化する行が推定器の設定に含まれていません。

  このノートブックでは、[元の PyTorch トレーニングスクリプト](https://github.com/pytorch/examples/blob/master/mnist/main.py)をデバッガーを有効にした修正バージョンに変更する詳細なステップを示しています。さらに、この例では、デバッガーの組み込みルールを使って、勾配消失などのトレーニングの問題を検出する方法と、保存されたテンソルの呼び出しと分析を行うデバッガーのトライアル機能を示しています。

## Dockerfile を作成して設定する
<a name="debugger-bring-your-own-container-2"></a>

SageMaker AI JupyterLab を開き、新しいフォルダ (この例では `debugger_custom_container_test_folder`) を作成して、トレーニングスクリプトと `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 深層学習コンテナイメージ](https://aws.amazon.com/releasenotes/available-deep-learning-containers-images/)」を参照してください。

## カスタムトレーニングイメージを構築して Amazon ECR にプッシュする
<a name="debugger-bring-your-own-container-3"></a>

テストノートブック `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
```

## カスタムトレーニングコンテナを使ってトレーニングジョブを実行してデバッグする
<a name="debugger-bring-your-own-container-4"></a>

Docker コンテナを構築して Amazon ECR にプッシュしたら、トレーニングスクリプトとデバッガー固有パラメータを使って SageMaker AI 推定器を設定します。`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()
```