整网首个溢出节点分析
简介
在分析inf、nan的场景下,会采集多个rank下的多个step的dump数据,前面出现的异常会传播到同rank后续的节点,并通过通信算子传播到其他rank的后续节点中,因此如何分析首个nan出现的节点位置尤为重要。
整网首个溢出节点分析(overflow_check)可以对PyTorch的dump数据进行分析,在多卡场景下,检测到每张卡中产生inf/nan的节点。若是经过通信导致的inf/nan,可以分析并找出首个产生inf/nan的rank和节点。
使用前准备
环境准备
安装msProbe工具,详情请参见《msProbe安装指南》。
数据准备
采集精度数据,详情请参见PyTorch场景精度数据采集。
约束
当前仅支持分析PyTorch场景的dump数据。
功能介绍
功能说明
对PyTorch的dump数据进行分析。
命令格式
msprobe overflow_check -i <input_path> -o <output_path>
参数说明
| 参数 | 可选/必选 | 说明 |
|---|---|---|
| -i或--input_path | 必选 | dump数据的目录,需指定到step层级,如-i /xxx/dump/step0。 |
| -o或--output_path | 可选 | 输出文件的目录,默认未配置,表示在当前目录下创建./output目录。 |
使用示例
msprobe overflow_check -i /xxx/dump/step0 -o ./output
输出说明
当打印如下日志时,分析认为不存在异常节点,不生成分析文件。
Cannot find any anomaly node, no need to generate analyze file.
存在异常节点时,生成anomaly_analyze_{timestamp}.json文件,结构为:
{
"rank_0": [ // 卡号
{
"op_name": "Tensor.op_name.0.forward", // 节点名
"data_info": {
"input_args": [], // input_args数据
"input_kwargs": {}, // input_kwargs数据
"output": [] // output数据
},
"construct_info": [], // 节点层级数据
"stack_info": {} // 堆栈数据
}
]
}
异常判定
异常计算节点判定
当某个计算节点的输入值正常,即Max或Min中不存在inf或nan,而输出值存在异常时认为从此节点开始产生了溢出,并有可能向后传递。
异常通信节点判定
通信节点按照功能分为有向节点,如send, recv, scatter, gather, broadcast, reduce等,以及无向节点,如all_gather, all_reduce, reduce_scatter, all_to_all等。
对于有向节点,当src节点的input存在异常时,通常认为传入的数据中本身就存在异常,因此考虑异常节点发生在src节点所在rank的上一个或多个计算节点中;当src节点的input正常而output存在异常值,或dst节点的output存在异常值时,考虑是通信节点本身的操作产生了异常数据。
对于无向节点,当节点input存在异常时,认为传入的数据中本身就存在异常,因此考虑异常节点发生在src节点所在rank的上一个或多个计算节点中;当input正常而output异常时,考虑是通信节点本身的操作产生了异常数据。
顺序判定
对于相连的有向通信算子,认为src节点的异常发生早于dst节点;对于无向通信算子,认为异常是同时发生的。
对于计算节点,按照dump的顺序排序。