調整 TensorFlow 訓練指令碼 - Amazon SageMaker

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

調整 TensorFlow 訓練指令碼

若要開始收集模型輸出張量和偵錯訓練問題,請對 TensorFlow 訓練指令碼進行下列修改。

在 中建立訓練任務的掛鉤 SageMaker

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

這會在您開始 SageMaker 訓練工作時建立掛鉤。當您使用 SageMaker Python 使用 Debugger 啟動訓練任務 SDK使用估算器Rules中的任何 DebuggerHookConfigTensorBoardConfig或 在 中啟動訓練任務時, 會將JSON組態檔案 SageMaker 新增至由 smd.get_hook方法提取的訓練執行個體。請注意,如果您未在估算器APIs中包含任何組態,則不會有要尋找掛鉤的組態檔案,且函數會傳回 None

(選用) 建立外部訓練任務的掛鉤 SageMaker

如果您以本機模式執行訓練任務,請直接在 SageMaker 筆記本執行個體、Amazon EC2執行個體或您自己的本機裝置上執行,請使用 smd.Hook類別來建立掛鉤。不過,此方法只能儲存張量集合,並可用於 TensorBoard視覺化。 SageMaker Debugger 的內建規則不適用於本機模式。在這種情況下,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 Debugger 目前僅支援 TensorFlow Keras。

在 TensorFlow Keras 訓練指令碼中註冊掛鉤

以下程序將逐步引導您使用勾點及其方法,從模型和最佳化工具收集輸出純量與張量。

  1. 利用勾點的類別方法包裝您的 Keras 模型和最佳化工具。

    hook.register_model() 方法採用您的模型並逐一查看每一層,尋找與您透過 使用 SageMaker Python 使用 Debugger 啟動訓練任務 SDK 組態提供的規則表達式所符合的任何張量。透過此勾點方法的可收式張量為加權、誤差和啟用。

    model=tf.keras.Model(...) hook.register_model(model)
  2. 透過 hook.wrap_optimizer() 方法包裝最佳化工具。

    optimizer=tf.keras.optimizers.Adam(...) optimizer=hook.wrap_optimizer(optimizer)
  3. 在 中以急切模式編譯模型 TensorFlow。

    若要從模型收集張量 (例如每層的輸入和輸出張量),您必須以嚴格模式執行訓練。否則, SageMakerDebugger 將無法收集張量。不過,系統可以收集其他張量,例如模型加權、誤差和損失,而無須在嚴格模式中明確執行。

    model.compile( loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"], # Required for collecting tensors of each layer run_eagerly=True )
  4. 將勾點註冊到 tf.keras.Model.fit() 方法。

    若要從您註冊的勾點收集張量,請將 callbacks=[hook] 新增至 Keras model.fit() 類別方法。這會把 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 勾點可以識別輸出張量,例如建層、參數和損失。包裝磁帶可確保圍繞磁帶物件函數hook.wrap_tape()的方法,例如 push_tape()pop_tape()gradient()、 ,將設定 SageMaker 偵錯工具的寫入器,並儲存作為輸入 gradient()(可訓練變數和損失) 和輸出 gradient()(梯度) 提供的張量。

    注意

    如要透過自訂訓練循環進行收集,請務必使用嚴格模式。否則, SageMaker Debugger 無法收集任何張量。

如需sagemaker-debugger掛鉤APIs提供建構掛鉤和儲存張量動作的完整清單,請參閱 Python 文件中的掛鉤方法sagemaker-debugger SDK

完成訓練指令碼的調整後,請繼續前往使用 SageMaker Python 使用 Debugger 啟動訓練任務 SDK