本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
調整您的 PyTorch 訓練腳本
若要開始收集模型輸出張量並偵錯訓練問題,請對 PyTorch 訓練指令碼進行下列修改。
適用於 PyTorch 1 月 12 日
如果您帶來 PyTorch 訓練指令碼,則可以執行訓練工作,並在訓練指令碼中使用其他幾行程式碼擷取模型輸出張量。您需要使用 sagemaker-debugger
用戶端程式庫中的勾點 API
-
建立勾點。
(建議)用於以下地區的培訓工作 SageMaker
import smdebug.pytorch as smd hook=smd.get_hook(create_if_not_exists=True)
當您使用估算器中步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK的任何 DebuggerHookConfig TensorBoardConfig、或規則啟動中的訓練工作時,會將 JSON 組態檔案 SageMaker新增至由函數挑選的訓練執行個體
get_hook
。請注意,如果您沒有在估算器中包含任何組態 API,就不會有要尋找勾點的組態檔案,且函數會傳回None
。(選擇性) 適用於以外的訓練工作 SageMaker
如果您以本機模式執行訓練任務,請直接在 SageMaker 筆記本執行個體、Amazon EC2 執行個體或您自己的本機裝置上執行訓練任務,請使用
smd.Hook
class 來建立勾點。但是,這種方法只能存儲張量集合並可用於可 TensorBoard 視化。 SageMaker 偵錯工具的內建規則不適用於本機模式,因為規則需要 SageMaker 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()
方法採用您的模型並逐一查看每一層,尋找與您透過 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK 組態提供的規則表達式所符合的任何張量。透過此勾點的可收式張量方法為加權、誤差、啟用、漸層、輸入和輸出。hook.register_module(model)
提示
如果從大型深度學習模型收集整個輸出張量,則這些集合的大小總計可能會呈指數級增長,並可能導致瓶頸。如果想要儲存特定張量,也可以使用
hook.save_tensor()
方法。此方法可協助您為特定張量選取變數,並儲存至所需命名的自訂集合。如需詳細資訊,請參閱此指示的步驟 7。 -
使用勾點的類別方法扭曲損失函數。
hook.register_loss
方法是去包裝損失函數。它會擷取每一個您會在 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK 配置過程中設定的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"
張量集合中。
完成訓練指令碼的調整後,請繼續前往 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK。