AIMaster:弹性自动容错引擎

本文为您介绍如何使用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:表示开启。如果所有实例的StdoutStderr日志在指定时间内没有更新,将触发任务重启。

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实例。当PSChief实例出错时,下面的配置默认不允许重启任务。如果您希望重启任务,可以将--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())

发送到钉钉群的消息通知示例如下:

  • 任务Hang重启通知示例image.png

  • 用户自定义消息通知示例image.png

配置自定义容错关键字

容错监控功能已内置了常见的可重试错误的监控模块,如果您希望任务异常实例日志中出现某些关键字时也进行容错,则可以在您的代码中使用以下方法进行配置。配置完成后,容错监控模块会扫描失败的实例尾部日志进行关键信息匹配。

说明

容错策略需要配置为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通过汇总任务内所有节点在集合通信过程中的状态信息,进而综合分析判断是否有节点出现了通信或非通信层面的问题。整体系统架构如下图所示:

image

全量参数说明

目前,开启C4D检测功能后,在其他配置文本框中支持配置的参数如下:

参数

描述

示例值

--c4d-log-level

设置C4D输出日志级别,取值如下:

  • Info

  • Warning( 默认值)

  • Error

默认值为Warning,表示会输出WarningError级别的日志。建议在正常运行情况下使用默认值。若需排查性能问题,则可将其设置为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会自动化加黑对应节点,并重新拉起任务。当前每个级别日志处理逻辑如下:

错误等级

错误描述

处理动作

Error

默认情况下,如果通信层面Hang(挂起)时间超过三分钟,则会导致任务失败。您可以通过配置C4D_HANG_TIMEOUTC4D_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