全部產品
Search
文件中心

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

更新時間:Jul 13, 2024

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

背景資訊

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

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

使用流程

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

    首先根據AIMaster支援的全量參數說明,並參考容錯監控參數常見配置樣本,來配置額外參數。

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

    您可以在提交DLC訓練任務時,通過控制台或SDK的方式開啟容錯監控功能。任務運行異常時,會根據配置的額外參數,對任務進行相應的處理,從而保障任務能正常運行。

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

    如果當前的容錯監控配置不能滿足您的要求,您可以使用容錯監控增強功能,支援通過AIMaster SDK自訂容錯關鍵字。任務運行過程中,AIMaster會自動掃描出錯節點的日誌,並和自訂容錯資訊對比,如果滿足容錯條件,也會觸發容錯。另外也支援訊息通知,當DLC任務發生異常並進行自動容錯處理時,會發送訊息通知。

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

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

全量參數說明

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

配置分類

功能介紹

配置參數

參數說明

預設值

通用配置

任務運行類型

--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

任務退出時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其中:其他配置,請參見步驟一:配置容錯監控參數

通過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()
                            

常見問題集

如何安裝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