本文为您介绍如何使用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会自动化加黑对应节点,并重新拉起任务。当前每个级别日志处理逻辑如下:
错误等级 | 错误描述 | 处理动作 |
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