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

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

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

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

注記

SageMaker デバッガーは、torch.nn.functionalAPIオペレーションからモデル出力テンソルを収集できません。 PyTorch トレーニングスクリプトを作成するときは、代わりにtorch.nnモジュールを使用することをお勧めします。

PyTorch 1.12.0 の場合

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

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

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

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

    DebuggerHookConfig、 TensorBoardConfig、または推定器のルールのいずれか SageMaker Python を使用してデバッガーでトレーニングジョブを起動する SDKを使用して でトレーニングジョブを起動すると、 SageMakerはget_hook関数によって取得されるJSON設定ファイルをトレーニングインスタンスに追加します。推定器APIsに設定を含めない場合、フックが検索する設定ファイルはなく、関数は を返しますNone

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

    トレーニングジョブをローカルモードで、 SageMaker ノートブックインスタンス、Amazon EC2インスタンス、または独自のローカルデバイスで直接実行する場合は、 smd.Hook クラスを使用してフックを作成します。ただし、このアプローチはテンソルコレクションのみを保存でき、 TensorBoard 視覚化に使用できます。 SageMaker デバッガーの組み込みルールは、リモートインスタンスからの出力をリアルタイムで保存するために SageMaker ML トレーニングインスタンスと S3 を必要とするため、ローカルモードでは機能しません。この場合None、 は smd.get_hookAPIを返します。

    テンソルをローカルモードで保存するための手動フックを作成する場合は、ロジックで次のコードスニペットを使用して が smd.get_hookAPIを返すかどうかを確認しNonesmd.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() メソッドはモデルを取得して各レイヤーを繰り返し処理し、 SageMaker Python を使用してデバッガーでトレーニングジョブを起動する SDK の設定で指定した正規表現と一致するテンソルを検索します。このフックメソッドで収集できるテンソルは、重み、バイアス、アクティベーション、グラデーション、入力、出力です。

    hook.register_module(model)
    ヒント

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

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

    hook.register_loss メソッドは損失関数をラップします。 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" テンソルコレクションに保存されます。

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