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

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

調整您的 PyTorch 訓練腳本

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

適用於 PyTorch 1 月 12 日

如果您帶來 PyTorch 訓練指令碼,則可以執行訓練工作,並在訓練指令碼中使用其他幾行程式碼擷取模型輸出張量。您需要使用 sagemaker-debugger 用戶端程式庫中的勾點 API。逐步執行下列指示,以程式碼範例分解各步驟。

  1. 建立勾點。

    (建議)用於以下地區的培訓工作 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 )
  2. 用勾點的類別方法包裝您的模型。

    hook.register_module() 方法採用您的模型並逐一查看每一層,尋找與您透過 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK 組態提供的規則表達式所符合的任何張量。透過此勾點的可收式張量方法為加權、誤差、啟用、漸層、輸入和輸出。

    hook.register_module(model)
    提示

    如果從大型深度學習模型收集整個輸出張量,則這些集合的大小總計可能會呈指數級增長,並可能導致瓶頸。如果想要儲存特定張量,也可以使用 hook.save_tensor() 方法。此方法可協助您為特定張量選取變數,並儲存至所需命名的自訂集合。如需詳細資訊,請參閱此指示的步驟 7

  3. 使用勾點的類別方法扭曲損失函數。

    hook.register_loss 方法是去包裝損失函數。它會擷取每一個您會在 步驟 2:使用 SageMaker Python 啟動和偵錯訓練工作 SDK 配置過程中設定的 save_interval 損失值,並將它們儲存到 "losses" 集合。

    hook.register_loss(loss_function)
  4. 在訓練區塊中新增 hook.set_mode(ModeKeys.TRAIN)。這表示張量集合是在訓練階段擷取的。

    def train(): ... hook.set_mode(ModeKeys.TRAIN)
  5. 在驗證區塊中新增 hook.set_mode(ModeKeys.EVAL)。這表示張量集合是在驗證階段擷取的。

    def validation(): ... hook.set_mode(ModeKeys.EVAL)
  6. 使用 hook.save_scalar() 儲存自訂純量。您可以儲存不在模型中的純量值。例如,如要記錄在評估期間運算的精確度值,請在計算準確度的行下方新增下列程式碼行。

    hook.save_scalar("accuracy", accuracy)

    請注意,您需要提供一個字串作為第一個引數來命名自訂純量集合。這是將用於可視化標量值的名稱 TensorBoard,並且可以是您想要的任何字符串。

  7. 使用 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