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

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

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

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

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

import smdebug.tensorflow as smd hook=smd.get_hook(hook_type="keras", create_if_not_exists=True)

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

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

トレーニングジョブをローカルモードで、 SageMaker ノートブックインスタンス、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 )

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

注記

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

TensorFlow Keras トレーニングスクリプトにフックを登録する

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

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

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

    model=tf.keras.Model(...) hook.register_model(model)
  2. オプティマイザを hook.wrap_optimizer() メソッドでラップします。

    optimizer=tf.keras.optimizers.Adam(...) optimizer=hook.wrap_optimizer(optimizer)
  3. モデルを の eager モードでコンパイルします TensorFlow。

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

    model.compile( loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"], # Required for collecting tensors of each layer run_eagerly=True )
  4. フックを 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] )
  5. TensorFlow 2.x は、値へのアクセスを提供しないシンボリック勾配変数のみを提供します。勾配を収集するには、hook.wrap_tape() メソッドで 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()hook.wrap_tape()メソッドが SageMaker デバッガーのライターをセットアップしgradient()、 への入力 gradient() (トレーニング可能な変数と損失) と の出力 gradient() (勾配) として提供されるテンソルを保存します。

    注記

    カスタムトレーニングループで収集するには、必ず Eager モードを使用してください。それ以外の場合、 SageMaker デバッガーはテンソルを収集できません。

sagemaker-debugger フックの構築とテンソルの保存のためにフックAPIsが提供するアクションの完全なリストについては、sagemaker-debuggerPython SDKドキュメント「Hook Methods」を参照してください。

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