TensorFlow - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

TensorFlow

將您自己的 TensorFlow 模型帶入 SageMaker,並使用訓練編譯器執行 SageMaker 訓練工作。

TensorFlow 模特兒

SageMaker 訓練編譯器會自動最佳化建置在原生 TensorFlow API 或高階 Keras API 之上的模型訓練工作負載。

提示

若要預先處理輸入資料集,請確保您使用靜態輸入形狀。動態輸入形狀可以啟動模型的重新編譯,並可能增加總訓練時間。

使用 Keras (建議)

為了獲得最佳的編譯器加速,我們建議使用 TensorFlow Keras (TF .keras.model) 子類別的模型。

適用於單一 GPU 訓練

您不需要在訓練指令碼中進行其他變更。

不使用 Keras

SageMaker 訓練編譯器不支援中的急切執行 TensorFlow。因此,您應該使用 TensorFlow 函數 decorator(@tf.function)來包裝模型和訓練循環,以利用編譯器加速。

SageMaker 訓練編譯器會執行圖形層級最佳化,並使用裝飾器來確保您的 TensorFlow 函數設定為以圖形模式執行。

適用於單一 GPU 訓練

TensorFlow 默認情況下,2.0 或更高版本具有渴望執行,因此您應該在用於構建模型的每個函數之前添加@tf.function裝飾器。 TensorFlow

TensorFlow 具有 Hugging Face 變壓器的型號

TensorFlow 具有 Hugging Face 變壓器的型號基於 TensorFlow的 TF.Keras. Model API。Hugging Face 部變壓器也提供預先訓練的模型類別, TensorFlow 以協助減少設定自然語言處理 (NLP) 模型的工作量。使用變形金剛程式庫建立您自己的訓練指令碼之後,您可以使用 SageMaker HuggingFace預估器與訓練編譯器組態類別執行 SageMaker 訓練指令碼,如上一個主題所示。使用 TensorFlow 訓練編譯器執行 SageMaker 訓練工作

SageMaker 訓練編譯器會自動最佳化建置在原生 TensorFlow API 或高階 Keras API (例如 TensorFlow 變壓器模型) 之上的模型訓練工作負載。

提示

當您在訓練指令碼中使用轉換器為 NLP 模型建立權杖化工具時,請確保您透過指定 padding='max_length' 來使用靜態輸入張量形狀。請勿使用 padding='longest',因為填補至批次中最長的序列可能會變更每個訓練批次的張量形狀。動態輸入形狀可啟動模型的重新編譯,並可能增加總訓練時間。如需轉換器權杖化工具選項的更多相關資訊,請參閱 Hugging Face 轉換器 文件中的填補和截斷

使用 Keras

為了獲得最佳的編譯器加速,我們建議使用 TensorFlow Keras (TF .keras.model) 子類別的模型。如同 Hugging Face 部變形金剛文件中的快速導覽頁面所述,您可以將這些模型當作一般 TensorFlow Keras 型號使用。

適用於單一 GPU 訓練

您不需要在訓練指令碼中進行其他變更。

適用於分散式訓練

SageMaker 當在呼叫範圍內使用 Keras API 建構和訓練模型時,訓練編譯器加速可透明地針對多 GPU 工作負載運作。tf.distribute.Strategy.scope()

  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

如果要使用 TensorFlow 不使用 Keras 的自定義培訓循環來使用自定義模型,則應使用 TensorFlow 函數 decorator(@tf.function)包裝模型和培訓循環以利用編譯器加速。

SageMaker 訓練編譯器會執行圖形層級最佳化,並使用裝飾器來確保您的 TensorFlow 函數設定為以圖形模式執行。

適用於單一 GPU 訓練

TensorFlow 默認情況下,2.0 或更高版本具有渴望執行,因此您應該在用於構建模型的每個函數之前添加@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。