全部產品
Search
文件中心

Platform For AI:AIMaster:彈性自動容錯引擎

更新時間:Oct 29, 2024

本文為您介紹如何使用DLC提供的基於AIMaster的容錯監控功能。

背景資訊

如今,深度學習已被廣泛使用,隨著模型和資料規模越來越大,常採用分布式方式運行深度學習任務。當同一個任務運行執行個體個數增大後,由於依賴的軟體棧和硬體環境都有可能出現偶發異常,會導致任務停止運行。

為了保障大規模分布式深度學習任務穩定運行,DLC提供了基於AIMaster的容錯監控功能。AIMaster是一個任務層級的組件,當任務開啟AIMaster的容錯監控功能後,會拉起一個AIMaster執行個體和任務其他執行個體一起運行,起到任務監控、容錯判斷、資源控制的作用。

步驟一:配置容錯監控參數

當前容錯監控功能支援配置的全量參數如下,您可以參考常用參數配置樣本,提前規劃好要為任務配置的容錯監控內容。後續開啟容錯監控功能時,可以根據需求設定到容錯監控的其他配置處。

全量參數說明

容錯監控支援配置以下參數。

配置分類

功能介紹

配置參數

參數說明

預設值

通用配置

任務運行類型

--job-execution-mode

配置任務運行類型,取值如下:

  • Sync:同步任務。

  • Async:非同步任務。

不同任務類型容錯行為不同。對於可重試錯誤:

  • 同步任務需要重啟任務。

  • 非同步任務一般只需重啟失敗的執行個體。

Sync

任務重啟設定

--enable-job-restart

在滿足容錯條件或檢測到運行時異常時,是否允許任務重啟。取值如下:

  • False:不重啟任務。

  • True:重啟任務。

False

--max-num-of-job-restart

配置任務最大重啟次數。超過最大重啟次數後,會將任務標記為失敗。

3

運行時配置

說明

針對沒有執行個體運行失敗的情境。

任務Hang(掛起)異常檢測

--enable-job-hang-detection

是否開啟任務運行時的Hang異常檢測,只支援同步任務。取值如下:

  • False:表示不開啟。

  • True:表示開啟。如果所有執行個體的Stdout和Stderr日誌在指定時間內沒有更新,將觸發任務重啟。

False

--job-hang-interval

配置任務暫停執行的持續時間長度,正整數,單位為秒。

當任務停止時間長度超過該值時,則將任務標記為異常,並觸發任務重啟。

1800

--enable-c4d-hang-detection

是否開啟C4D(Calibrating Collective Communication over Converged ethernet - Diagnosis)檢測功能,用於快速診斷並定位任務執行過程中出現的慢速節點和導致任務Hang(掛起)的故障節點。

說明

該參數僅在同時開啟--enable-job-hang-detection參數的情況下才會生效。

False

任務退出時Hang(掛起)異常檢測

--enable-job-exit-hang-detection

是否開啟任務快要結束退出時的Hang異常檢測,只支援同步任務。取值如下:

  • False:表示不開啟。

  • True:表示開啟。當任務某個執行個體執行成功後,如果在指定時間內任務沒有結束,將觸發任務重啟。

False

--job-exit-hang-interval

配置任務退出時停止執行的持續時間長度,正整數,單位為秒。

當任務退出時間長度超過該值時,則將任務標記為異常,並觸發任務重啟。

600

容錯配置

說明

針對有執行個體運行失敗的情境。

容錯策略

--fault-tolerant-policy

容錯策略參數取值如下:

  • OnFailure:任務出現異常時:

    • 非同步任務會無條件重啟失敗的執行個體。

    • 同步任務會無條件重啟任務。

  • ExitCodeAndErrorMsg:任務出現異常時,判斷失敗執行個體的退出碼及錯誤記錄檔資訊(請參見步驟三:配置容錯監控增強功能),如果滿足重試條件:

    • 非同步任務會重啟失敗的執行個體。

    • 同步任務會重啟任務。

  • Never:對失敗任務不做任何處理,直接將任務標記為失敗。

ExitCodeAndErrorMsg

相同錯誤最大允許出現次數

--max-num-of-same-error

配置單個執行個體上同一錯誤允許出現的最大次數。

當錯誤出現次數超過該值時,直接將任務標記為失敗。

