本文為您介紹如何使用DLC提供的基於AIMaster的容錯監控功能。
背景資訊
如今,深度學習已被廣泛使用,隨著模型和資料規模越來越大,常採用分布式方式運行深度學習任務。當同一個任務運行執行個體個數增大後,由於依賴的軟體棧和硬體環境都有可能出現偶發異常,會導致任務停止運行。
為了保障大規模分布式深度學習任務穩定運行,DLC提供了基於AIMaster的容錯監控功能。AIMaster是一個任務層級的組件,當任務開啟AIMaster的容錯監控功能後,會拉起一個AIMaster執行個體和任務其他執行個體一起運行,起到任務監控、容錯判斷、資源控制的作用。
步驟一:配置容錯監控參數
當前容錯監控功能支援配置的全量參數如下,您可以參考常用參數配置樣本,提前規劃好要為任務配置的容錯監控內容。後續開啟容錯監控功能時,可以根據需求設定到容錯監控的其他配置處。
全量參數說明
容錯監控支援配置以下參數。
配置分類 | 功能介紹 | 配置參數 | 參數說明 | 預設值 |
通用配置 | 任務運行類型 | --job-execution-mode | 配置任務運行類型,取值如下:
不同任務類型容錯行為不同。對於可重試錯誤:
| Sync |
任務重啟設定 | --enable-job-restart | 在滿足容錯條件或檢測到運行時異常時,是否允許任務重啟。取值如下:
| False | |
--max-num-of-job-restart | 配置任務最大重啟次數。超過最大重啟次數後,會將任務標記為失敗。 | 3 | ||
運行時配置 說明 針對沒有執行個體運行失敗的情境。 | 任務Hang(掛起)異常檢測 | --enable-job-hang-detection | 是否開啟任務運行時的Hang異常檢測,只支援同步任務。取值如下:
| 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 | |
--job-exit-hang-interval | 配置任務退出時停止執行的持續時間長度,正整數,單位為秒。 當任務退出時間長度超過該值時,則將任務標記為異常,並觸發任務重啟。 | 600 | ||
容錯配置 說明 針對有執行個體運行失敗的情境。 | 容錯策略 | --fault-tolerant-policy | 容錯策略參數取值如下:
| 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角色,對於任務啟動並執行過程進行全程監控,並且在遇到相應錯誤的時候進行容錯處理。
其中:
支援在其他配置文字框中配置額外參數,參數配置說明請參見步驟一:配置容錯監控參數。
啟用任務掛起檢測後,可開啟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輸出記錄層級,取值如下:
預設值為Warning,表示會輸出Warning和Error層級的日誌。建議在正常運行情況下使用預設值。若需排查效能問題,則可將其設定為Info層級。 |
|
--c4d-common-envs | 設定C4D執行的環境變數,格式為
|
|
當前針對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的診斷結果。關於診斷結果詳情,請參見診斷結果範例。
診斷結果範例
RankCommHang:表示有節點出現了通訊層面Hang(掛起)的問題。
RankNonCommHang:表示有節點出現了非通訊層面Hang(掛起)的問題,例如計算部分出現了Hang(掛起)。
RankCommSlow:表示有節點出現了通訊層面慢的問題。
RankNonCommSlow:表示有節點出現了非通訊層面慢的問題。
常見問題集
如何安裝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