捷徑

錯誤傳播

分散式 PyTorch 作業中的每個主機都使用單一 TorchElastic 代理程式和多個工作者(作為 TorchElastic 代理程式的子程序)執行。 由於工作者是由使用者提供的(您的 PyTorch 指令碼/作業),因此 TorchElastic 有一種方法可以將訓練器上的錯誤透過代理程式傳播到排程器,而排程器最終會通知終端使用者作業的狀態並套用任何重試策略。

TorchElastic 將錯誤分為 3 個類別

類別

子類別

說明

使用者錯誤

輸入錯誤

TorchElastic API 的無效輸入(例如 min > max 節點)

工作者失敗

工作子程序上的任何失敗

平台錯誤

由代理程式造成的失敗

基礎結構錯誤

代理程式和工作者網域之外的失敗(例如主機失敗)

除了「工作者失敗」之外的所有錯誤,都會從代理程式程序中正規地引發,或隱式或明確地使代理程式程序當機。 因此,標準語言(python)提供的例外處理策略適用。

工作者失敗很特殊,因為例外/失敗源自於與代理程式不同的程序,因此錯誤需要在程序間傳播(例如,代理程式不能簡單地 try-catch 工作程序上引發的例外)。

TorchElastic 代理程式使用 torch.distributed.elastic.multiprocessing.start_processes() 來啟動具有內建簡單基於檔案的程序間錯誤傳播的工作者。

使用 record() 裝飾的任何函數或二進位進入點,都會將未捕獲的例外(以及追蹤資訊)寫入環境變數 TORCHELASTIC_ERROR_FILE 指定的檔案。 父程序(例如代理程式)會在其啟動的每個子程序上設定此環境變數,然後彙總所有子程序的錯誤檔案,並傳播具有**最小**時間戳記(例如**第一個**錯誤)的錯誤檔案。

方法和類別

torch.distributed.elastic.multiprocessing.errors.record(fn, error_handler=None)[來源]

使用提供的 error_handler 記錄裝飾函數中發生的錯誤/例外的語法糖。

使用此裝飾器等同於

error_handler = get_error_handler()
error_handler.initialize()
try:
   foobar()
except ChildFailedError as e:
   _, failure = e.get_first_failure()
   error_handler.dump_error_file(failure.error_file, failure.exitcode)
   raise
except Exception as e:
   error_handler.record(e)
   raise

重要

在頂層方法中,每個程序使用此裝飾器一次,通常這是主要方法。

範例

@record
def main():
    pass

if __name__=="__main__":
   main()
傳回類型

Callable[[…], T]

class torch.distributed.elastic.multiprocessing.errors.ChildFailedError(name, failures)[來源]

特殊例外類型,可以從使用 @record 裝飾器註解的函數中引發,以使子程序的(根例外)按原樣傳播到堆疊中(例如,不會被包裝在父程序的回溯中)。

在父程序是簡單的保姆程序,而子程序(工作者)實際上正在執行有意義的計算的情況下很有用。 在這種情況下,錯誤通常發生在子程序上,因為父程序沒有執行任何重要的事情,並且應該將子程序錯誤傳播到排程器以進行準確的根本原因診斷。

備註

傳播依賴於錯誤檔案而不是例外處理來支援函數和二進位啟動。

範例

# process tree on a host (container)
0: scheduler-init-process:
           |- 1: torchelastic_agent:
                    |- 2: trainer_0 (ok)
                    |- 3: trainer_1 (fail) -> error.json
                    |- ...
                    |- n+2: trainer_n (ok)
           |- n+3: other processes
           |- ...

在上面的範例中,訓練器 1 的失敗(寫入 error.json 中)是根本原因,應該報告給排程器的 init 程序。 torchelastic 代理程式在偵測到訓練器 1 的失敗時會引發 ChildFailedError("trainer", {1: "trainer_1/error.json"}),這會將訓練器 1 的錯誤檔案內容傳播到排程器的 init 程序。

class torch.distributed.elastic.multiprocessing.errors.ErrorHandler[source]

以結構化的 JSON 格式將提供的異常物件以及有關錯誤的一些其他元數據寫入由環境變數指定的錯誤檔案:TORCHELASTIC_ERROR_FILE。如果未設定此環境變數,則僅記錄將寫入錯誤檔案的內容。

可以將此處理常式子類化以自訂錯誤的處理方式。子類別應覆寫 initialize()record_exception()

class torch.distributed.elastic.multiprocessing.errors.ProcessFailure(local_rank, pid, exitcode, error_file)[source]

表示失敗的處理序結果。當工作處理序失敗時,它可能會將失敗的根本原因記錄到檔案中。

嘗試從提供的 error_file 讀取失敗時間戳記,如果 error_file 不存在,則時間戳記為當前時間戳記(自紀元以來的秒數)。

message 欄位是對失敗的簡要說明。如果錯誤檔案存在,則從錯誤檔案中獲取訊息。否則,將根據失敗簽章生成一個訊息。

備註

假設 error_file 是由 torch.distributed.elastic.multiprocessing.errors.error_handler.ErrorHandler 寫入的。否則行為未定義。

文件

取得 PyTorch 的完整開發人員文件

查看文件

教學課程

取得適合初學者和進階開發人員的深入教學課程

查看教學課程

資源

尋找開發資源並獲得問題的解答

查看資源