10

最大容錯率

--max-tolerated-failure-rate

設定最大容錯率,當失敗執行個體的比例超過該值時,job直接標記失敗。

預設值-1表示該功能預設不開啟。樣本:設定0.3表示30%以上的worker出現錯誤後,job可以直接標記為失敗。

-1

常用參數配置樣本

針對不同的訓練任務,常用的容錯監控參數配置樣本如下。

  • 同步訓練任務(常見於PyTorch任務)

    當任務某個執行個體運行異常時,如果退出碼或錯誤記錄檔資訊滿足容錯條件,例如:搶佔發生,則會重啟任務。

    --job-execution-mode=Sync --enable-job-restart=True --max-num-of-job-restart=3 --fault-tolerant-policy=ExitCodeAndErrorMsg
  • 非同步訓練任務(常見於TensorFlow任務)

    對於可重試的錯誤,如果任務的Worker執行個體運行異常,則會重啟運行異常的Worker執行個體。當PS或Chief執行個體出錯時,下面的配置預設不允許重啟任務。如果您希望重啟任務,可以將--enable-job-restart參數配置為True

    --job-execution-mode=Async --fault-tolerant-policy=OnFailure
  • 離線推理任務(常見於ElasticBatch任務)

    任務各個執行個體之間不存在依賴關係,相當於非同步任務。當執行個體運行異常時,只會重啟運行異常的執行個體。

    --job-execution-mode=Async --fault-tolerant-policy=OnFailure

步驟二:開啟容錯監控功能

您可以在提交DLC訓練任務時,開啟容錯監控功能,可以在控制台設定,也可以通過DLC SDK設定。

通過控制台開啟容錯監控功能

在控制台提交DLC訓練任務時,您可以在容錯與診斷地區,開啟自動容錯開關,並配置額外參數,詳情請參見建立訓練任務。這樣DLC任務在運行過程中會額外啟動一個AIMaster角色,對於任務啟動並執行過程進行全程監控,並且在遇到相應錯誤的時候進行容錯處理。

image

其中:

  • 支援在其他配置文字框中配置額外參數,參數配置說明請參見步驟一:配置容錯監控參數

  • 啟用任務掛起檢測後,可開啟C4D檢測功能。C4D(Calibrating Collective Communication over Converged ethernet - Diagnosis)是由阿里雲自研的,專門針對大模型訓練中任務Slow(慢)或任務Hang(掛起)的問題診斷工具,協助定位了大量客戶模型訓練任務中出現的問題。關於C4D的核心功能介紹和參數配置說明,請參見使用C4D

    說明
    • C4D的使用依賴阿里雲自研高效能集合通訊庫ACCL,請確保ACCL已安裝完成,詳情請參見ACCL:阿里雲自研高效能集合通訊庫

    • 目前,DLC任務選擇靈駿智算資源時,可以使用C4D檢測功能。

通過DLC SDK開啟容錯監控功能

  • 使用GO SDK

    通過GO SDK提交任務時開啟容錯開關。

    createJobRequest := &client.CreateJobRequest{}
    settings := &client.JobSettings{
        EnableErrorMonitoringInAIMaster: tea.Bool(true),
        ErrorMonitoringArgs: tea.String("--job-execution-mode=Sync --enable-job-restart=True --enable-job-hang-detection=True --job-hang-interval=3600"),
    }
    createJobRequest.SetSettings(settings)

    其中:

    • EnableErrorMonitoringInAIMaster:表示是否開啟容錯監控功能。

    • ErrorMonitoringArgs:表示容錯監控額外參數。

  • 使用Python SDK

    通過Python SDK提交任務時開啟容錯開關。

    from alibabacloud_pai_dlc20201203.models import CreateJobRequest, JobSettings
    
    settings = JobSettings(
        enable_error_monitoring_in_aimaster = True,
        error_monitoring_args = "--job-execution-mode=Sync --enable-job-restart=True --enable-job-hang-detection=True --job-hang-interval=30"
    )
    create_job_req = CreateJobRequest(
        ...
        settings = settings,
    )

    其中:

    • enable_error_monitoring_in_aimaster:表示是否開啟容錯監控功能。

    • error_monitoring_args:表示容錯監控額外參數。

步驟三:配置容錯監控增強功能

