diff --git a/docs/0.quickstart.md b/docs/0.quickstart.md index 6561ccccd7df817f8f403a525c60ccd34df1eb3f..ad3ba5d37d6353acefed4d7f3e3eb61d7bff4b75 100644 --- a/docs/0.quickstart.md +++ b/docs/0.quickstart.md @@ -58,6 +58,8 @@ LD_PRELOAD=/usr/local/lib/libunwind.so.8.2.0:/usr/local/lib/libunwind-aarch64.so LD_PRELOAD=/home/ascend-toolkit-bak/ascend-toolkit/8.0.RC3.10/tools/mspti/lib64/libmspti.so:/systrace/build/libsysTrace.so python ... ``` + + ### 动态开关 sysTrace支持动态开启采集数据,采集数据类型支持动态开启,sysTrace提供二进制工具sysTrace_cli,当前L0数据是常态开启,L1/2/3类型数据可自行决定是否开启,使用命令如下: @@ -91,6 +93,79 @@ drwxr-xr-x. 2 root root 4096 Jun 12 17:01 timeline ##torch_npu层数据 drwxr-xr-x. 2 root root 4096 Jun 12 17:01 osprobe ##offcpu/cpu事件 ``` +sysTrace支持动态开启采集数据,当前支持以下级别的数据: + +- L0:采集torch_npu层数据,采集数据类型包括如下数据(常态化采集) + + ```protobuf + message Pytorch { + repeated PytorchStage pytorch_stages = 1; + uint32 rank = 2; // rank号 + } + + message PytorchStage { + uint32 stage_id = 1; // AI训练迭代轮次 + string stage_type = 2; // AI训练迭代阶段 + uint64 start_us = 3; // 当前迭代阶段的开始时间 + uint64 end_us = 4; // 当前迭代阶段的结束时间 + repeated string stack_frames = 5; //当前迭代阶段的python调用栈 + oneof debug_data { + GcDebugData gc_debug = 6; //当前迭代阶段的GC数据 + } + } + ``` + +- L1:采集通信算子数据,采集数据包括如下数据 + + ```python + Flag,Id,Kind,Name,SourceKind,Timestamp,msptiObjectId_Ds_DeviceId,msptiObjectId_Ds_StreamId,msptiObjectId_Pt_ProcessId,msptiObjectId_Pt_ThreadId + ``` + +- L2:采集cann层的内存数据,采集数据包括如下数据 + + ```protobuf + message ProcMem { + uint32 pid = 1; //线程号 + repeated MemAllocEntry mem_alloc_stacks = 2; //内存申请调用栈 + repeated MemFreeEntry mem_free_stacks = 3; //内存释放调用栈 + } + + message MemAllocEntry { + uint64 alloc_ptr = 1; //内存申请起始地址 + uint32 stage_id = 2; //训练迭代轮次 + StageType stage_type = 3; //当前迭代阶段 + uint64 mem_size = 4; //内存申请大小 + repeated StackFrame stack_frames = 5; //内存申请调用栈 + } + + message MemFreeEntry { + uint64 alloc_ptr = 1; //内存释放起始地址 + uint32 stage_id = 2; //训练迭代轮次 + StageType stage_type = 3; //当前迭代阶段 + } + + ``` + +- L3: 采集offcpu/oncpu/mem事件 + + ```protobuf + message OSprobe { + repeated OSprobeEntry OSprobe_entries = 1; + } + + message OSprobeEntry { + uint32 key = 1; // pid/cpuid + uint64 start_us = 2; //事件的开始时间 + uint64 dur = 3; //事件的持续时间 + uint64 rundelay = 4; //cpu调度时延 + uint32 OS_event_type = 5; // 事件类型 + uint32 rank = 6; //卡号 + string comm = 7; //当前进程 + string nxt_comm = 8; //即将执行的进程名字 + uint32 nxt_pid = 9; //即将执行进程的pid + } + ``` + ### 数据转换 ```shell @@ -118,7 +193,9 @@ python /sysTrace/convert/convert_osprobe_to_timeline.py --outp ### 数据分析 -#### failslow参数配置 +#### failslow算法 + +##### failslow参数配置 | 参数 | 类型 | 参数说明 | 举例 | | --------------------------- | ------ | ---------------------------------------------------- | ------------------------------------------------------------ | @@ -133,34 +210,16 @@ python /sysTrace/convert/convert_osprobe_to_timeline.py --outp | k_sigma | int | bboxplot算法的ksigma取值 | 3 | | anomaly_degree_thr | float | 检测值偏离均值的程度 | 0.2 | -#### failslow算法 - -算法安装 - -```shell -##安装 -python setup.py install -``` - -感知算法执行 +##### 感知算法执行 ```shell ## L0感知 python failslow/fail_slow_detection.py ``` -慢卡定界算法执行 +##### failslow算法输出 -```shell -## L1定界 -systrace-failslow -## 或者 -python failslow/main.py -``` - -**注意:算法执行前,需[参考文档](https://gitee.com/openeuler/sysTrace/blob/master/failslow/docs/conf_introduction.md)配置对应的数据路径** - -#### failslow算法输出字段 +**感知结果字段表** | 字段 | 类型 | 说明 | 举例 | | ------------------- | ------ | ------------------------------------- | ------------------------------------------------------------ | @@ -171,7 +230,7 @@ python failslow/main.py | start_time | int | 检测开始时间 | 1749728380752 | | end_time | int | 检测结束时间 | 1749728419305 | -样例 +**输出样例** ```json { @@ -190,5 +249,210 @@ python failslow/main.py } ``` - +#### 慢卡定界算法 + +##### 慢卡定界算法配置 + +在文件model_config.json中,配置模型运行所需的参数。该配置项中,主要包含: + +- with_fail_slow: 配置启动慢节点检测性能劣化来源于性能劣化检测的时刻还是手动配置, 默认为false +- slow_node_detection_range_times:慢节点检测输入的时间范围,默认为空列表 +- slow_node_detection_time_span_hours:慢节点检测的时间长度,默认为0.5小时 +- slow_node_detection_path:慢节点检测结果保存路径,默认为"/etc/systrace/result/slow_node" +- data_type:算子数据的格式,默认为”json“ +- root_path: 算子数据的输入路径,默认为”/home/hbdir/systrace_failslow/data/baseline“ +- enable_detect_type:检测不同故障类型的开关,字典格式 + - enable_cal: 计算慢开关,默认为true + - enable_op_launch: 算子下发慢开关,默认为false + - enable_op_launch: Kafka对应的`server port`,如:"9092"; + - enable_comm: 通信慢开关,默认为false + - enable_dataloader: 输入模型数据加载慢开关,默认为false + - enable_ckpt: 模型保存慢开关,默认为false + +- fail_slow_ops: 检测不同故障类型对应的观测点,字典格式 + - cal_slow:计算慢对应的观测点,默认为"HcclAllGather" + - op_launch_slow:算子下发慢对应的观测点,默认为“HcclAllGather_launch” + - comm_slow:通信慢对应的观测点,默认为“HcclBatchSendRecv” + - dataloader_slow:输入模型数据加载慢对应的观测点,默认为“Dataloader” + - ckpt_slow: 模型保存满对应的观测点,默认为“SaveCkpt” + +save_image:时序数据保存的路径,用于debug算法效果,默认为“image” + +- record_kpi: 时序数据是否记录到检测结果中,默认为false +- use_plot: 时序数据保存开关,用于debug算法效果,默认为false +- max_num_normal_results:检测结果最大记录正常节点数据数量,默认为16 +- look_back:告警抑制,默认为20min +- hccl_domain: 通信域默认配置,格式为字典,默认为{},实际配置示例{"tp":[[0,1,2,3], [4,5,6,7]], "dp":[[0,4], [1,5],[2,6],[3,7]]} +- rank_table_json: rank_table配置文件路径,用于mindspore通信域配置,默认路径"./rank_table.json" +- debug_data:denug模式,会保存算子执行和算子下发的中间文件,默认为false + +在文件metric_config.json中,配置所有指标的检测算法参数,每个指标独立配置。该配置项中以**HcclAllGather**指标配置举例,主要包含: + +- metric_type:指标类型,string类型,取值“device”和“host”, +- aggregation:指标聚合配置,字典 + - during_s:聚合窗口大小, int类型,默认5s + - funcs:聚合方法配置,list类型,包含元素为dict类型 + - func: 聚合方法,string类型,有“min”,"max","mean","percentile"等 + - func_params: 聚合方法配置参数,字典类型,根据不同的聚合方法配置,默认为空 + +- priority:指标类型,string类型,取值“device”和“host”, +- aggregation:检测优先级,int类型 +- alarm_filter_window_size:告警过滤窗口大小,表示检测出的异常点连续个数,int类型,默认值为5 +- space_detector: 节点间对比检测器配置,不配置为“null” + - dist_metric: 节点间距离函数类型,“euclidean”, string类型 + - eps:Dbscan聚类参数的阈值,点间距离大于该值则为另一类, float类型 + - cv_threshold:判断值偏离均值的程度,偏移过大则认为是异常点,float类型 + - min_samples:dbscan最小成新簇的点数, int类型 + - window_size:窗口大小,表示单次检测的窗口,不重叠,int类型 + - scaling:表示时间序列是否归一化, bool类型 + - type:空间检测器类型,string类型,取值“SlidingWindowDBSCAN”,“OuterDataDetector” + +- time_detector:单节点时序异常检测配置, 不配置为“null” + - preprocess_eps: Dbscann预处理的阈值, float类型 + - preprocess_min_samples:Dbscan预处理的最小点数,int类型 + - type:时间检测器类型,string类型,取值为“TSDBSCANDetector”,“SlidingWindowKSigmaDetector” + - n_sigma_method:当为“SlidingWindowKSigmaDetector”类型时,配置字段,dict类型 + - type:SlidingWindowKSigmaDetector采用的检测算法,可替换扩展,string类型,默认为”SlidingWindowNSigma“ + - training_window_size:滑动窗口的最大值,超过该值,覆盖已有value,int类型 + - min_update_window_size:滑动窗口的最小更新值,int类型 + - min_std_val:最小标准差,当标准差为0时,设置为最小标准差,float类型 + - bias:边界基础上的偏置系数,float类型 + - abs_bias:边界基础上的偏置值,float类型 + - nsigma_coefficient:Ksigam的系数,int类型 + - detect_type:检测边界类型,string类型,取值为“lower_bound”,“upper_bound”,“bi_bound” + - min_expert_lower_bound:下边界最小专家阈值,null表示不设置专家阈值,int或者null类型 + - max_expert_lower_bound:下边界最大专家阈值,null表示不设置专家阈值,int或者null类型 + - min_expert_upper_bound:上边界最小专家阈值,null表示不设置专家阈值,int或者null类型 + - max_expert_upper_bound:上边界最大专家阈值,null表示不设置专家阈值,int或者null类型 + +##### 慢卡定界算法执行 + +```shell +## L1定界 +systrace-failslow +## 或者 +python failslow/main.py +``` + +**注意:算法执行前,需[参考文档](https://gitee.com/openeuler/sysTrace/blob/master/failslow/docs/conf_introduction.md)配置对应的数据路径** + +##### 慢卡定界算法输出 + +**慢卡定界算法输出字段表** + +| 字段 | 类型 | 说明 | 举例 | +| -------------- | ------ | -------------------------------- | ------------ | +| resultCode | int | 结果码,200表示正常,201表示异常 | 200 | +| compute | bool | 计算导致的慢卡 | false | +| network | bool | 通信导致的慢卡 | false | +| storage | bool | 存储导致的慢卡 | false | +| abnormalDetail | list | 异常rank卡的信息 | 详见下方示例 | +| normalDetail | list | 正常rank卡的信息 | 详见下方示例 | +| errorMsg | string | 记录异常信息, | “” | +| timestamp | int | 故障发生时间 | 1749085300 | + +**输出样例** + +``` +{ + "resultCode": 201, + "compute": true, + "network": false, + "storage": false, + "abnormalDetail": [ + { + "objectId": "3", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_3", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [ + 0, + 1, + 2, + 4, + 5, + 6, + 7 + ], + "omittedDevices": [] + } + ], + "normalDetail": [ + { + "objectId": "0", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_0", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "1", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_1", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "2", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_2", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "4", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_4", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "5", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_5", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "6", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_6", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + }, + { + "objectId": "7", + "serverIp": "9.13.100.7", + "deviceInfo": "rank_7", + "kpiId": "HcclAllGather", + "methodType": "SPACE", + "kpiData": [], + "relaIds": [], + "omittedDevices": [] + } + ], + "errorMsg": "", + "timestamp": 1749084984 +} +``` diff --git a/failslow/failslow/main.py b/failslow/failslow/main.py index 1eaa7846da9eda5cfb0a4c29ea6da28f1e72c3e6..2eb44eb9b1299e95d4aebc3df44383a56038e076 100644 --- a/failslow/failslow/main.py +++ b/failslow/failslow/main.py @@ -95,6 +95,7 @@ def main(): json.dump(response, f) logger.info("==========finished slow node result record ========") + return response if __name__ == "__main__": try: