

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

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

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

**注記**  
SageMaker Debugger は、[https://pytorch.org/docs/stable/nn.functional.html](https://pytorch.org/docs/stable/nn.functional.html) API オペレーションからモデル出力テンソルを収集できません。PyTorch トレーニングスクリプトを記述する場合は、代わりに [https://pytorch.org/docs/stable/generated/torch.nn.NLLLoss.html](https://pytorch.org/docs/stable/generated/torch.nn.NLLLoss.html) モジュールを使用することをお勧めします。

## PyTorch 1.12.0 の場合
<a name="debugger-modify-script-pytorch-1-12-0"></a>

PyTorch トレーニングスクリプトを持ち込んだ場合、トレーニングスクリプトに数行のコードを追加するだけで、トレーニングジョブを実行し、モデル出力テンソルを抽出できます。`sagemaker-debugger` クライアントライブラリの「[ フック API](https://sagemaker-debugger.readthedocs.io/en/website/hook-api.html)」を使用する必要があります。以下の説明では、コード例を使って各ステップごとに説明します。

1. フックを作成します。

   **(推奨) SageMaker AI 内でのトレーニングジョブの場合**

   ```
   import smdebug.pytorch as smd
   hook=smd.get_hook(create_if_not_exists=True)
   ```

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

   **(オプション) SageMaker AI 以外のトレーニングジョブの場合**

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

   ローカルモードでテンソルを保存する手動フックを作成する場合は、以下のコードスニペットとロジックを使用して `smd.get_hook` API が `None` を戻すかどうかを確認し、`smd.Hook` クラスを使用して手動フックを作成します。ローカルマシンの任意の出力ディレクトリを指定できることに注意してください。

   ```
   import smdebug.pytorch as smd
   hook=smd.get_hook(create_if_not_exists=True)
   
   if hook is None:
       hook=smd.Hook(
           out_dir='/path/to/your/local/output/',
           export_tensorboard=True
       )
   ```

1. フックのクラスメソッドでモデルをラップします。

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

   ```
   hook.register_module(model)
   ```
**ヒント**  
大規模なディープラーニングモデルから出力テンソル全体を収集すると、それらのコレクションの合計サイズが指数関数的に大きくなり、ボトルネックの原因になる可能性があります。特定のテンソルを保存したい場合は、`hook.save_tensor()` メソッドを使用することもできます。このメソッドは、特定のテンソルの変数を選択し、必要な名前を付けたカスタムコレクションに保存するのに役立ちます。詳細については、この手順の「[ステップ 7](#debugger-modify-script-pytorch-save-custom-tensor)」を参照してください。

1. 損失関数をフックのクラスメソッドでワープします。

   `hook.register_loss` メソッドは損失関数をラップします。[SageMaker Python SDK を使用して Debugger でトレーニングジョブを開始する](debugger-configuration-for-debugging.md) で設定する `save_interval` ごとに損失値を抽出し、`"losses"` コレクションに保存します。

   ```
   hook.register_loss(loss_function)
   ```

1. トレインブロックに `hook.set_mode(ModeKeys.TRAIN)` を追加します。これは、テンソルコレクションがトレーニングフェーズ中に抽出されることを示しています。

   ```
   def train():
       ...
       hook.set_mode(ModeKeys.TRAIN)
   ```

1. 検証ブロックを `hook.set_mode(ModeKeys.EVAL)` に追加します。これは、テンソルコレクションがト検証フェーズ中に抽出されることを示しています。

   ```
   def validation():
       ...
       hook.set_mode(ModeKeys.EVAL)
   ```

1. カスタムスカラーを保存するには [https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar) を使用します。モデルにないスカラー値を保存できます。例えば、評価中に計算された精度の値を記録したい場合は、精度を計算する行の下に次のコード行を追加します。

   ```
   hook.save_scalar("accuracy", accuracy)
   ```

   カスタムスカラーコレクションに名前を付けるには、最初の引数に文字列を指定する必要があります。これは TensorBoard のスカラー値を視覚化するために使用される名前で、任意の文字列を指定することができます。

1. <a name="debugger-modify-script-pytorch-save-custom-tensor"></a>カスタムテンソルを保存するには [https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_tensor](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_tensor) を使用します。[https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar](https://sagemaker-debugger.readthedocs.io/en/website/hook-constructor.html#smdebug.core.hook.BaseHook.save_scalar) と同様に、独自のテンソルコレクションを定義して、追加のテンソルを保存できます。例えば、モデルに渡された入力画像データを抽出し、カスタムテンソルとして保存するには、次のコード行 (`"images"` はカスタムテンソルの名前の例、`image_inputs` は入力画像データの変数の例) を追加します。

   ```
   hook.save_tensor("images", image_inputs)
   ```

   カスタムテンソルの名前を付けるには、最初の引数に文字列を指定する必要があることに注意してください。`hook.save_tensor()` には、カスタムテンソルを保存するテンソルコレクションを指定するための 3 番目の引数 `collections_to_write` があります。デフォルトは `collections_to_write="default"` です。3 番目の引数を明示的に指定しない場合、カスタムテンソルは `"default"` テンソルコレクションに保存されます。

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