您可以根據任務的容錯監控需求情境,選擇使用以下容錯監控增強功能。

配置容錯訊息通知

任務開啟容錯監控後,如果您希望容錯發生時可以進行通知,比如任務發生了重啟,那麼您可以在工作空間詳情,選擇事件中心,點擊建立事件規則,事件類型選擇DLC任務>任務自動容錯。具體操作,請參見工作空間事件中心

除了對任務容錯語音總機外,當您判斷任務訓練出現異常時,比如loss出現Nan,也可以在代碼中使用AIMaster SDK發送自訂通知訊息,如下所示

說明

本功能需要安裝AIMaster whl包,詳情請參見常見問題集

from aimaster import job_monitor as jm

job_monitor_client = jm.Monitor(config=jm.PyTorchConfig())

...

if loss == Nan and rank == 0:
  st = job_monitor_client.send_custom_message(content="任務訓練loss出現Nan")
  if not st.ok():
      print('failed to send message, error %s' % st.to_string())

配置自訂容錯關鍵字

容錯監控功能已內建了常見的可重試錯誤的監控模組,如果您希望任務異常執行個體日誌中出現某些關鍵字時也進行容錯,則可以在您的代碼中使用以下方法進行配置。配置完成後,容錯監控模組會掃描失敗的執行個體尾部日誌進行關鍵資訊匹配。

說明

容錯策略需要配置為ExitCodeAndErrorMsg

  • PyTorch任務自訂容錯關鍵字配置樣本

    from aimaster import job_monitor as jm
    
    jm_config_params = {}
    jm_config = jm.PyTorchConfig(**jm_config_params)
    monitor = jm.Monitor(config=jm_config)
    monitor.set_retryable_errors(["connect timeout", "error_yyy", "error_zzz"])

    其中:monitor.set_retryable_errors中配置的參數即為自訂容錯關鍵字。

  • TF任務自訂容錯關鍵字配置樣本

    from aimaster import job_monitor as jm
    
    jm_config_params = {}
    jm_config = jm.TFConfig(**jm_config_params)
    monitor = jm.Monitor(config=jm_config)
    monitor.set_retryable_errors(["connect timeout", "error_yyy", "error_zzz"])

分階段自訂任務Hang異常檢測

目前任務Hang異常檢測的配置是針對整個任務的,但是任務狀態是分階段的。例如:在任務初始化階段,各個節點建立通訊可能耗時比較長,但訓練階段日誌更新比較快。為了在訓練過程中能快速發現任務Hang異常的節點,DLC提供了分階段自訂任務Hang異常檢測功能,支援您在不同訓練階段配置不同的任務Hang異常檢測時間長度,具體配置方法如下。

monitor.reset_config(jm_config_params)

# Example:
#     monitor.reset_config(job_hang_interval=10)
#     or
#     config_params = {"job_hang_interval": 10, }
#     monitor.reset_config(**config_params)

PyTorch任務分階段自訂任務Hang異常檢測樣本如下。

import torch
import torch.distributed as dist
from aimaster import job_monitor as jm

jm_config_params = {
    "job_hang_interval": 1800 # 全域30min檢測。
}
jm_config = jm.PyTorchConfig(**jm_config_params)
monitor = jm.Monitor(config=jm_config)

dist.init_process_group('nccl')

...

# impl these two funcs in aimaster sdk
# user just need to add annotations to their func
def reset_hang_detect(hang_seconds):
    jm_config_params = {
        "job_hang_interval": hang_seconds
    }
    monitor.reset_config(**jm_config_params)

def hang_detect(interval):
    reset_hang_detect(interval)
    ...

@hang_detect(180) # reset hang detect to 3 min, only for func scope
def train():
    ...

@hang_detect(-1) # disable hang detect temperally, only for func scope
def test():
    ...

for epoch in range(0, 100):
    train(epoch)
    test(epoch)
    self.scheduler.step()
                            

使用C4D

C4D(Calibrating Collective Communication over Converged ethernet - Diagnosis),是由阿里雲自研的用於大模型訓練中任務Slow(慢)或任務Hang(掛起)的問題診斷工具。C4D的使用依賴阿里雲自研高效能集合通訊庫ACCL,請確保ACCL已安裝完成,詳情請參見ACCL:阿里雲自研高效能集合通訊庫。目前,DLC任務選擇靈駿智算資源時,可以使用C4D檢測功能。

