

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

# TensorFlow トレーニングスクリプトを適応させる
<a name="debugger-modify-script-tensorflow"></a>

モデル出力テンソルを収集を開始し、トレーニングの問題をデバッグするには、TensorFlow トレーニングスクリプトに次の変更を加えます。

**SageMaker AI 内でジョブをトレーニングするためのフックを作成する**

```
import smdebug.tensorflow as smd

hook=smd.get_hook(hook_type="keras", create_if_not_exists=True)
```

これにより、SageMaker トレーニングジョブを開始するときにフックが作成されます。[SageMaker Python SDK を使用して Debugger でトレーニングジョブを開始する](debugger-configuration-for-debugging.md) で任意の `DebuggerHookConfig`、`TensorBoardConfig`、または `Rules` のいずれかを推定器に組み込んでトレーニングジョブを起動すると、SageMaker AI は `smd.get_hook` メソッドよって取得される JSON 設定ファイルをトレーニングインスタンスに追加します。推定器に設定 API が含まれていない場合、フックで検索できる設定ファイルは存在せず、関数は `None` を返すことに注意してください。

**(オプション) SageMaker AI 以外のジョブをトレーニングするためのフックを作成する**

ローカルモードでトレーニングジョブを実行する際に、SageMaker Notebook インスタンス、Amazon EC2 インスタンス、または独自のローカルデバイス上で直接実行する場合は、`smd.Hook` クラスを使用してフックを作成します。ただし、この方法ではテンソルコレクションの保存のみ可能で、TensorBoard の可視化に使用できます。SageMaker デバッガのビルトインルールはローカルモードでは動作しません。この場合も `smd.get_hook` メソッドは `None` を返します。

手動フックを作成する場合は、以下のコードスニペットとロジックを使用してフックが `None` を返すかどうかを確認し、`smd.Hook` クラスを使用して手動フックを作成します。

```
import smdebug.tensorflow as smd

hook=smd.get_hook(hook_type="keras", create_if_not_exists=True) 

if hook is None:
    hook=smd.KerasHook(
        out_dir='/path/to/your/local/output/',
        export_tensorboard=True
    )
```

フック作成コードを追加したら、次の TensorFlow Keras のトピックに進みます。

**注記**  
SageMaker デバッガーは現在、TensorFlow Keras のみをサポートしています。

## TensorFlow Keras トレーニングスクリプトにフックを登録する
<a name="debugger-modify-script-tensorflow-keras"></a>

以下の手順では、フックとそのメソッドを使用して、モデルとオプティマイザから出力スカラーとテンソルを収集する方法を説明します。

1. フックのクラスメソッドで Keras モデルとオプティマイザをラップします。

   `hook.register_model()` メソッドはモデルを取得して各レイヤーを繰り返し処理し、「[SageMaker Python SDK を使用して Debugger でトレーニングジョブを開始する](debugger-configuration-for-debugging.md)」の設定で指定した正規表現と一致するテンソルを検索します。このフックメソッドで収集できるテンソルは、重み、バイアス、アクティベーションです。

   ```
   model=tf.keras.Model(...)
   hook.register_model(model)
   ```

1. オプティマイザを `hook.wrap_optimizer()` メソッドでラップします。

   ```
   optimizer=tf.keras.optimizers.Adam(...)
   optimizer=hook.wrap_optimizer(optimizer)
   ```

1. TensorFlow の eager モードでモデルをコンパイルします。

   各レイヤーの入出力テンソルなどのテンソルをモデルから収集するには、eager モードでトレーニングを実行する必要があります。そうでない場合は、SageMaker AI Debugger はテンソルを収集できなくなります。ただし、モデルの重み、バイアス、損失などの他のテンソルは、明示的に eager モードで実行しなくても収集できます。

   ```
   model.compile(
       loss="categorical_crossentropy", 
       optimizer=optimizer, 
       metrics=["accuracy"],
       # Required for collecting tensors of each layer
       run_eagerly=True
   )
   ```

1. フックを [https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit](https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit) メソッドに登録します。

   登録したフックからテンソルを収集するには、Keras `model.fit()` クラスメソッドに `callbacks=[hook]` を追加します。これにより、`sagemaker-debugger` フックが Keras コールバックとして渡されます。

   ```
   model.fit(
       X_train, Y_train,
       batch_size=batch_size,
       epochs=epoch,
       validation_data=(X_valid, Y_valid),
       shuffle=True, 
       callbacks=[hook]
   )
   ```

1. TensorFlow 2.x は、シンボリックな勾配変数しか提供されておらず、その値にアクセスすることはできません。勾配を収集するには、[https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html#tensorflow-specific-hook-api](https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html#tensorflow-specific-hook-api) メソッドで `tf.GradientTape` をラップします。そのためには、次のように独自のトレーニングステップを記述する必要があります。

   ```
   def training_step(model, dataset):
       with hook.wrap_tape(tf.GradientTape()) as tape:
           pred=model(data)
           loss_value=loss_fn(labels, pred)
       grads=tape.gradient(loss_value, model.trainable_variables)
       optimizer.apply_gradients(zip(grads, model.trainable_variables))
   ```

   テープをラップすることで、`sagemaker-debugger` フックは勾配、パラメータ、損失などの出力テンソルを識別できます。テープをラップすると `push_tape()`、`pop_tape()`、`gradient()` などのテープオブジェクトの関数を中心とした `hook.wrap_tape()` メソッドが SageMaker Debugger のライターを設定し、`gradient()` の入力 (トレーニング可能な変数と損失) および `gradient()` の出力 (勾配) として提供されるテンソルを保存するようになります。
**注記**  
カスタムトレーニングループで収集するには、必ず Eager モードを使用してください。そうでない場合は、SageMaker Debugger はテンソルを収集できなくなります。

`sagemaker-debugger` フック API が提供する、フックの構築やテンソルを保存するためのアクションの完全なリストについては、「`sagemaker-debugger` Python SDK ドキュメント」の「[Hook Methods](https://sagemaker-debugger.readthedocs.io/en/website/hook-methods.html)」を参照してください。

トレーニングスクリプトの調整が完了したら、[SageMaker Python SDK を使用して Debugger でトレーニングジョブを開始する](debugger-configuration-for-debugging.md) に進みます。