TensorFlow - Amazon SageMaker AI

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

TensorFlow

独自の TensorFlow モデルを SageMaker AI に持ち込み、SageMaker Training Compiler でトレーニングジョブを実行します。

TensorFlow モデル

SageMaker Training Compiler は、ネイティブ TensorFlow API または高レベルの Keras API の上に構築されたモデルトレーニングワークロードを自動的に最適化します。

ヒント

入力データセットを前処理する場合は、必ず静的な入力形状を使用してください。動的入力形状は、モデルの再コンパイルを開始し、合計トレーニング時間が長くなる可能性があります。

Keras の使用 (推奨)

最良のコンパイラアクセラレーションを行うには、TensorFlow Keras のサブクラスであるモデル (tf.keras.Model)を使用することを推奨します。

シングル GPU のトレーニングの場合

トレーニングスクリプトに追加が必要な変更はありません。

Keras を使用しない

SageMaker Training Compiler は TensorFlow での eager execution をサポートしていません。したがって、コンパイラアクセラレーションを活用するには、モデルとトレーニングループを TensorFlow 関数デコレータ (@tf.function) でラップする必要があります。

SageMaker Training Compiler は、グラフレベルの最適化を実行し、デコレータを使用して確実に TensorFlow 関数がグラフモードで実行されるよう設定します。

単一 GPU のトレーニングの場合

TensorFlow 2.0 以降では、デフォルトで eager execution がオンになっているため、@tf.function デコレータを TensorFlow モデルの構築に使用するすべての関数の前に追加してください。

Hugging Face Transformer を使用する TensorFlow モデル

Hugging Face Transformers を使用する TensorFlow モデルは、TensorFlow の tf.keras.Model API に基づいています。Hugging Face Transformers は、自然言語処理 (NLP) モデルの構成にかかる労力を軽減するために、TensorFlow に事前学習済みのモデルクラスも提供します。Transformers ライブラリを使用して独自のトレーニングスクリプトを作成したら、前のトピック「」で説明したように、SageMaker AI HuggingFace 推定器と SageMaker Training Compiler 設定クラスを使用してトレーニングスクリプトを実行できますSageMaker トレーニングコンパイラを使用して TensorFlow トレーニングジョブを実行する

SageMaker Training Compiler は、TensorFlow transformer モデルなど、ネイティブ TensorFlow API または高レベルの Keras API の上に構築されたモデルトレーニングワークロードを自動的に最適化します。

ヒント

トレーニングスクリプトで Transformers を使用して NLP モデルのトークナイザを作成する場合は、必ず padding='max_length' を指定して静的な入力テンソル形状を使用してください。バッチ内の最長シーケンスにパディングすると、各トレーニングバッチのテンソル形状が変化する可能性があるため、padding='longest' は使用しないでください。動的入力形状はモデルの再コンパイルを開始し、合計トレーニング時間が長くなる可能性があります。Transformer トークナイザのパディングオプションの詳細については、Hugging Face Transformers ドキュメントの「Padding and truncation」を参照してください。

Keras を使用する

最良のコンパイラアクセラレーションを行うには、TensorFlow Keras のサブクラスであるモデル (tf.keras.Model)を使用することを推奨します。Hugging Face Transformer のドキュメントに含まれる「クイックツアー」ページ内で述べられているように、それらのモデルを通常の TensorFlow Keras モデルとして使用できます。

単一 GPU のトレーニングの場合

トレーニングスクリプトに追加が必要な変更はありません。

分散トレーニングの場合

SageMaker Training Compiler アクセラレーションは、tf.distribute.Strategy.scope() 呼び出しのスコープ内で Keras API を使用してモデルを構築およびトレーニングする場合、マルチ GPU のワークロードに対して透過的に機能します。

  1. 適切な分散トレーニング戦略を選択します。

    1. シングルノードマルチ GPU の場合は、tf.distribute.MirroredStrategy を使用して戦略を設定します。

      strategy = tf.distribute.MirroredStrategy()
    2. マルチノードマルチ GPU の場合は、戦略を作成する前に、次のコードを追加して TensorFlow 分散トレーニング設定を適切に設定します。

      def set_sm_dist_config(): DEFAULT_PORT = '8890' DEFAULT_CONFIG_FILE = '/opt/ml/input/config/resourceconfig.json' with open(DEFAULT_CONFIG_FILE) as f: config = json.loads(f.read()) current_host = config['current_host'] tf_config = { 'cluster': { 'worker': [] }, 'task': {'type': 'worker', 'index': -1} } for i, host in enumerate(config['hosts']): tf_config['cluster']['worker'].append("%s:%s" % (host, DEFAULT_PORT)) if current_host == host: tf_config['task']['index'] = i os.environ['TF_CONFIG'] = json.dumps(tf_config) set_sm_dist_config()

      tf.distribute.MultiWorkerMirroredStrategy を使用して戦略を設定します。

      strategy = tf.distribute.MultiWorkerMirroredStrategy()
  2. 選択した戦略を使用して、モデルをラップします。

    with strategy.scope(): # create a model and do fit

Keras を使用しない

Keras を使用せずに TensorFlow を使用してカスタムトレーニングループを持つカスタムモデルを持ち込む場合は、モデルとトレーニングループを TensorFlow 関数デコレータ (@tf.function) でラップして、コンパイラアクセラレーションを活用します。

SageMaker Training Compiler は、グラフレベルの最適化を実行し、デコレータを使用して TensorFlow 関数がグラフモードで実行されるよう確実に設定します。

単一 GPU のトレーニングの場合

TensorFlow 2.0 以降では、デフォルトで eager execution がオンになっているため、@tf.function デコレータを TensorFlow モデルの構築に使用するすべての関数の前に追加してください。

分散トレーニングの場合

分散トレーニングに Keras を使用するために必要な変更に加えて、各 GPU で実行される関数に @tf.function のアノテーションが付加されるようにする必要があります。一方、クロス GPU 通信機能にはアノテーションは付加されません。トレーニングコードの例は、次ようになります。

@tf.function() def compiled_step(inputs, outputs): with tf.GradientTape() as tape: pred=model(inputs, training=True) total_loss=loss_object(outputs, pred)/args.batch_size gradients=tape.gradient(total_loss, model.trainable_variables) return total_loss, pred, gradients def train_step(inputs, outputs): total_loss, pred, gradients=compiled_step(inputs, outputs) if args.weight_decay > 0.: gradients=[g+v*args.weight_decay for g,v in zip(gradients, model.trainable_variables)] optimizer.apply_gradients(zip(gradients, model.trainable_variables)) train_loss.update_state(total_loss) train_accuracy.update_state(outputs, pred) @tf.function() def train_step_dist(inputs, outputs): strategy.run(train_step, args= (inputs, outputs))

この手順は、シングルノードマルチ GPU とマルチノードマルチ GPU の両方に使用できます。