功能介紹

C4D通過匯總任務內所有節點在集合通訊過程中的狀態資訊,進而綜合分析判斷是否有節點出現了通訊或非通訊層面的問題。整體系統架構如下圖所示:

全量參數說明

目前,開啟C4D檢測功能後,在其他配置文字框中支援配置的參數如下:

參數

描述

樣本值

--c4d-log-level

設定C4D輸出記錄層級,取值如下:

  • Info

  • Warning( 預設值)

  • Error

預設值為Warning,表示會輸出Warning和Error層級的日誌。建議在正常運行情況下使用預設值。若需排查效能問題,則可將其設定為Info層級。

--c4d-log-level=Info

--c4d-common-envs

設定C4D執行的環境變數,格式為k1=v1,k2=v2,多個變數之間用半形逗號(,)分隔,預設為空白。可選環境變數如下:

  • C4D_HANG_TIMEOUT:表示任務Hang(掛起)多長時間進行提示(Warning)。預設值為10000000,單位為微秒(即預設值為10秒)。

  • C4D_HANG_TIMES:表示任務Hang(掛起)次數達到指定次數時記錄Error日誌,進而觸發節點自動化隔離邏輯。和C4D_HANG_TIMEOUT配合使用,預設值為18次(即預設掛起3分鐘會觸發節點自動化隔離)。

  • C4D_CONN_BW_CHECK_PERIOD:設定檢測頻寬的時間間隔,預設值為10秒。

  • C4D_RUNTIME_LOG_LEVEL:指定C4D運行時記錄層級。取值如下:

    • TRACE

    • DEBUG

    • INFO(預設值)

    • WARNING

    • ERROR

    • FATAL

  • C4D_ENABLE_STATS_OUTPUT:是否輸出C4D相關統計資料。取值如下:

    • TRUE

    • FALSE(預設值)

--c4d-common-envs=C4D_HANG_TIMEOUT=1,C4D_HANG_TIMES=2

當前針對Error層級的日誌,AIMaster會自動化加黑對應節點,並重新拉起任務。當前每個層級Tlog邏輯如下:

錯誤等級

錯誤描述

處理動作

Error

預設情況下,如果通訊層面Hang(掛起)時間超過三分鐘,則會導致任務失敗。您可以通過配置C4D_HANG_TIMEOUT和C4D_HANG_TIMES兩個參數來修改預設值。

AIMaster會直接自動化隔離日誌中的節點。

Warn

預設情況下,如果通訊層面Hang(掛起)時間超過10秒,雖然影響效能,但不會導致任務失敗。您可以通過配置C4D_HANG_TIMEOUT參數來修改預設值。

暫時不會自動化隔離日誌中的節點,需要人工二次確認。

非通訊層面Hang(掛起)時間超過10秒,有可能會導致任務失敗。

暫時不會自動化隔離日誌中的節點,需要人工二次確認。

Info

通訊層面慢和非通訊層面慢。

這部分診斷記錄主要是針對效能問題,需要人工二次確認。

在DLC任務運行過程中,如果發現任務Slow(慢)或Hang(掛起)的情況,您可以在DLC工作清單中,單擊任務名稱,進入任務概覽頁面。在下方的執行個體地區,查看任務的AIMaster節點日誌,即可看到C4D的診斷結果。關於診斷結果詳情,請參見診斷結果範例5bc5051b1abae830588522ab7a50b23f

診斷結果範例

  • RankCommHang:表示有節點出現了通訊層面Hang(掛起)的問題。image

  • RankNonCommHang:表示有節點出現了非通訊層面Hang(掛起)的問題,例如計算部分出現了Hang(掛起)。image

  • RankCommSlow:表示有節點出現了通訊層面慢的問題。image

  • RankNonCommSlow:表示有節點出現了非通訊層面慢的問題。image

常見問題集

如何安裝AIMaster SDK

根據您使用的Python版本選擇對應的whl包進行安裝。

# py36
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp36-cp36m-linux_x86_64.whl

# py38
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp38-cp38-linux_x86_64.whl

# py310
pip install -U http://odps-release.cn-hangzhou.oss.aliyun-inc.com/aimaster/pai_aimaster-1.2.1-cp310-cp310-linux_x86_64.whl