調整您的 TensorFlow 訓練腳本 - Amazon SageMaker

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

調整您的 TensorFlow 訓練腳本

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

為中的訓練工作建立勾點 SageMaker

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

這會在您開始 SageMaker 訓練工作時建立勾點。當您在中步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK使用任何一個、或Rules在估算器中啟動訓練工作時 DebuggerHookConfigTensorBoardConfig,會將 JSON 組態檔案 SageMaker 新增至您的訓練執行個體,該檔案是由方法挑選的smd.get_hook。請注意,如果您沒有在估算器中包含任何組態 API,就不會有要尋找勾點的組態檔案,且函數會傳回 None

(選擇性) 建立外部訓練工作的勾點 SageMaker

如果您以本機模式執行訓練任務,請直接在 SageMaker 筆記本執行個體、Amazon EC2 執行個體或您自己的本機裝置上執行訓練任務,請使用 smd.Hook class 來建立勾點。但是,這種方法只能存儲張量集合並可用於可 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 )

新增掛接建立程式碼之後,請繼續執行 TensorFlow Keras 的下列主題。

注意

SageMaker 除錯程式目前僅支援 TensorFlow Keras。

在您的 TensorFlow Keras 訓練腳本中註冊掛鉤

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

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

    hook.register_model() 方法採用您的模型並逐一查看每一層,尋找與您透過 步驟 2:使用 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. 在中以渴望模式編譯模型 TensorFlow。

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

    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 調試器無法收集任何張量。

如需 sagemaker-debugger 勾點 API 提供用來建構勾點和儲存張量的完整動作清單,請參閱 sagemaker-debuggerPython 軟體開發套件文件中的勾點方法

完成訓練指令碼的調整後,請繼續前往 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK