PyTorch トレーニングスクリプトを適応させる - Amazon SageMaker

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

PyTorch トレーニングスクリプトを適応させる

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

PyTorch 1.12.0 の場合

PyTorch トレーニングスクリプトを持ち込む場合は、トレーニングスクリプトに追加のコード行を使用してトレーニングジョブを実行し、モデル出力テンソルを抽出できます。sagemaker-debugger クライアントライブラリの「 フック API」を使用する必要があります。以下の説明では、コード例を使って各ステップごとに説明します。

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

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

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

    DebuggerHookConfig、 TensorBoardConfig、または ルールのいずれかステップ 2: SageMaker Python SDK を使用してトレーニングジョブを起動およびデバッグするを指定して でトレーニングジョブを起動すると、 SageMaker はget_hook、関数によって取得される JSON 設定ファイルをトレーニングインスタンスに追加します。推定器に設定 API が含まれていない場合、フックで検索できる設定ファイルは存在せず、関数は None を返すことに注意してください。

    (オプション) 外部でのトレーニングジョブの場合 SageMaker

    ローカルモードでトレーニングジョブを実行する場合は、ノートブックインスタンス、Amazon EC2 SageMaker インスタンス、または独自のローカルデバイス上で直接、 smd.Hook クラスを使用してフックを作成します。ただし、このアプローチではテンソルコレクションのみを保存でき、 TensorBoard 視覚化に使用できます。 SageMaker デバッガーの組み込みルールは、 ルールがリモートインスタンスからの出力をリアルタイムで保存するために SageMaker 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 )
  2. フックのクラスメソッドでモデルをラップします。

    この hook.register_module() メソッドはモデルを取得して各レイヤーを繰り返し処理し、ステップ 2: SageMaker Python SDK を使用してトレーニングジョブを起動およびデバッグする の設定で指定した正規表現と一致するテンソルを検索します。このフックメソッドで収集できるテンソルは、重み、バイアス、アクティベーション、グラデーション、入力、出力です。

    hook.register_module(model)
    ヒント

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

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

    hook.register_loss メソッドは損失関数をラップします。ステップ 2: SageMaker Python SDK を使用してトレーニングジョブを起動およびデバッグする で設定する save_interval ごとに損失値を抽出し、"losses" コレクションに保存します。

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

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

    def validation(): ... hook.set_mode(ModeKeys.EVAL)
  6. カスタムスカラーを保存するには hook.save_scalar() を使用します。モデルにないスカラー値を保存できます。例えば、評価中に計算された精度の値を記録したい場合は、精度を計算する行の下に次のコード行を追加します。

    hook.save_scalar("accuracy", accuracy)

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

  7. カスタムテンソルを保存するには hook.save_tensor() を使用します。hook.save_scalar() と同様に、独自のテンソルコレクションを定義して、追加のテンソルを保存できます。例えば、モデルに渡された入力画像データを抽出し、カスタムテンソルとして保存するには、次のコード行 ("images" はカスタムテンソルの名前の例、image_inputs は入力画像データの変数の例) を追加します。

    hook.save_tensor("images", image_inputs)

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

トレーニングスクリプトの調整が完了したら、ステップ 2: SageMaker Python SDK を使用してトレーニングジョブを起動およびデバッグする に進みます。