本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
調整 PyTorch 訓練指令碼
若要開始收集模型輸出張量並對訓練問題進行偵錯,請對 PyTorch 訓練指令碼進行下列修改。
注意
SageMaker Debugger 無法從 torch.nn.functional
torch.nn
適用於 PyTorch 1.12.0
若使用 PyTorch 訓練指令碼,您可以執行訓練任務,並在訓練指令碼中使用一些額外的程式碼行擷取模型輸出張量。您需要使用 sagemaker-debugger
用戶端程式庫中的勾點 API
-
建立勾點。
(建議) 適用於 SageMaker AI 中的訓練任務
import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True)
當您使用 SageMaker Python SDK 使用 Debugger 啟動訓練任務使用估算器中的任何 DebuggerHookConfig、TensorBoardConfig 或規則在 中啟動訓練任務時,SageMaker AI 會將 JSON 組態檔案新增至由
get_hook
函數挑選的訓練執行個體。請注意,如果您沒有在估算器中包含任何組態 API,就不會有要尋找勾點的組態檔案,且函式會傳回None
。(選用) 針對 SageMaker AI 以外的訓練任務
如果您以本機模式執行訓練任務,請直接在 SageMaker 筆記本執行個體、Amazon EC2 執行個體或您自己的本機裝置上執行訓練任務,並使用
smd.Hook
類別建立勾點。不過,這種方法只能儲存張量集合,且僅可用於 TensorBoard 視覺化。SageMaker Debugger 的內建規則不適用於本機模式,因為規則需要 SageMaker AI ML 訓練執行個體和 S3 來即時儲存來自遠端執行個體的輸出。在這種情況下,smd.get_hook
API 會傳回None
。如果您想要建立手動勾點以在本機模式下儲存張量,請使用下列程式碼片段與邏輯來檢查
smd.get_hook
API 是否傳回None
,並使用smd.Hook
類別建立手動勾點。請注意,您可以在本機機器中指定任何輸出目錄。import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True) if hook is None: hook=smd.Hook( out_dir='
/path/to/your/local/output/
', export_tensorboard=True ) -
用勾點的類別方法包裝您的模型。
hook.register_module()
方法採用您的模型並逐一查看每一層,尋找與您透過 使用 SageMaker Python SDK 使用 Debugger 啟動訓練任務 組態提供的規則表達式所符合的任何張量。透過此勾點的可收式張量方法為加權、誤差、啟用、漸層、輸入和輸出。hook.register_module(model)
提示
如果從大型深度學習模型收集整個輸出張量,則這些集合的大小總計可能會呈指數級增長,並可能導致瓶頸。如果想要儲存特定張量,也可以使用
hook.save_tensor()
方法。此方法可協助您為特定張量選取變數,並儲存至所需命名的自訂集合。如需詳細資訊,請參閱此指示的步驟 7。 -
使用勾點的類別方法扭曲損失函式。
hook.register_loss
方法是去包裝損失函式。它會擷取每一個您會在 使用 SageMaker Python SDK 使用 Debugger 啟動訓練任務 配置過程中設定的save_interval
損失值,並將它們儲存到"losses"
集合。hook.register_loss(loss_function)
-
在訓練區塊中新增
hook.set_mode(ModeKeys.TRAIN)
。這表示張量集合是在訓練階段擷取的。def train(): ... hook.set_mode(ModeKeys.TRAIN)
-
在驗證區塊中新增
hook.set_mode(ModeKeys.EVAL)
。這表示張量集合是在驗證階段擷取的。def validation(): ... hook.set_mode(ModeKeys.EVAL)
-
使用
hook.save_scalar()
儲存自訂純量。您可以儲存不在模型中的純量值。例如,如要記錄在評估期間運算的精確度值,請在計算準確度的行下方新增下列程式碼行。 hook.save_scalar("accuracy", accuracy)
請注意,您需要提供一個字串作為第一個引數來命名自訂純量集合。這是將用於在 TensorBoard 中視覺化純量值的名稱,並且可以是您想要的任何字串。
-
使用
hook.save_tensor()
儲存自訂張量。類似於 hook.save_scalar()
,您可以儲存其他張量,並定義自己的張量集合。例如,您可以透過新增以下程式碼行 (其中 "images"
是自訂張量的範例名稱),來擷取傳遞到模型中的輸入映像資料並另存為自訂張量 (其中image_inputs
是輸入映像資料的範例變數)。hook.save_tensor("images", image_inputs)
請注意,您必須為第一個引數提供字串,才能命名自訂張量。
hook.save_tensor()
具有第三個引數collections_to_write
來指定張量集合以儲存自訂張量。預設值為collections_to_write="default"
。如果您沒有明確指定第三個引數,則自訂張量將儲存到"default"
張量集合中。
完成訓練指令碼的調整後,請繼續前往使用 SageMaker Python SDK 使用 Debugger 啟動訓練任務。