diff --git a/profiler/merge_profiling_timeline/README.md b/profiler/merge_profiling_timeline/README.md index 2d29079570c834e0f4a1929b96a8bcd03949be70..822cce3e80c8e03424fb7cc709a89d68ab9ce494 100644 --- a/profiler/merge_profiling_timeline/README.md +++ b/profiler/merge_profiling_timeline/README.md @@ -1,15 +1,18 @@ -# Profiling merge tool +# Profiling merge timeline tool ## 介绍 + 本工具支持合并profiling的timeline数据,支持合并指定rank的timline、合并指定timeline中的item ## 1 多timeline融合 ### 1.1 数据采集 + 使用msporf采集数据,将采集到的所有节点的profiling数据拷贝到当前机器同一目录下,以下假设数据在/home/test/cann_profiling下 -e2e profiling数据目录结构如下, 合并timeline必需数据:`msprof*.json`和`info.json.*`: +e2e profiling数据目录结构如下: + ``` |- cann_profiling |- PROF_*** @@ -21,7 +24,9 @@ e2e profiling数据目录结构如下, 合并timeline必需数据:`msprof*.jso |- PROF_*** ... ``` -ascend pytorch profiling数据目录结构如下 + +ascend pytorch profiler数据目录结构如下: + ``` |- ascend_pytorch_profiling |- **_ascend_pt @@ -36,15 +41,15 @@ ascend pytorch profiling数据目录结构如下 ### 1.2 合并timeline 可选参数: + - -d: **必选参数**,profiling数据文件或文件夹路径 -- -t: **当需要融合多机多卡timeline时需要校准多机间的时间**,传入时间校准的time_difference.json文件路径, 该文件的获取参考[节点间时间差获取](https://gitee.com/aerfaliang/merge_profiling_timeline/tree/master/get_nodes_timediff) - -o: 可选参数,指定合并后的timeline文件输出的路径,默认为'-d'输入的路径 - --rank:可选参数,指定需要合并timeline的卡号,默认全部合并 - --items:可选参数,指定需要合并的profiling数据项,默认全部合并 - --type: 指定需要合并timeline场景,可选参数:`pytorch`, `e2e`, `custom` - `pytorch`:通过ascend pytorch方式采集profiling数据,合并所有卡的trace_view.json - `e2e`:通过e2e方式采集profiling数据,优先合并总timeline,没有生成则选择合并device目录下的msprof_*.json - - `custom` :自定义需要合并的timeline数据,具体参考第2章节 + - `custom` :自定义需要合并的timeline数据,具体参考示例 @@ -52,6 +57,7 @@ ascend pytorch profiling数据目录结构如下 **使用示例**: 1、合并单机多卡timeline,默认合并所有卡、所有数据项: + ``` python3 main.py -d path/to/cann_profiling/ ``` @@ -63,23 +69,15 @@ python3 main.py -d path/to/cann_profiling/ --rank 0,1 ``` 3、合并单机多卡timeline,合并所有卡的CANN层和Ascend_Hardware层数据 + ``` python3 main.py -d path/to/cann_profiling/ --items CANN,Ascend_Hardware ``` -4、合并多机多卡的timeline时, 需要-t指定节点间的时间误差文件路径, 用以校准节点间的时间: - -``` -python3 main.py -d path/to/cann_profiling/ -t path/to/time_difference.json --rank 0,8, -``` +4、合并多timeline(自定义) -合并timeline查看: -> 在 -o 指定的目录(默认在-d指定的目录下)的msprof_merged_*p.json为合并后的文件 +以上场景不支持的情况下,可以使用自定义的合并方式,将需要合并的timeline文件放在同一目录下,数据目录结构示意如下: -## 2 多timeline融合(自定义) -### 2.1 数据采集 -将需要合并的timeline文件全部放在同一目录下 -数据目录结构示意如下: ``` |- timeline |- msprof_0.json @@ -92,29 +90,29 @@ python3 main.py -d path/to/cann_profiling/ -t path/to/time_difference.json --ran |- step_trace_3.json ... ``` -### 2.2 合并timeline -使用脚本`merge_profiling_timeline/main.py`合并timeline -可选参数: -- -d: **必选参数**,指定profiling数据文件或文件夹路径 -- -o: 可选参数,指定合并后的timeline文件输出的路径,默认为'-d'输入的路径 -- --type: 指定需要合并timeline场景,指定参数:`custom` - - `custom` :自定义需要合并的timeline数据 **使用示例**: -将需要合并的所有timeline放在同一目录下,通过下面的命令合并所有timeline +通过下面的命令合并所有timeline,同样支持-o、--rank、--items等参数: + ``` python3 main.py -d path/to/timeline/ --type custom ``` -合并timeline查看:同 -## 3 超大timeline文件查看 +合并timeline查看: + +> 在 -o 指定的目录(默认在-d指定的目录下)的msprof_merged_*p.json为合并后的文件 + + +## 2 超大timeline文件查看 + +下载whl包并安装(windows): +https://gitee.com/aerfaliang/trace_processor/releases/download/trace_processor_37.0/trace_processor-37.0-py3-none-any.whl + +安装完成后直接使用以下命令 -直接使用以下命令 ``` -cd merge_profiling_timeline -python ./trace_processor --httpd path/to/msprof_merged_*p.json +python3 ./trace_processor --httpd path/to/msprof_merged_*p.json ``` -等待加载完毕,刷新[perfetto](https://ui.perfetto.dev/)界面,点击`YES, use loaded trace`即可展示timeline - +等待加载完毕,刷新[perfetto](https://ui.perfetto.dev/)界面,点击`YES, use loaded trace`即可展示timeline \ No newline at end of file diff --git a/profiler/merge_profiling_timeline/main.py b/profiler/merge_profiling_timeline/main.py index eac48f5683961ae4a139dea5daaee049e406784c..c2b3be9ca160fefede5737ba8e119c653561830d 100644 --- a/profiler/merge_profiling_timeline/main.py +++ b/profiler/merge_profiling_timeline/main.py @@ -106,8 +106,8 @@ def get_absolute_ts_start_info(pro_path) -> float: if start_json: with open(start_json, "r+") as f: info = json.load(f) - ts_us = float(info.get("collectionTimeBegin"), 0) - ts_ns = float(info.get("clockMonotonicRaw"), 0) + ts_us = float(info.get("collectionTimeBegin", 0)) + ts_ns = float(info.get("clockMonotonicRaw", 0)) if not ts_us and not ts_ns: return 0 return ts_us-ts_ns/1000 @@ -183,15 +183,15 @@ def merge_timeline_events(timeline_file_dict, process_list): if event.get("name") == "process_name" and event.get("ph") == "M": if event.get("args"): proc_pid_dict[event["args"].get("name")] = event.get("pid") - process_list = process_list if process_list else list(proc_pid_dict.keys()) + process_list_tmp = process_list if process_list else list(proc_pid_dict.keys()) # 提取待合并的items的pid merged_pids = set() - for pro in process_list: + for pro in process_list_tmp: pro = " ".join(pro.split("_")) if "_" in pro else pro if pro not in proc_pid_dict.keys(): - print(f"{pro} is invalid item, valid items: {list(proc_pid_dict.keys())}") - continue + print(f"main.py: error argument --items: invalid choice: '{pro}' (choose from {list(proc_pid_dict.keys())})") + return merged_pids.add(proc_pid_dict.get(pro)) for event in cur_events: