

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

# TensorFlow
<a name="training-compiler-tensorflow"></a>

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

## TensorFlow モデル
<a name="training-compiler-tensorflow-models"></a>

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

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

### Keras の使用 (推奨)
<a name="training-compiler-tensorflow-models-keras"></a>

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

#### シングル GPU のトレーニングの場合
<a name="training-compiler-tensorflow-models-keras-single-gpu"></a>

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

### Keras を使用しない
<a name="training-compiler-tensorflow-models-no-keras"></a>

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

SageMaker Training Compiler は、グラフレベルの最適化を実行し、デコレータを使用して確実に TensorFlow 関数が[グラフモード](https://www.tensorflow.org/guide/intro_to_graphs)で実行されるよう設定します。

#### 単一 GPU のトレーニングの場合
<a name="training-compiler-tensorflow-models-no-keras-single-gpu"></a>

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

## Hugging Face Transformer を使用する TensorFlow モデル
<a name="training-compiler-tensorflow-models-transformers"></a>

[Hugging Face Transformers](https://huggingface.co/docs/transformers/index) を使用する TensorFlow モデルは、TensorFlow の [tf.keras.Model](https://www.tensorflow.org/api_docs/python/tf/keras/Model) API に基づいています。Hugging Face Transformers は、自然言語処理 (NLP) モデルの構成にかかる労力を軽減するために、TensorFlow に事前学習済みのモデルクラスも提供します。トランスフォーマーライブラリを使用して独自のトレーニングスクリプトを作成した後、前のトピックの [SageMaker トレーニングコンパイラを使用して TensorFlow トレーニングジョブを実行する](training-compiler-enable-tensorflow.md) で示したように、SageMaker Training Compiler 設定クラスで、SageMaker AI `HuggingFace` 推定器を使用してトレーニングスクリプトを実行できます。

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

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

**Topics**
+ [Keras を使用する](#training-compiler-tensorflow-models-transformers-keras)
+ [Keras を使用しない](#training-compiler-tensorflow-models-transformers-no-keras)

### Keras を使用する
<a name="training-compiler-tensorflow-models-transformers-keras"></a>

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

#### 単一 GPU のトレーニングの場合
<a name="training-compiler-tensorflow-models-transformers-keras-single-gpu"></a>

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

#### 分散トレーニングの場合
<a name="training-compiler-tensorflow-models-transformers-keras-distributed"></a>

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

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

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

      ```
      strategy = tf.distribute.MirroredStrategy()
      ```

   1. マルチノードマルチ 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()
      ```

1. 選択した戦略を使用して、モデルをラップします。

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

### Keras を使用しない
<a name="training-compiler-tensorflow-models-transformers-no-keras"></a>

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

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

#### 単一 GPU のトレーニングの場合
<a name="training-compiler-tensorflow-models-transformers-no-keras-single-gpu"></a>

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

#### 分散トレーニングの場合
<a name="training-compiler-tensorflow-models-transformers-no-keras-distributed"></a>

[分散トレーニングに Keras を使用する](https://docs.aws.amazon.com/sagemaker/latest/dg/training-compiler-tensorflow-models.html#training-compiler-tensorflow-models-transformers-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 の両方に使用できます。