本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
調整您的 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
在估算器中啟動訓練工作時 DebuggerHookConfig
TensorBoardConfig
,會將 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 訓練腳本中註冊掛鉤
以下程序將逐步引導您使用勾點及其方法,從模型和最佳化工具收集輸出純量與張量。
-
利用勾點的類別方法包裝您的 Keras 模型和最佳化工具。
hook.register_model()
方法採用您的模型並逐一查看每一層,尋找與您透過 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK 組態提供的規則表達式所符合的任何張量。透過此勾點方法的可收式張量為加權、誤差和啟用。model=tf.keras.Model(...) hook.register_model(model)
-
透過
hook.wrap_optimizer()
方法包裝最佳化工具。optimizer=tf.keras.optimizers.Adam(...) optimizer=hook.wrap_optimizer(optimizer)
-
在中以渴望模式編譯模型 TensorFlow。
若要從模型收集張量 (例如每層的輸入和輸出張量),您必須以嚴格模式執行訓練。否則, SageMaker調試器將無法收集張量。不過,系統可以收集其他張量,例如模型加權、誤差和損失,而無須在嚴格模式中明確執行。
model.compile( loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"], # Required for collecting tensors of each layer run_eagerly=True )
-
將勾點註冊到
tf.keras.Model.fit()
方法。 若要從您註冊的勾點收集張量,請將
callbacks=[hook]
新增至 Kerasmodel.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] )
-
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-debugger
Python 軟體開發套件文件中的勾點方法
完成訓練指令碼的調整後,請繼續前往 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK。