From 6b9ec5ef4c7241bbdd0c224feed1c1e6bda0e7bf Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Wed, 18 Mar 2026 16:05:29 +0800 Subject: [PATCH 01/16] add st of torch --- .github/workflows/cluster_analysis.yml | 6 +- tests/special_e2e/__init__.py | 13 ++++ tests/special_e2e/test_torch_e2e.py | 44 ++++++++++++ torch_data/jsontojsongz.py | 46 ++++++++++++ .../prof_rank-0_031847.json | 45 ++++++++++++ .../prof_rank-0_031847.json.gz | Bin 0 -> 878 bytes .../prof_rank-1_031847.json | 45 ++++++++++++ .../prof_rank-1_031847.json.gz | Bin 0 -> 879 bytes .../actor_update/prof_rank-0_031904.json | 45 ++++++++++++ .../actor_update/prof_rank-0_031904.json.gz | Bin 0 -> 878 bytes .../actor_update/prof_rank-1_031904.json | 45 ++++++++++++ .../actor_update/prof_rank-1_031904.json.gz | Bin 0 -> 879 bytes ...i_372640.1771730291744166997.pt.trace.json | 68 ++++++++++++++++++ ...72640.1771730291744166997.pt.trace.json.gz | Bin 0 -> 1027 bytes ...i_372640.1771730370159969000.pt.trace.json | 68 ++++++++++++++++++ ...72640.1771730370159969000.pt.trace.json.gz | Bin 0 -> 1026 bytes torch_data/rl_timeline.html | 7 ++ 17 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 tests/special_e2e/__init__.py create mode 100644 tests/special_e2e/test_torch_e2e.py create mode 100644 torch_data/jsontojsongz.py create mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json create mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz create mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json create mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz create mode 100644 torch_data/profile_meta/actor_update/prof_rank-0_031904.json create mode 100644 torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz create mode 100644 torch_data/profile_meta/actor_update/prof_rank-1_031904.json create mode 100644 torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz create mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json create mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz create mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json create mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz create mode 100644 torch_data/rl_timeline.html diff --git a/.github/workflows/cluster_analysis.yml b/.github/workflows/cluster_analysis.yml index 7eade20..1a9f90b 100644 --- a/.github/workflows/cluster_analysis.yml +++ b/.github/workflows/cluster_analysis.yml @@ -44,4 +44,8 @@ jobs: - name: Run cluster_analyse tests run: | - pytest -s -x tests/cluster_analysis \ No newline at end of file + pytest -s -x tests/cluster_analysis + + - name: Run special_e2e tests + run: | + pytest -s -x tests/special_e2e diff --git a/tests/special_e2e/__init__.py b/tests/special_e2e/__init__.py new file mode 100644 index 0000000..8be1d6c --- /dev/null +++ b/tests/special_e2e/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2025 verl-project authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/special_e2e/test_torch_e2e.py b/tests/special_e2e/test_torch_e2e.py new file mode 100644 index 0000000..390a335 --- /dev/null +++ b/tests/special_e2e/test_torch_e2e.py @@ -0,0 +1,44 @@ +# Copyright (c) 2025 verl-project authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +from pathlib import Path +from rl_insight.main import main + + +def test_torch_e2e_with_input_path(monkeypatch, tmp_path): + # 定义输入输出目录(相对于当前工作目录) + test_dir = Path(__file__).parent.parent.parent + input_dir = test_dir / "torch_data" + output_dir = tmp_path / "torch_output" + + # 确保输入目录存在 + assert input_dir.exists(), f"Input directory {input_dir} does not exist" + + # 设置命令行参数 + test_args = [ + "main.py", + f"--input-path={input_dir}", + f"--output-path={output_dir}", + "--profiler-type=torch", # 显式指定(默认 mstx) + # 其他参数可按需添加,如 --vis-type=html(默认)、--rank-list=all(默认) + ] + monkeypatch.setattr(sys, "argv", test_args) + + # 执行主函数 + main() + + # 验证输出文件(生成 rl_timeline.html) + output_file = output_dir / "rl_timeline.html" + assert output_file.exists() diff --git a/torch_data/jsontojsongz.py b/torch_data/jsontojsongz.py new file mode 100644 index 0000000..df41592 --- /dev/null +++ b/torch_data/jsontojsongz.py @@ -0,0 +1,46 @@ +import os +import json +import gzip +from pathlib import Path + +def convert_json_to_gz(directory_path): + """ + 将指定目录下所有 .json 文件转换为 .json.gz 格式。 + + 参数: + directory_path (str or Path): 目录路径 + """ + dir_path = Path(directory_path) + + if not dir_path.exists(): + print(f"目录不存在: {directory_path}") + return + + if not dir_path.is_dir(): + print(f"路径不是目录: {directory_path}") + return + + # 遍历目录中所有 .json 文件 + json_files = dir_path.glob("*/*.json") + + for json_file in json_files: + gz_file = json_file.with_suffix(".json.gz") + + try: + # 读取原始 JSON 文件 + with open(json_file, 'r', encoding='utf-8') as f_in: + data = json.load(f_in) + + # 写入压缩的 .json.gz 文件 + with gzip.open(gz_file, 'wt', encoding='utf-8') as f_out: + json.dump(data, f_out, ensure_ascii=False, indent=2) + + print(f"coverting: {json_file.name} -> {gz_file.name}") + + except Exception as e: + print(f"fail: {json_file.name} | 错误: {e}") + +# 使用示例 +if __name__ == "__main__": + target_directory = "./profile_meta" # 修改为你的目标目录 + convert_json_to_gz(target_directory) diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json new file mode 100644 index 0000000..e7a4619 --- /dev/null +++ b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json @@ -0,0 +1,45 @@ + +{ + "schemaVersion": 1, + "deviceProperties": [ + { + "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + } + ], + "cupti_version": 26, + "cuda_runtime_version": 12080, + "cuda_driver_version": 12080, + "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 0, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, + "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", + "displayTimeUnit": "ms", + "baseTimeNanoseconds": 1767189312000000000, + "traceEvents": [ + { + "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, + "ts": 4541015316353.111, "dur": 10083720.552, + "args": { + "cbid": 30, "correlation": 5 + } + }, + { + "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, + "args": { + "name": "ray::WorkerDict.actor_rollout_compute_log_prob" + } + }, + { + "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", + "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 + }, + { + "name": "Record Window End", "ph": "i", "s": "g", + "pid": "", "tid": "", "ts": 4541019157986.427 + } + ], + "traceName": "/tmp/tmpx5qz1t66.json" +} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..23efafa9ff21864e3357e72f5635832ea66c1a7e GIT binary patch literal 878 zcmV-!1Cjh6iwFqk)w5{=|8R0|W?yn)Zfh+tUobN$t5Ui8I@UF~onLoixNWybU2OQkD4bdVZesle^q) zZ+RY2bjb>G#-!q+1Y-{lYIDY}Ic3LER7`5ll=1wu4$r%5ZYG9j#_A6q)+H&Jv4Eqq zgUP{;_XYW&b84YUzMqR3$q!j!!ooO;V;IK?j=Cr+ifX0VA-NRN#3X$WFKf@J^AzOw z=~6P1sbeO0b3v~x4IhQigdDDN%_}J=Q>xAdao|9ZY~dz~@FVXHk<|(RV|fOsGpi+$ zEHlKMe}*H7ose=>oD{Z>Bh=fh2Wey1Uiz<<=Jjd$Fo>TC?DI4=@%<+D-rg>nv!*MP zExmq_0E$|BMpC&dH7}UshR9ERCnA&FIG+y4xYCl(%)w;`v5$wNx0S?ykxdIklH2k4 zT*xaXC!Fdbp<2jPiaZx9ov!D9nu|qhAkV;?2_9%B>#}$!nn*qNj&Dzeq)X3y-OPE; zWREp>EEX+T^v)ifTFEJ}Nwu-Rw8cgl!w3yA#IKR~W?llBdFQ;$#EmyKgY!M0`*5EI zX1-kFQ4$S96!$+D>X+?kjq8&xD*OA5fBk_viiVfU=x=-L{x1Lk0RR630PcI|?p_K2 E0MRk3mjD0& literal 0 HcmV?d00001 diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json new file mode 100644 index 0000000..4cfe4cf --- /dev/null +++ b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json @@ -0,0 +1,45 @@ + +{ + "schemaVersion": 1, + "deviceProperties": [ + { + "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + } + ], + "cupti_version": 26, + "cuda_runtime_version": 12080, + "cuda_driver_version": 12080, + "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 1, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, + "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", + "displayTimeUnit": "ms", + "baseTimeNanoseconds": 1767189312000000000, + "traceEvents": [ + { + "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, + "ts": 4541015316353.111, "dur": 10083720.552, + "args": { + "cbid": 30, "correlation": 5 + } + }, + { + "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, + "args": { + "name": "ray::WorkerDict.actor_rollout_compute_log_prob" + } + }, + { + "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", + "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 + }, + { + "name": "Record Window End", "ph": "i", "s": "g", + "pid": "", "tid": "", "ts": 4541019157986.427 + } + ], + "traceName": "/tmp/tmpx5qz1t66.json" +} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c833dd689825d9d8a7e5a08c81ca6efa4b993bf7 GIT binary patch literal 879 zcmV-#1Cab5iwFqk)w5{=|8R0|W?yn)Zfh+uUobN{yu5{ z0r_*3VS|C>Tf3xFrM0WpY@IYs$T3dh6)>}%zO3qhpADfnp-sDL(vTwX-R1l|=Z8D) z-oEiXpy-Mf!$q{uNR5mqgKP$OL=I@N!{vss9@#_!>(11(d3PMhQMo=`j+`L%nVY0WAq- zX+06ZVTdP_$taGd;Ut_)j*@Bc{^$@T2mTaIkI;sp?G05G68g?$tYL*XH0>G(FbZ%mgs`hU$kt7N_LCq+{t&x!gUF@o z`euWE-t6zn%?wB>Sx$7*gYnK;wYt0Ok=#s(Mu3Bznw@~BNMP*a;pk;0@%OT6fk<*Y z9$yG~$>fAnJtR~MnM#r8Vy)B7{7-YSObz5Ycrn3a&178`?_3k9$KKiPOh~%&%-79= z=S=okbH`%Qf@SaQ!OTidfnBPNecu*4Weg)U#1KD6;$t5Ui8I@UF~onLoixNWybU2OQkD4bdVZesle^q) zZ+RY2bjb>G#-!q+1Y-{lYIDY}Ic3LER7`5ll=1wu4$r%5ZYG9j#_A6q)+H&Jv4Eqq zgUP{;_XYW&b84YUzMqR3$q!j!!ooO;V;IK?j=Cr+ifX0VA-NRN#3X$WFKf@J^AzOw z=~6P1sbeO0b3v~x4IhQigdDDN%_}J=Q>xAdao|9ZY~dz~@FVXHk<|(RV|fOsGpi+$ zEHlKMe}*H7ose=>oD{Z>Bh=fh2Wey1Uiz<<=Jjd$Fo>TC?DI4=@%<+D-rg>nv!*MP zExmq_0E$|BMpC&dH7}UshR9ERCnA&FIG+y4xYCl(%)w;`v5$wNx0S?ykxdIklH2k4 zT*xaXC!Fdbp<2jPiaZx9ov!D9nu|qhAkV;?2_9%B>#}$!nn*qNj&Dzeq)X3y-OPE; zWREp>EEX+T^v)ifTFEJ}Nwu-Rw8cgl!w3yA#IKR~W?llBdFQ;$#EmyKgY!M0`*5EI zX1-kFQ4$S96!$+D>X+?kjq8&xD*OA5fBk_viiVfU=x=-L{x1Lk0RR630PcI|?p_K2 E0KGk`kpKVy literal 0 HcmV?d00001 diff --git a/torch_data/profile_meta/actor_update/prof_rank-1_031904.json b/torch_data/profile_meta/actor_update/prof_rank-1_031904.json new file mode 100644 index 0000000..4cfe4cf --- /dev/null +++ b/torch_data/profile_meta/actor_update/prof_rank-1_031904.json @@ -0,0 +1,45 @@ + +{ + "schemaVersion": 1, + "deviceProperties": [ + { + "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + } + ], + "cupti_version": 26, + "cuda_runtime_version": 12080, + "cuda_driver_version": 12080, + "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 1, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, + "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", + "displayTimeUnit": "ms", + "baseTimeNanoseconds": 1767189312000000000, + "traceEvents": [ + { + "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, + "ts": 4541015316353.111, "dur": 10083720.552, + "args": { + "cbid": 30, "correlation": 5 + } + }, + { + "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, + "args": { + "name": "ray::WorkerDict.actor_rollout_compute_log_prob" + } + }, + { + "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", + "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 + }, + { + "name": "Record Window End", "ph": "i", "s": "g", + "pid": "", "tid": "", "ts": 4541019157986.427 + } + ], + "traceName": "/tmp/tmpx5qz1t66.json" +} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz b/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8152f03244e58a308d58bc6df96f513f6b1f85ed GIT binary patch literal 879 zcmV-#1Cab5iwFqk)w5{=|8R0|W?yn)Zfh+uUobN{yu5{ z0r_*3VS|C>Tf3xFrM0WpY@IYs$T3dh6)>}%zO3qhpADfnp-sDL(vTwX-R1l|=Z8D) z-oEiXpy-Mf!$q{uNR5mqgKP$OL=I@N!{vss9@#_!>(11(d3PMhQMo=`j+`L%nVY0WAq- zX+06ZVTdP_$taGd;Ut_)j*@Bc{^$@T2mTaIkI;sp?G05G68g?$tYL*XH0>G(FbZ%mgs`hU$kt7N_LCq+{t&x!gUF@o z`euWE-t6zn%?wB>Sx$7*gYnK;wYt0Ok=#s(Mu3Bznw@~BNMP*a;pk;0@%OT6fk<*Y z9$yG~$>fAnJtR~MnM#r8Vy)B7{7-YSObz5Ycrn3a&178`?_3k9$KKiPOh~%&%-79= z=S=okbH`%Qf@SaQ!OTidfnBPNecu*4Weg)U#1KD6;mbIv8rtFNzLISwe370t;dl_e7#j2twm%qhKP z37tw&P^lO#wdYUcaGbC8myThnw!*=~GbcIK7I1z!IhhMO$3%S(fY^H?Czr3@E>{ah%7GH7lYHqt+`wgNmC8X`lS~m-wNUD{316z#<(|G zFQv|`z2V;%idAYs(Me3Vo<>` zcmE|E_eF@}y)04upDhY{9>tI39sFxD{3HPJffA44p)-%%L#5t3c2gc<5amc`iCWIfie?Z%;6U z+l|;9X^V_}p6NsJ2hPk16zF4p?Ykx=HI8$_MM*UasX>8sr-P!{)#u{ovSuIOQm%G( z%f-qJ{)g2>B}8pWor?nWJ1?RrAB{4$Q1gYP<;n^vDv)l71J7!})o!av$MZcHhx#NR z1sDxO-*5ftx@sqeaTK;jB9~=*zOPKREh=5sN7Lu-4N#& z_$%1U$os-+TD9+2Qa7$@&h%ch`7S-Xl-wb4;R{*Ih{6Z0_ zM$R6NYh28-m}J1Rw~FhM*dbtL-#5i>qMie>U92B94dTuj^Yn+3?x(vmu`qOF?E7fw xdbt0tqS`Xgw|Tu$d0{^8UwORAu^N6V^+x~t)&1W9009600|58Ws2-^l007PN?v?-m literal 0 HcmV?d00001 diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json b/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json new file mode 100644 index 0000000..2b7075a --- /dev/null +++ b/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json @@ -0,0 +1,68 @@ + +{ + "schemaVersion": 1, + "deviceProperties": [ + { + "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + }, + { + "id": 1, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + } + ], + "cupti_version": 26, + "cuda_runtime_version": 12080, + "cuda_driver_version": 12080, + "distributedInfo": {"backend": "nccl", "rank": 1, "world_size": 2, "pg_count": 19, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "1", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "2", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "3", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "4", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "6", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "9", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "10", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "13", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "14", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "17", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "18", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}], "nccl_version": "2.27.3"}, + "trace_id": "BEAAF276E11641F98431BDB0CECD2006", + "displayTimeUnit": "ms", + "baseTimeNanoseconds": 1767189312000000000, + "traceEvents": [ + { + "ph": "X", "cat": "cpu_op", "name": "aten::lift_fresh", "pid": 372640, "tid": 372640, + "ts": 4540970808621.755, "dur": 1.987, + "args": { + "External id": 1,"Record function id": 0, "Ev Idx": 0 + } + }, + { + "name": "process_name", "ph": "M", "ts": 4540967187161.744, "pid": 372640, "tid": 0, + "args": { + "name": "VLLM::Worker_TP0" + } + }, + { + "ph": "X", "cat": "Trace", "ts": 4540967187114.212, "dur": 10083720.389, + "pid": "Spans", "tid": "PyTorch Profiler", + "name": "PyTorch Profiler (0)", + "args": { + "Op count": 0 + } + }, + { + "name": "process_sort_index", "ph": "M", "ts": 4540967187114.212, + "pid": "Spans", "tid": 0, + "args": { + "sort_index": 536870912 + } + }, + { + "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", + "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4540967187114.212 + }, + { + "name": "Record Window End", "ph": "i", "s": "g", + "pid": "", "tid": "", "ts": 4540977392551.342 + } + ], + "traceName": "/tmp/tmp3qm9xm2t.json" +} \ No newline at end of file diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz b/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..9718a72fc3a6007de5899ed377ff47fab7dad00e GIT binary patch literal 1026 zcmV+d1pWITiwFqk)w5{=|7dk#cV%f`GdD6eG%zkPH#adiGcYqZFflbbIW{>kFfcA~ zbS`vqVPj=3YIARH0PI*@Z`(E$eJ{}eAn<7e440(7{gyQDU?542#Z3ncfx$?$%|;?M zicZ`X`R^koD`F(aX*+a-g9$J!-Fr>mbIv8rtFNzLISwe370t;dl_e7#j2twm%qhKP z37tw&P^lO#wdYUcaGbC8myThnw!*=~GbcIK7I1z!IhhMO$3%S(fY^H?Czr3@E>{ah%7GH7lYHqt+`wgNmC8X`lS~m-wNUD{316z#<(|G zFQv|`z2V;%idAYsqw>*s|Svta7abni{oAvv#DkOpGI?3!;ge7t2Qx+jQFr zD(oXW^=70_t`De6J1uj;f&GNqhpXoHe(($o^c0LW*FYGj=^>!N{}@HF9xXE=1{EB0 z_g}(sUxX;$%M!)^*`lE5QT#~W!M`TMPXZ7hDDem$I`haqRO-Ehr#^fU{{bjEtUrPJ z=Bham8v3krDZoP<4qafpHFTgPN$9+4WWe$G=;$2|gE2yZhu+1J=c412WB7Lb_5?$? z-H6SRw#dlmnLZSM;LMyrfj-vPzH3ra<2WZ=lvJ~j8Wc!(Iw*==eJ*Y;YxeOi-0?Y5e9Jl}(Hs88}y zfYC7Y{nnqZt9D`-M`3Fua#^W~B z1@WZXGgBpdl1JVUBivI5!bk&vLpO@Mz`#X8cnP}5!1VJ>$YkYArC6|x${iKf4RL;f zzkph$Oz$Fg)Nd_!?tGF(S9RgPNeN*fv>NybG#rjdxAnu$oPk$)se!4po3qv=?zK@2k whx_j;sx9+;o7Wqa7v|&smB*VLtKp|oZ}hKU-Tw^$0RR6306g=GYpE0f0Fb-%>i_@% literal 0 HcmV?d00001 diff --git a/torch_data/rl_timeline.html b/torch_data/rl_timeline.html new file mode 100644 index 0000000..d181bcf --- /dev/null +++ b/torch_data/rl_timeline.html @@ -0,0 +1,7 @@ + + + +
+
+ + From 611ac8a293e760f290a7899628c70d16f1e84ce7 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 10:08:52 +0800 Subject: [PATCH 02/16] delate json --- torch_data/jsontojsongz.py | 46 ------------- .../prof_rank-0_031847.json | 45 ------------ .../prof_rank-1_031847.json | 45 ------------ .../actor_update/prof_rank-0_031904.json | 45 ------------ .../actor_update/prof_rank-1_031904.json | 45 ------------ ...i_372640.1771730291744166997.pt.trace.json | 68 ------------------- ...i_372640.1771730370159969000.pt.trace.json | 68 ------------------- torch_data/rl_timeline.html | 7 -- 8 files changed, 369 deletions(-) delete mode 100644 torch_data/jsontojsongz.py delete mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json delete mode 100644 torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json delete mode 100644 torch_data/profile_meta/actor_update/prof_rank-0_031904.json delete mode 100644 torch_data/profile_meta/actor_update/prof_rank-1_031904.json delete mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json delete mode 100644 torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json delete mode 100644 torch_data/rl_timeline.html diff --git a/torch_data/jsontojsongz.py b/torch_data/jsontojsongz.py deleted file mode 100644 index df41592..0000000 --- a/torch_data/jsontojsongz.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import json -import gzip -from pathlib import Path - -def convert_json_to_gz(directory_path): - """ - 将指定目录下所有 .json 文件转换为 .json.gz 格式。 - - 参数: - directory_path (str or Path): 目录路径 - """ - dir_path = Path(directory_path) - - if not dir_path.exists(): - print(f"目录不存在: {directory_path}") - return - - if not dir_path.is_dir(): - print(f"路径不是目录: {directory_path}") - return - - # 遍历目录中所有 .json 文件 - json_files = dir_path.glob("*/*.json") - - for json_file in json_files: - gz_file = json_file.with_suffix(".json.gz") - - try: - # 读取原始 JSON 文件 - with open(json_file, 'r', encoding='utf-8') as f_in: - data = json.load(f_in) - - # 写入压缩的 .json.gz 文件 - with gzip.open(gz_file, 'wt', encoding='utf-8') as f_out: - json.dump(data, f_out, ensure_ascii=False, indent=2) - - print(f"coverting: {json_file.name} -> {gz_file.name}") - - except Exception as e: - print(f"fail: {json_file.name} | 错误: {e}") - -# 使用示例 -if __name__ == "__main__": - target_directory = "./profile_meta" # 修改为你的目标目录 - convert_json_to_gz(target_directory) diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json deleted file mode 100644 index e7a4619..0000000 --- a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json +++ /dev/null @@ -1,45 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 0, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, - "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, - "ts": 4541015316353.111, "dur": 10083720.552, - "args": { - "cbid": 30, "correlation": 5 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, - "args": { - "name": "ray::WorkerDict.actor_rollout_compute_log_prob" - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4541019157986.427 - } - ], - "traceName": "/tmp/tmpx5qz1t66.json" -} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json b/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json deleted file mode 100644 index 4cfe4cf..0000000 --- a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json +++ /dev/null @@ -1,45 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 1, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, - "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, - "ts": 4541015316353.111, "dur": 10083720.552, - "args": { - "cbid": 30, "correlation": 5 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, - "args": { - "name": "ray::WorkerDict.actor_rollout_compute_log_prob" - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4541019157986.427 - } - ], - "traceName": "/tmp/tmpx5qz1t66.json" -} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_update/prof_rank-0_031904.json b/torch_data/profile_meta/actor_update/prof_rank-0_031904.json deleted file mode 100644 index e7a4619..0000000 --- a/torch_data/profile_meta/actor_update/prof_rank-0_031904.json +++ /dev/null @@ -1,45 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 0, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, - "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, - "ts": 4541015316353.111, "dur": 10083720.552, - "args": { - "cbid": 30, "correlation": 5 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, - "args": { - "name": "ray::WorkerDict.actor_rollout_compute_log_prob" - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4541019157986.427 - } - ], - "traceName": "/tmp/tmpx5qz1t66.json" -} \ No newline at end of file diff --git a/torch_data/profile_meta/actor_update/prof_rank-1_031904.json b/torch_data/profile_meta/actor_update/prof_rank-1_031904.json deleted file mode 100644 index 4cfe4cf..0000000 --- a/torch_data/profile_meta/actor_update/prof_rank-1_031904.json +++ /dev/null @@ -1,45 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 1, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, - "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, - "ts": 4541015316353.111, "dur": 10083720.552, - "args": { - "cbid": 30, "correlation": 5 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, - "args": { - "name": "ray::WorkerDict.actor_rollout_compute_log_prob" - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4541019157986.427 - } - ], - "traceName": "/tmp/tmpx5qz1t66.json" -} \ No newline at end of file diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json b/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json deleted file mode 100644 index 07b8350..0000000 --- a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json +++ /dev/null @@ -1,68 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - }, - { - "id": 1, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "nccl", "rank": 0, "world_size": 2, "pg_count": 19, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "1", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "2", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "3", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "4", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "6", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "9", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "10", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "13", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "14", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "17", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "18", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}], "nccl_version": "2.27.3"}, - "trace_id": "BEAAF276E11641F98431BDB0CECD2006", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cpu_op", "name": "aten::lift_fresh", "pid": 372640, "tid": 372640, - "ts": 4540970808621.755, "dur": 1.987, - "args": { - "External id": 1,"Record function id": 0, "Ev Idx": 0 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4540967187161.744, "pid": 372640, "tid": 0, - "args": { - "name": "VLLM::Worker_TP0" - } - }, - { - "ph": "X", "cat": "Trace", "ts": 4540967187114.212, "dur": 10083720.389, - "pid": "Spans", "tid": "PyTorch Profiler", - "name": "PyTorch Profiler (0)", - "args": { - "Op count": 0 - } - }, - { - "name": "process_sort_index", "ph": "M", "ts": 4540967187114.212, - "pid": "Spans", "tid": 0, - "args": { - "sort_index": 536870912 - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4540967187114.212 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4540977392551.342 - } - ], - "traceName": "/tmp/tmp3qm9xm2t.json" -} \ No newline at end of file diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json b/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json deleted file mode 100644 index 2b7075a..0000000 --- a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json +++ /dev/null @@ -1,68 +0,0 @@ - -{ - "schemaVersion": 1, - "deviceProperties": [ - { - "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - }, - { - "id": 1, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, - "computeMajor": 8, "computeMinor": 9, - "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, - "regsPerBlock": 65536, "warpSize": 32, - "sharedMemPerBlock": 49152, "numSms": 92 - , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 - } - ], - "cupti_version": 26, - "cuda_runtime_version": 12080, - "cuda_driver_version": 12080, - "distributedInfo": {"backend": "nccl", "rank": 1, "world_size": 2, "pg_count": 19, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "1", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "2", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "3", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "4", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "6", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "9", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "10", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "13", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 1, "ranks": [0]}, {"pg_name": "14", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 1, "ranks": [0]}, {"pg_name": "17", "pg_desc": "undefined", "backend_config": "cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "18", "pg_desc": "undefined", "backend_config": "cpu:gloo,cuda:gloo", "pg_size": 2, "ranks": [0, 1]}], "nccl_version": "2.27.3"}, - "trace_id": "BEAAF276E11641F98431BDB0CECD2006", - "displayTimeUnit": "ms", - "baseTimeNanoseconds": 1767189312000000000, - "traceEvents": [ - { - "ph": "X", "cat": "cpu_op", "name": "aten::lift_fresh", "pid": 372640, "tid": 372640, - "ts": 4540970808621.755, "dur": 1.987, - "args": { - "External id": 1,"Record function id": 0, "Ev Idx": 0 - } - }, - { - "name": "process_name", "ph": "M", "ts": 4540967187161.744, "pid": 372640, "tid": 0, - "args": { - "name": "VLLM::Worker_TP0" - } - }, - { - "ph": "X", "cat": "Trace", "ts": 4540967187114.212, "dur": 10083720.389, - "pid": "Spans", "tid": "PyTorch Profiler", - "name": "PyTorch Profiler (0)", - "args": { - "Op count": 0 - } - }, - { - "name": "process_sort_index", "ph": "M", "ts": 4540967187114.212, - "pid": "Spans", "tid": 0, - "args": { - "sort_index": 536870912 - } - }, - { - "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", - "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4540967187114.212 - }, - { - "name": "Record Window End", "ph": "i", "s": "g", - "pid": "", "tid": "", "ts": 4540977392551.342 - } - ], - "traceName": "/tmp/tmp3qm9xm2t.json" -} \ No newline at end of file diff --git a/torch_data/rl_timeline.html b/torch_data/rl_timeline.html deleted file mode 100644 index d181bcf..0000000 --- a/torch_data/rl_timeline.html +++ /dev/null @@ -1,7 +0,0 @@ - - - -
-
- - From 1ec779edf523b9e44705d11fe7176351631f6173 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 11:22:27 +0800 Subject: [PATCH 03/16] add special_e2e --- .github/workflows/cluster_analysis.yml | 4 ---- .github/workflows/special_e2e.yml | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/special_e2e.yml diff --git a/.github/workflows/cluster_analysis.yml b/.github/workflows/cluster_analysis.yml index 1a9f90b..6845171 100644 --- a/.github/workflows/cluster_analysis.yml +++ b/.github/workflows/cluster_analysis.yml @@ -45,7 +45,3 @@ jobs: - name: Run cluster_analyse tests run: | pytest -s -x tests/cluster_analysis - - - name: Run special_e2e tests - run: | - pytest -s -x tests/special_e2e diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml new file mode 100644 index 0000000..88dd607 --- /dev/null +++ b/.github/workflows/special_e2e.yml @@ -0,0 +1,15 @@ +name: special_e2e + +on: + push: + branches: + - main + - v0.* + pull_request: + branches: + - main + - v0.* + paths: + - "**/*.py" + - .github/workflows/special_e2e.yml + - "tests/special_e2e/**" From fcc73d1e6a9d64e556b736519867852dd62c351b Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 14:32:16 +0800 Subject: [PATCH 04/16] code check --- docs/data/data_directory.md | 20 ++++++++++++++++++++ main.py | 16 ++++++++++++++++ tests/special_e2e/test_torch_e2e.py | 16 ++++++---------- 3 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 docs/data/data_directory.md create mode 100644 main.py diff --git a/docs/data/data_directory.md b/docs/data/data_directory.md new file mode 100644 index 0000000..7a72dc1 --- /dev/null +++ b/docs/data/data_directory.md @@ -0,0 +1,20 @@ +# RL-Insight - 数据文件目录结构 + +## 一、采集Torch Profiling 数据目录结构 + +``` +/ +└── / + └── prof_*.json.gz +``` + +## 二、采集Mstx Profiling 数据目录结构 + +``` +/ +└── / + └── *_ascend_pt/ + |── profiler_info_*.json + └── ASCEND_PROFILER_OUTPUT/ + └── trace_view.json +``` \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..5596b44 --- /dev/null +++ b/main.py @@ -0,0 +1,16 @@ +# This is a sample Python script. + +# Press Shift+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. + + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + print_hi('PyCharm') + +# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/tests/special_e2e/test_torch_e2e.py b/tests/special_e2e/test_torch_e2e.py index 390a335..163dbb3 100644 --- a/tests/special_e2e/test_torch_e2e.py +++ b/tests/special_e2e/test_torch_e2e.py @@ -13,32 +13,28 @@ # limitations under the License. import sys -from pathlib import Path from rl_insight.main import main def test_torch_e2e_with_input_path(monkeypatch, tmp_path): - # 定义输入输出目录(相对于当前工作目录) - test_dir = Path(__file__).parent.parent.parent - input_dir = test_dir / "torch_data" + # Define input and output directories + input_dir = tmp_path / "torch_data" output_dir = tmp_path / "torch_output" - # 确保输入目录存在 + # Ensure the input directory exists assert input_dir.exists(), f"Input directory {input_dir} does not exist" - # 设置命令行参数 + # Set command line parameters test_args = [ "main.py", f"--input-path={input_dir}", f"--output-path={output_dir}", - "--profiler-type=torch", # 显式指定(默认 mstx) - # 其他参数可按需添加,如 --vis-type=html(默认)、--rank-list=all(默认) + "--profiler-type=torch", ] monkeypatch.setattr(sys, "argv", test_args) - # 执行主函数 main() - # 验证输出文件(生成 rl_timeline.html) + # Verify output file output_file = output_dir / "rl_timeline.html" assert output_file.exists() From 396af624748de05b6d6d781f023cebd2214ce98c Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 14:33:13 +0800 Subject: [PATCH 05/16] code check --- main.py | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 main.py diff --git a/main.py b/main.py deleted file mode 100644 index 5596b44..0000000 --- a/main.py +++ /dev/null @@ -1,16 +0,0 @@ -# This is a sample Python script. - -# Press Shift+F10 to execute it or replace it with your code. -# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. - - -def print_hi(name): - # Use a breakpoint in the code line below to debug your script. - print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. - - -# Press the green button in the gutter to run the script. -if __name__ == '__main__': - print_hi('PyCharm') - -# See PyCharm help at https://www.jetbrains.com/help/pycharm/ From 2cd7aeac3dd505391b927f574d02bf8160fc669f Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 14:44:26 +0800 Subject: [PATCH 06/16] add special_e2e.yml --- .github/workflows/special_e2e.yml | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml index 88dd607..9d56d12 100644 --- a/.github/workflows/special_e2e.yml +++ b/.github/workflows/special_e2e.yml @@ -13,3 +13,35 @@ on: - "**/*.py" - .github/workflows/special_e2e.yml - "tests/special_e2e/**" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +permissions: + contents: read + +jobs: + cluster_analyse: + runs-on: ubuntu-latest + timeout-minutes: 5 + strategy: + matrix: + python-version: ["3.11"] + steps: + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + pip install -r requirements.txt + pip install -e . + + - name: Run special_e2e tests + run: | + pytest -s -x tests/special_e2e From 57023dbd500bbf41eb6284e26da12c35f04ead21 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 15:30:46 +0800 Subject: [PATCH 07/16] mv data and fix bug --- .../prof_rank-0_031847.json.gz | Bin .../prof_rank-1_031847.json.gz | Bin .../actor_update/prof_rank-0_031904.json.gz | Bin .../actor_update/prof_rank-1_031904.json.gz | Bin ...awei_372640.1771730291744166997.pt.trace.json.gz | Bin ...awei_372640.1771730370159969000.pt.trace.json.gz | Bin tests/special_e2e/test_torch_e2e.py | 8 ++++++-- 7 files changed, 6 insertions(+), 2 deletions(-) rename {torch_data => data/torch_data}/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz (100%) rename {torch_data => data/torch_data}/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz (100%) rename {torch_data => data/torch_data}/profile_meta/actor_update/prof_rank-0_031904.json.gz (100%) rename {torch_data => data/torch_data}/profile_meta/actor_update/prof_rank-1_031904.json.gz (100%) rename {torch_data => data/torch_data}/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz (100%) rename {torch_data => data/torch_data}/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz (100%) diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz b/data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz similarity index 100% rename from torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz rename to data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz diff --git a/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz b/data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz similarity index 100% rename from torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz rename to data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz diff --git a/torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz b/data/torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz similarity index 100% rename from torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz rename to data/torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz diff --git a/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz b/data/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz similarity index 100% rename from torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz rename to data/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz b/data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz similarity index 100% rename from torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz rename to data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz diff --git a/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz b/data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz similarity index 100% rename from torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz rename to data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz diff --git a/tests/special_e2e/test_torch_e2e.py b/tests/special_e2e/test_torch_e2e.py index 163dbb3..21b1494 100644 --- a/tests/special_e2e/test_torch_e2e.py +++ b/tests/special_e2e/test_torch_e2e.py @@ -17,8 +17,12 @@ def test_torch_e2e_with_input_path(monkeypatch, tmp_path): - # Define input and output directories - input_dir = tmp_path / "torch_data" + # Get the root directory of the project + current_file = Path(__file__).resolve() + project_root = current_file.parents[2] + + # Get the input data path + input_dir = project_root / "data" / "torch_data" output_dir = tmp_path / "torch_output" # Ensure the input directory exists From c4d6066c5801c7462b0bb319f672b14fa2e0b742 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 15:49:00 +0800 Subject: [PATCH 08/16] bugfix --- tests/special_e2e/test_torch_e2e.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/special_e2e/test_torch_e2e.py b/tests/special_e2e/test_torch_e2e.py index 21b1494..bad5fa6 100644 --- a/tests/special_e2e/test_torch_e2e.py +++ b/tests/special_e2e/test_torch_e2e.py @@ -13,6 +13,7 @@ # limitations under the License. import sys +from pathlib import Path from rl_insight.main import main @@ -20,7 +21,7 @@ def test_torch_e2e_with_input_path(monkeypatch, tmp_path): # Get the root directory of the project current_file = Path(__file__).resolve() project_root = current_file.parents[2] - + # Get the input data path input_dir = project_root / "data" / "torch_data" output_dir = tmp_path / "torch_output" From 46cea5e21ab409a07f625584adb214af8b18107f Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 18:56:27 +0800 Subject: [PATCH 09/16] add st of mstx --- .../profiler_info_0.json | 50 ++ .../profiler_info_0.json | 50 ++ .../profiler_info_0.json | 48 ++ .../ASCEND_PROFILER_OUTPUT/trace_view.json | 632 ++++++++++++++++++ .../profiler_info_0.json | 50 ++ docs/index.rst | 6 + tests/special_e2e/test_mstx_e2e.py | 45 ++ 7 files changed, 881 insertions(+) create mode 100644 data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json create mode 100644 tests/special_e2e/test_mstx_e2e.py diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json new file mode 100644 index 0000000..9b8c832 --- /dev/null +++ b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json @@ -0,0 +1,50 @@ +{ + "config": { + "common_config": { + "activities": [ + "ProfilerActivity.CPU", + "ProfilerActivity.NPU" + ], + "schedule": {}, + "record_shapes": false, + "profile_memory": false, + "with_stack": false, + "with_flops": false, + "with_modules": false + }, + "experimental_config": { + "_profiler_level": "Level1", + "_aic_metrics": "ACL_AICORE_PIPE_UTILIZATION", + "_l2_cache": false, + "_msprof_tx": true, + "_mstx": false, + "_data_simplification": true, + "record_op_args": false, + "_export_type": [ + "db" + ], + "_host_sys": [], + "_op_attr": false, + "_gc_detect_threshold": null, + "_mstx_domain_include": [], + "_mstx_domain_exclude": [ + "communication" + ], + "_sys_io": false, + "_sys_interconnection": false + } + }, + "start_info": { + "syscnt_enable": true, + "freq": 100, + "start_cnt": 238468094663174, + "start_monotonic": 2384513312565430 + }, + "end_info": { + "collectionTimeEnd": 1773285903061065750, + "MonotonicTimeEnd": 2384517398234200 + }, + "torch_npu_version": "2.7.1", + "cann_version": "8.3.RC1", + "rank_id": "0" +} \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json b/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json new file mode 100644 index 0000000..cb3649a --- /dev/null +++ b/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json @@ -0,0 +1,50 @@ +{ + "config": { + "common_config": { + "activities": [ + "ProfilerActivity.CPU", + "ProfilerActivity.NPU" + ], + "schedule": {}, + "record_shapes": false, + "profile_memory": false, + "with_stack": false, + "with_flops": false, + "with_modules": false + }, + "experimental_config": { + "_profiler_level": "Level1", + "_aic_metrics": "ACL_AICORE_PIPE_UTILIZATION", + "_l2_cache": false, + "_msprof_tx": true, + "_mstx": false, + "_data_simplification": true, + "record_op_args": false, + "_export_type": [ + "db" + ], + "_host_sys": [], + "_op_attr": false, + "_gc_detect_threshold": null, + "_mstx_domain_include": [], + "_mstx_domain_exclude": [ + "communication" + ], + "_sys_io": false, + "_sys_interconnection": false + } + }, + "start_info": { + "syscnt_enable": true, + "freq": 100, + "start_cnt": 238468656388594, + "start_monotonic": 2384518929819120 + }, + "end_info": { + "collectionTimeEnd": 1773285907402740580, + "MonotonicTimeEnd": 2384521739905940 + }, + "torch_npu_version": "2.7.1", + "cann_version": "8.3.RC1", + "rank_id": "0" +} \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json b/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json new file mode 100644 index 0000000..980544d --- /dev/null +++ b/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json @@ -0,0 +1,48 @@ +{ + "config": { + "common_config": { + "activities": [ + "ProfilerActivity.CPU", + "ProfilerActivity.NPU" + ], + "schedule": {}, + "record_shapes": false, + "profile_memory": false, + "with_stack": false, + "with_flops": false, + "with_modules": false + }, + "experimental_config": { + "_profiler_level": "Level1", + "_aic_metrics": "ACL_AICORE_PIPE_UTILIZATION", + "_l2_cache": false, + "_msprof_tx": false, + "_mstx": false, + "_data_simplification": false, + "record_op_args": false, + "_export_type": [ + "text" + ], + "_host_sys": [], + "_op_attr": false, + "_gc_detect_threshold": null, + "_mstx_domain_include": [], + "_mstx_domain_exclude": [], + "_sys_io": false, + "_sys_interconnection": false + } + }, + "start_info": { + "syscnt_enable": true, + "freq": 100, + "start_cnt": 238467048127792, + "start_monotonic": 2384502847213880 + }, + "end_info": { + "collectionTimeEnd": 1773285894485741210, + "MonotonicTimeEnd": 2384508822907870 + }, + "torch_npu_version": "2.7.1", + "cann_version": "8.3.RC1", + "rank_id": 0 +} \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json new file mode 100644 index 0000000..2497fd7 --- /dev/null +++ b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -0,0 +1,632 @@ +[ + { + "name": "process_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Overlap Analysis" + } + }, + { + "name": "process_labels", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "labels": "NPU 0" + } + }, + { + "name": "process_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 29 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Communication" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 0 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "name": "Communication(Not Overlapped)" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "sort_index": 1 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "name": "Computing" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "sort_index": 2 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "name": "Free" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "sort_index": 3 + } + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903458585.417", + "dur": 109.142, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903618076.644", + "dur": 22.44, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903618099.124", + "dur": 9.24, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903618108.384", + "dur": 1.94, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903618111.664", + "dur": 2.84, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903618737.657", + "dur": 1.9, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619225.987", + "dur": 9.58, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619235.587", + "dur": 15.12, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619250.747", + "dur": 15.14, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619265.907", + "dur": 3.62, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619269.548", + "dur": 8.4, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285903619277.968", + "dur": 9.02, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903458696.819", + "dur": 159376.865, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903621200.146", + "dur": 6974.779, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903632506.672", + "dur": 2144.803, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903638746.937", + "dur": 2470.049, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903645507.492", + "dur": 2272.685, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903651735.736", + "dur": 2516.631, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903658329.288", + "dur": 2867.017, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903665431.170", + "dur": 2560.831, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903672004.521", + "dur": 2786.276, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903678712.675", + "dur": 4195.944, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903687047.702", + "dur": 2333.746, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903693667.394", + "dur": 2874.077, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903700577.772", + "dur": 3206.864, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903707784.076", + "dur": 2884.338, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903714738.655", + "dur": 2724.454, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903721467.009", + "dur": 3333.347, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903728893.918", + "dur": 2373.567, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903735313.866", + "dur": 2581.292, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903742170.823", + "dur": 2799.536, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903749205.264", + "dur": 2687.733, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903756093.121", + "dur": 2679.914, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903763098.541", + "dur": 2160.343, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903769224.104", + "dur": 2573.691, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903776047.800", + "dur": 2592.332, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903782580.411", + "dur": 2625.852, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903799170.642", + "dur": 4428.088, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903807822.255", + "dur": 2868.357, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903814547.409", + "dur": 2957.039, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903821428.287", + "dur": 2674.653, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903827960.157", + "dur": 3162.503, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903835210.822", + "dur": 2508.61, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903841849.895", + "dur": 2940.838, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903848988.077", + "dur": 2713.815, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903855440.566", + "dur": 3370.388, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285903863246.942", + "dur": 2449.609, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903453279.131", + "dur": 5306.286, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903458694.559", + "dur": 2.26, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618073.684", + "dur": 2.96, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618099.084", + "dur": 0.04, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618108.364", + "dur": 0.02, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618110.324", + "dur": 1.34, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618114.504", + "dur": 623.153, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903618739.557", + "dur": 486.43, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903619235.567", + "dur": 0.02, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903619250.707", + "dur": 0.04, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903619265.887", + "dur": 0.02, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285903619269.527", + "dur": 0.021, + "ph": "X", + "args": {} + } +] \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json new file mode 100644 index 0000000..e5d21c7 --- /dev/null +++ b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json @@ -0,0 +1,50 @@ +{ + "config": { + "common_config": { + "activities": [ + "ProfilerActivity.CPU", + "ProfilerActivity.NPU" + ], + "schedule": {}, + "record_shapes": false, + "profile_memory": false, + "with_stack": false, + "with_flops": false, + "with_modules": false + }, + "experimental_config": { + "_profiler_level": "Level1", + "_aic_metrics": "ACL_AICORE_PIPE_UTILIZATION", + "_l2_cache": false, + "_msprof_tx": true, + "_mstx": false, + "_data_simplification": true, + "record_op_args": false, + "_export_type": [ + "db" + ], + "_host_sys": [], + "_op_attr": false, + "_gc_detect_threshold": null, + "_mstx_domain_include": [], + "_mstx_domain_exclude": [ + "communication" + ], + "_sys_io": false, + "_sys_interconnection": false + } + }, + "start_info": { + "syscnt_enable": true, + "freq": 100, + "start_cnt": 238468525914374, + "start_monotonic": 2384517625076970 + }, + "end_info": { + "collectionTimeEnd": 1773285904360767710, + "MonotonicTimeEnd": 2384518697933370 + }, + "torch_npu_version": "2.7.1", + "cann_version": "8.3.RC1", + "rank_id": "0" +} \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 063ea07..c27e32b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,6 +22,12 @@ and visualization. README <../README.md> +.. toctree:: + :maxdepth: 2 + :caption: Data Directory + + data/data_directory + Contribution ------------- diff --git a/tests/special_e2e/test_mstx_e2e.py b/tests/special_e2e/test_mstx_e2e.py new file mode 100644 index 0000000..1958179 --- /dev/null +++ b/tests/special_e2e/test_mstx_e2e.py @@ -0,0 +1,45 @@ +# Copyright (c) 2025 verl-project authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +from pathlib import Path +from rl_insight.main import main + + +def test_mstx_e2e_with_input_path(monkeypatch, tmp_path): + # Get the root directory of the project + current_file = Path(__file__).resolve() + project_root = current_file.parents[2] + + # Get the input data path + input_dir = project_root / "data" / "mstx_data" + output_dir = tmp_path / "mstx_output" + + # Ensure the input directory exists + assert input_dir.exists(), f"Input directory {input_dir} does not exist" + + # Set command line parameters + test_args = [ + "main.py", + f"--input-path={input_dir}", + f"--output-path={output_dir}", + "--profiler-type=mstx", + ] + monkeypatch.setattr(sys, "argv", test_args) + + main() + + # Verify output file + output_file = output_dir / "rl_timeline.html" + assert output_file.exists() From 69c7e49377d7351352096df4bec8235a7f2e723c Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Thu, 19 Mar 2026 19:59:51 +0800 Subject: [PATCH 10/16] Revise inspection comments --- .github/workflows/special_e2e.yml | 2 +- .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 18 ------------------ 5 files changed, 1 insertion(+), 19 deletions(-) create mode 100644 data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json create mode 100644 data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml index 9d56d12..3464557 100644 --- a/.github/workflows/special_e2e.yml +++ b/.github/workflows/special_e2e.yml @@ -22,7 +22,7 @@ permissions: contents: read jobs: - cluster_analyse: + profiling_data_analysis_st: runs-on: ubuntu-latest timeout-minutes: 5 strategy: diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json new file mode 100644 index 0000000..e69de29 diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json new file mode 100644 index 0000000..e69de29 diff --git a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json new file mode 100644 index 0000000..e69de29 diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index 2497fd7..2f44761 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -610,23 +610,5 @@ "dur": 0.04, "ph": "X", "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903619265.887", - "dur": 0.02, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903619269.527", - "dur": 0.021, - "ph": "X", - "args": {} } ] \ No newline at end of file From 577e936654b206748b5dc59e0f2afcb795c118f1 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Fri, 20 Mar 2026 09:34:00 +0800 Subject: [PATCH 11/16] change st name --- .github/workflows/special_e2e.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml index 3464557..28cb80e 100644 --- a/.github/workflows/special_e2e.yml +++ b/.github/workflows/special_e2e.yml @@ -1,4 +1,4 @@ -name: special_e2e +name: profiling_data_analysis_st on: push: @@ -42,6 +42,6 @@ jobs: pip install -r requirements.txt pip install -e . - - name: Run special_e2e tests + - name: Run profiling_data_analysis_st tests run: | pytest -s -x tests/special_e2e From 20d174c954af103771fa252f395092ad557a6785 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Fri, 20 Mar 2026 11:22:50 +0800 Subject: [PATCH 12/16] Add data description --- docs/data/data_directory.md | 8 +++++++- docs/data/img.png | Bin 0 -> 11112 bytes docs/data/img_1.png | Bin 0 -> 53301 bytes 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/data/img.png create mode 100644 docs/data/img_1.png diff --git a/docs/data/data_directory.md b/docs/data/data_directory.md index 7a72dc1..3a506d6 100644 --- a/docs/data/data_directory.md +++ b/docs/data/data_directory.md @@ -7,6 +7,9 @@ └── / └── prof_*.json.gz ``` +### 数据解析文件 prof_*.json.gz,解析文件缺少字段见解析日志warning,解析文件内容示例: + +![img_1.png](img_1.png) ## 二、采集Mstx Profiling 数据目录结构 @@ -17,4 +20,7 @@ |── profiler_info_*.json └── ASCEND_PROFILER_OUTPUT/ └── trace_view.json -``` \ No newline at end of file +``` +### 数据解析文件 trace_view.json,解析文件内容必须包含"ph": "M",且"name": "Overlap Analysis"对应"pid"的数据,缺少字段见解析日志warning,解析文件内容示例: + +![img.png](img.png) diff --git a/docs/data/img.png b/docs/data/img.png new file mode 100644 index 0000000000000000000000000000000000000000..2663a9db7cbf23c201a1b0355d53b5280eb85090 GIT binary patch literal 11112 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

0r&NzXu;*C8LOG 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 literal 0 HcmV?d00001 From e1ca74cf9b9bf60f9e2a5d29eabd1698e96e0762 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Mon, 23 Mar 2026 17:39:15 +0800 Subject: [PATCH 13/16] add data file --- .github/workflows/special_e2e.yml | 2 +- .../ASCEND_PROFILER_OUTPUT/trace_view.json | 137 +++++ .../ASCEND_PROFILER_OUTPUT/trace_view.json | 137 +++++ .../ASCEND_PROFILER_OUTPUT/trace_view.json | 155 ++++++ .../ASCEND_PROFILER_OUTPUT/trace_view.json | 476 +----------------- 5 files changed, 434 insertions(+), 473 deletions(-) diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml index 28cb80e..a7d0dc4 100644 --- a/.github/workflows/special_e2e.yml +++ b/.github/workflows/special_e2e.yml @@ -44,4 +44,4 @@ jobs: - name: Run profiling_data_analysis_st tests run: | - pytest -s -x tests/special_e2e + pytest -s -x tests/special_e2e --timeout=300 -v diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index e69de29..62b49c3 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -0,0 +1,137 @@ +[ + { + "name": "process_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Overlap Analysis" + } + }, + { + "name": "process_labels", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "labels": "NPU 0" + } + }, + { + "name": "process_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 29 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Communication" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 0 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "name": "Communication(Not Overlapped)" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "sort_index": 1 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "name": "Computing" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "sort_index": 2 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "name": "Free" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "sort_index": 3 + } + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285899055563.748", + "dur": 53.301, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285899057336.304", + "dur": 52269.524, + "ph": "X", + "args": {} + }, + { + "name": "Communication(Not Overlapped)", + "pid": 3550586784, + "tid": 1, + "ts": "1773285899057336.304", + "dur": 52269.524, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285899049161.720", + "dur": 6402.028, + "ph": "X", + "args": {} + } +] \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index e69de29..435c18a 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -0,0 +1,137 @@ +[ + { + "name": "process_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Overlap Analysis" + } + }, + { + "name": "process_labels", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "labels": "NPU 0" + } + }, + { + "name": "process_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 29 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Communication" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 0 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "name": "Communication(Not Overlapped)" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 1, + "ph": "M", + "args": { + "sort_index": 1 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "name": "Computing" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 2, + "ph": "M", + "args": { + "sort_index": 2 + } + }, + { + "name": "thread_name", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "name": "Free" + } + }, + { + "name": "thread_sort_index", + "pid": 3550586784, + "tid": 3, + "ph": "M", + "args": { + "sort_index": 3 + } + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285904640626.314", + "dur": 145.623, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3550586784, + "tid": 0, + "ts": "1773285904641909.419", + "dur": 12782.896, + "ph": "X", + "args": {} + }, + { + "name": "Communication(Not Overlapped)", + "pid": 3550586784, + "tid": 1, + "ts": "1773285904641909.419", + "dur": 12782.896, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3550586784, + "tid": 3, + "ts": "1773285904639877.299", + "dur": 749.015, + "ph": "X", + "args": {} + } +] \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index e69de29..9beb8b3 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -0,0 +1,155 @@ +[ + { + "name": "process_name", + "pid": 3555714976, + "tid": 0, + "ph": "M", + "args": { + "name": "Overlap Analysis" + } + }, + { + "name": "process_labels", + "pid": 3555714976, + "tid": 0, + "ph": "M", + "args": { + "labels": "NPU 0" + } + }, + { + "name": "process_sort_index", + "pid": 3555714976, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 29 + } + }, + { + "name": "thread_name", + "pid": 3555714976, + "tid": 0, + "ph": "M", + "args": { + "name": "Communication" + } + }, + { + "name": "thread_sort_index", + "pid": 3555714976, + "tid": 0, + "ph": "M", + "args": { + "sort_index": 0 + } + }, + { + "name": "thread_name", + "pid": 3555714976, + "tid": 1, + "ph": "M", + "args": { + "name": "Communication(Not Overlapped)" + } + }, + { + "name": "thread_sort_index", + "pid": 3555714976, + "tid": 1, + "ph": "M", + "args": { + "sort_index": 1 + } + }, + { + "name": "thread_name", + "pid": 3555714976, + "tid": 2, + "ph": "M", + "args": { + "name": "Computing" + } + }, + { + "name": "thread_sort_index", + "pid": 3555714976, + "tid": 2, + "ph": "M", + "args": { + "sort_index": 2 + } + }, + { + "name": "thread_name", + "pid": 3555714976, + "tid": 3, + "ph": "M", + "args": { + "name": "Free" + } + }, + { + "name": "thread_sort_index", + "pid": 3555714976, + "tid": 3, + "ph": "M", + "args": { + "sort_index": 3 + } + }, + { + "name": "Computing", + "pid": 3555714976, + "tid": 2, + "ts": "1773285888699715.976", + "dur": 1.66, + "ph": "X", + "args": {} + }, + { + "name": "Computing", + "pid": 3555714976, + "tid": 2, + "ts": "1773285888699990.041", + "dur": 1.8, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3555714976, + "tid": 0, + "ts": "1773285888718314.848", + "dur": 23.86, + "ph": "X", + "args": {} + }, + { + "name": "Communication", + "pid": 3555714976, + "tid": 0, + "ts": "1773285888737759.276", + "dur": 96.782, + "ph": "X", + "args": {} + }, + { + "name": "Communication(Not Overlapped)", + "pid": 3555714976, + "tid": 1, + "ts": "1773285888718314.848", + "dur": 23.86, + "ph": "X", + "args": {} + }, + { + "name": "Free", + "pid": 3555714976, + "tid": 3, + "ts": "1773285888698754.717", + "dur": 961.259, + "ph": "X", + "args": {} + } +] \ No newline at end of file diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index 2f44761..a8043ce 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -116,96 +116,6 @@ "ph": "X", "args": {} }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903618099.124", - "dur": 9.24, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903618108.384", - "dur": 1.94, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903618111.664", - "dur": 2.84, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903618737.657", - "dur": 1.9, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619225.987", - "dur": 9.58, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619235.587", - "dur": 15.12, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619250.747", - "dur": 15.14, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619265.907", - "dur": 3.62, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619269.548", - "dur": 8.4, - "ph": "X", - "args": {} - }, - { - "name": "Computing", - "pid": 3550586784, - "tid": 2, - "ts": "1773285903619277.968", - "dur": 9.02, - "ph": "X", - "args": {} - }, { "name": "Communication", "pid": 3550586784, @@ -216,308 +126,11 @@ "args": {} }, { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903621200.146", - "dur": 6974.779, - "ph": "X", - "args": {} - }, - { - "name": "Communication", + "name": "Communication(Not Overlapped)", "pid": 3550586784, - "tid": 0, - "ts": "1773285903632506.672", - "dur": 2144.803, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903638746.937", - "dur": 2470.049, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903645507.492", - "dur": 2272.685, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903651735.736", - "dur": 2516.631, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903658329.288", - "dur": 2867.017, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903665431.170", - "dur": 2560.831, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903672004.521", - "dur": 2786.276, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903678712.675", - "dur": 4195.944, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903687047.702", - "dur": 2333.746, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903693667.394", - "dur": 2874.077, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903700577.772", - "dur": 3206.864, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903707784.076", - "dur": 2884.338, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903714738.655", - "dur": 2724.454, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903721467.009", - "dur": 3333.347, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903728893.918", - "dur": 2373.567, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903735313.866", - "dur": 2581.292, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903742170.823", - "dur": 2799.536, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903749205.264", - "dur": 2687.733, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903756093.121", - "dur": 2679.914, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903763098.541", - "dur": 2160.343, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903769224.104", - "dur": 2573.691, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903776047.800", - "dur": 2592.332, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903782580.411", - "dur": 2625.852, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903799170.642", - "dur": 4428.088, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903807822.255", - "dur": 2868.357, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903814547.409", - "dur": 2957.039, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903821428.287", - "dur": 2674.653, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903827960.157", - "dur": 3162.503, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903835210.822", - "dur": 2508.61, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903841849.895", - "dur": 2940.838, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903848988.077", - "dur": 2713.815, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903855440.566", - "dur": 3370.388, - "ph": "X", - "args": {} - }, - { - "name": "Communication", - "pid": 3550586784, - "tid": 0, - "ts": "1773285903863246.942", - "dur": 2449.609, + "tid": 1, + "ts": "1773285903458696.819", + "dur": 159376.865, "ph": "X", "args": {} }, @@ -529,86 +142,5 @@ "dur": 5306.286, "ph": "X", "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903458694.559", - "dur": 2.26, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618073.684", - "dur": 2.96, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618099.084", - "dur": 0.04, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618108.364", - "dur": 0.02, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618110.324", - "dur": 1.34, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618114.504", - "dur": 623.153, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903618739.557", - "dur": 486.43, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903619235.567", - "dur": 0.02, - "ph": "X", - "args": {} - }, - { - "name": "Free", - "pid": 3550586784, - "tid": 3, - "ts": "1773285903619250.707", - "dur": 0.04, - "ph": "X", - "args": {} } ] \ No newline at end of file From 45b81c0073ade6d6179ec8b2773b59b3f3e35a68 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Tue, 24 Mar 2026 15:14:10 +0800 Subject: [PATCH 14/16] delate st --timeout=300 --- .github/workflows/special_e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/special_e2e.yml b/.github/workflows/special_e2e.yml index a7d0dc4..28cb80e 100644 --- a/.github/workflows/special_e2e.yml +++ b/.github/workflows/special_e2e.yml @@ -44,4 +44,4 @@ jobs: - name: Run profiling_data_analysis_st tests run: | - pytest -s -x tests/special_e2e --timeout=300 -v + pytest -s -x tests/special_e2e From 24bbc48ead00dd1d03d6ab94b97e856e749d469b Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Tue, 24 Mar 2026 17:29:19 +0800 Subject: [PATCH 15/16] delate img.png --- .../ASCEND_PROFILER_OUTPUT/trace_view.json | 36 --------- docs/data/data_directory.md | 76 ++++++++++++++++-- docs/data/img.png | Bin 11112 -> 0 bytes docs/data/img_1.png | Bin 53301 -> 0 bytes 4 files changed, 71 insertions(+), 41 deletions(-) delete mode 100644 docs/data/img.png delete mode 100644 docs/data/img_1.png diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json index 62b49c3..e9b7563 100644 --- a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json +++ b/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json @@ -17,15 +17,6 @@ "labels": "NPU 0" } }, - { - "name": "process_sort_index", - "pid": 3550586784, - "tid": 0, - "ph": "M", - "args": { - "sort_index": 29 - } - }, { "name": "thread_name", "pid": 3550586784, @@ -53,15 +44,6 @@ "name": "Communication(Not Overlapped)" } }, - { - "name": "thread_sort_index", - "pid": 3550586784, - "tid": 1, - "ph": "M", - "args": { - "sort_index": 1 - } - }, { "name": "thread_name", "pid": 3550586784, @@ -71,15 +53,6 @@ "name": "Computing" } }, - { - "name": "thread_sort_index", - "pid": 3550586784, - "tid": 2, - "ph": "M", - "args": { - "sort_index": 2 - } - }, { "name": "thread_name", "pid": 3550586784, @@ -89,15 +62,6 @@ "name": "Free" } }, - { - "name": "thread_sort_index", - "pid": 3550586784, - "tid": 3, - "ph": "M", - "args": { - "sort_index": 3 - } - }, { "name": "Computing", "pid": 3550586784, diff --git a/docs/data/data_directory.md b/docs/data/data_directory.md index 3a506d6..3b9ff0a 100644 --- a/docs/data/data_directory.md +++ b/docs/data/data_directory.md @@ -7,9 +7,54 @@ └── / └── prof_*.json.gz ``` -### 数据解析文件 prof_*.json.gz,解析文件缺少字段见解析日志warning,解析文件内容示例: - -![img_1.png](img_1.png) +### 数据解析文件 prof_*.json.gz,解析文件内容包含distrubutedInfo、traceEvent等字段,数据内容一般包含ts、dur等字段,解析文件内容示例: +json里需要有 +``` +{ + "schemaVersion": 1, + "deviceProperties": [ + { + "id": 0, "name": "NVIDIA L20", "totalGlobalMem": 47677177856, + "computeMajor": 8, "computeMinor": 9, + "maxThreadsPerBlock": 1024, "maxThreadsPerMultiprocessor": 1536, + "regsPerBlock": 65536, "warpSize": 32, + "sharedMemPerBlock": 49152, "numSms": 92 + , "regsPerMultiprocessor": 65536, "sharedMemPerBlockOptin": 101376, "sharedMemPerMultiprocessor": 102400 + } + ], + "cupti_version": 26, + "cuda_runtime_version": 12080, + "cuda_driver_version": 12080, + "distributedInfo": {"backend": "cpu:gloo,cuda:nccl", "rank": 0, "world_size": 2, "pg_count": 9, "pg_config": [{"pg_name": "0", "pg_desc": "default_pg", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 4, "ranks": [0, 1, 2, 3]}, {"pg_name": "1", "pg_desc": "mesh_dp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 2]}, {"pg_name": "3", "pg_desc": "mesh_infer_tp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 2, "ranks": [0, 1]}, {"pg_name": "5", "pg_desc": "mesh_infer_pp", "backend_config": "cpu:gloo,cuda:nccl", "pg_size": 1, "ranks": [0]}]}, + "trace_id": "B45DDD976E4D4DDF8E3CFB28A0E2EF25", + "displayTimeUnit": "ms", + "baseTimeNanoseconds": 1767189312000000000, + "traceEvents": [ + { + "ph": "X", "cat": "cuda_runtime", "name": "cudaMemGetInfo", "pid": 369418, "tid": 1722878400, + "ts": 4541015316353.111, "dur": 10083720.552, + "args": { + "cbid": 30, "correlation": 5 + } + }, + { + "name": "process_name", "ph": "M", "ts": 4541015315505.900, "pid": 369418, "tid": 0, + "args": { + "name": "ray::WorkerDict.actor_rollout_compute_log_prob" + } + }, + { + "name": "Iteration Start: PyTorch Profiler", "ph": "i", "s": "g", + "pid": "Traces", "tid": "Trace PyTorch Profiler", "ts": 4541015315462.515 + }, + { + "name": "Record Window End", "ph": "i", "s": "g", + "pid": "", "tid": "", "ts": 4541019157986.427 + } + ], + "traceName": "/tmp/tmpx5qz1t66.json" +} +``` ## 二、采集Mstx Profiling 数据目录结构 @@ -21,6 +66,27 @@ └── ASCEND_PROFILER_OUTPUT/ └── trace_view.json ``` -### 数据解析文件 trace_view.json,解析文件内容必须包含"ph": "M",且"name": "Overlap Analysis"对应"pid"的数据,缺少字段见解析日志warning,解析文件内容示例: +### 数据解析文件 trace_view.json,解析文件内容必须包含"ph": "M",且"name": "Overlap Analysis"对应"pid"的数据,该数据一般包含ts、dur等字段,解析文件内容示例: -![img.png](img.png) +``` +[ + { + "name": "process_name", + "pid": 3550586784, + "tid": 0, + "ph": "M", + "args": { + "name": "Overlap Analysis" + } + }, + { + "name": "Computing", + "pid": 3550586784, + "tid": 2, + "ts": "1773285899055563.748", + "dur": 53.301, + "ph": "X", + "args": {} + }, +] +``` diff --git a/docs/data/img.png b/docs/data/img.png deleted file mode 100644 index 2663a9db7cbf23c201a1b0355d53b5280eb85090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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

0r&NzXu;*C8LOG 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 From afe614e23bef0529f37c69682c6385282f6a0728 Mon Sep 17 00:00:00 2001 From: gcw_fbonFwWl Date: Wed, 25 Mar 2026 09:39:27 +0800 Subject: [PATCH 16/16] revise data_directory --- .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../xxx_ascend_pt}/profiler_info_0.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../xxx_ascend_pt}/profiler_info_0.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../xxx_ascend_pt}/profiler_info_0.json | 0 .../ASCEND_PROFILER_OUTPUT/trace_view.json | 0 .../xxx_ascend_pt}/profiler_info_0.json | 0 .../prof_rank-0_031847.json.gz | Bin .../prof_rank-1_031847.json.gz | Bin .../actor_update/prof_rank-0_031904.json.gz | Bin .../actor_update/prof_rank-1_031904.json.gz | Bin ...awei_372640.1771730291744166997.pt.trace.json.gz | Bin ...awei_372640.1771730370159969000.pt.trace.json.gz | Bin docs/data/data_directory.md | 8 +++++--- 15 files changed, 5 insertions(+), 3 deletions(-) rename data/mstx_data/{discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt => mstx_profile/actor_compute_log_prob/xxx_ascend_pt}/ASCEND_PROFILER_OUTPUT/trace_view.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt => mstx_profile/actor_compute_log_prob/xxx_ascend_pt}/profiler_info_0.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt => mstx_profile/actor_update/xxx_ascend_pt}/ASCEND_PROFILER_OUTPUT/trace_view.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt => mstx_profile/actor_update/xxx_ascend_pt}/profiler_info_0.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt => mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt}/ASCEND_PROFILER_OUTPUT/trace_view.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt => mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt}/profiler_info_0.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt => mstx_profile/ref_compute_log_prob/xxx_ascend_pt}/ASCEND_PROFILER_OUTPUT/trace_view.json (100%) rename data/mstx_data/{discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt => mstx_profile/ref_compute_log_prob/xxx_ascend_pt}/profiler_info_0.json (100%) rename data/torch_data/{profile_meta => torch_profile}/actor_compute_log_prob/prof_rank-0_031847.json.gz (100%) rename data/torch_data/{profile_meta => torch_profile}/actor_compute_log_prob/prof_rank-1_031847.json.gz (100%) rename data/torch_data/{profile_meta => torch_profile}/actor_update/prof_rank-0_031904.json.gz (100%) rename data/torch_data/{profile_meta => torch_profile}/actor_update/prof_rank-1_031904.json.gz (100%) rename data/torch_data/{profile_meta => torch_profile}/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz (100%) rename data/torch_data/{profile_meta => torch_profile}/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz (100%) diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/mstx_profile/actor_compute_log_prob/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json rename to data/mstx_data/mstx_profile/actor_compute_log_prob/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json b/data/mstx_data/mstx_profile/actor_compute_log_prob/xxx_ascend_pt/profiler_info_0.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/actor_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032458973_ascend_pt/profiler_info_0.json rename to data/mstx_data/mstx_profile/actor_compute_log_prob/xxx_ascend_pt/profiler_info_0.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/mstx_profile/actor_update/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json rename to data/mstx_data/mstx_profile/actor_update/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json b/data/mstx_data/mstx_profile/actor_update/xxx_ascend_pt/profiler_info_0.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/actor_update/hostname-ajcqw.foreman.pxe_3467369_20260312032504591_ascend_pt/profiler_info_0.json rename to data/mstx_data/mstx_profile/actor_update/xxx_ascend_pt/profiler_info_0.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json rename to data/mstx_data/mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json b/data/mstx_data/mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt/profiler_info_0.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/agent_loop_rollout_replica_0/hostname-ajcqw.foreman.pxe_3472377_20260312032448508_ascend_pt/profiler_info_0.json rename to data/mstx_data/mstx_profile/agent_loop_rollout_replica_0/xxx_ascend_pt/profiler_info_0.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json b/data/mstx_data/mstx_profile/ref_compute_log_prob/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json rename to data/mstx_data/mstx_profile/ref_compute_log_prob/xxx_ascend_pt/ASCEND_PROFILER_OUTPUT/trace_view.json diff --git a/data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json b/data/mstx_data/mstx_profile/ref_compute_log_prob/xxx_ascend_pt/profiler_info_0.json similarity index 100% rename from data/mstx_data/discrete_analyse_false_json_only/ref_compute_log_prob/hostname-ajcqw.foreman.pxe_3467369_20260312032503286_ascend_pt/profiler_info_0.json rename to data/mstx_data/mstx_profile/ref_compute_log_prob/xxx_ascend_pt/profiler_info_0.json diff --git a/data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz b/data/torch_data/torch_profile/actor_compute_log_prob/prof_rank-0_031847.json.gz similarity index 100% rename from data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-0_031847.json.gz rename to data/torch_data/torch_profile/actor_compute_log_prob/prof_rank-0_031847.json.gz diff --git a/data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz b/data/torch_data/torch_profile/actor_compute_log_prob/prof_rank-1_031847.json.gz similarity index 100% rename from data/torch_data/profile_meta/actor_compute_log_prob/prof_rank-1_031847.json.gz rename to data/torch_data/torch_profile/actor_compute_log_prob/prof_rank-1_031847.json.gz diff --git a/data/torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz b/data/torch_data/torch_profile/actor_update/prof_rank-0_031904.json.gz similarity index 100% rename from data/torch_data/profile_meta/actor_update/prof_rank-0_031904.json.gz rename to data/torch_data/torch_profile/actor_update/prof_rank-0_031904.json.gz diff --git a/data/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz b/data/torch_data/torch_profile/actor_update/prof_rank-1_031904.json.gz similarity index 100% rename from data/torch_data/profile_meta/actor_update/prof_rank-1_031904.json.gz rename to data/torch_data/torch_profile/actor_update/prof_rank-1_031904.json.gz diff --git a/data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz b/data/torch_data/torch_profile/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz similarity index 100% rename from data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz rename to data/torch_data/torch_profile/agent_loop_rollout_replica_0/huawei_372640.1771730291744166997.pt.trace.json.gz diff --git a/data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz b/data/torch_data/torch_profile/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz similarity index 100% rename from data/torch_data/profile_meta/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz rename to data/torch_data/torch_profile/agent_loop_rollout_replica_0/huawei_372640.1771730370159969000.pt.trace.json.gz diff --git a/docs/data/data_directory.md b/docs/data/data_directory.md index 3b9ff0a..ecc90a8 100644 --- a/docs/data/data_directory.md +++ b/docs/data/data_directory.md @@ -7,8 +7,9 @@ └── / └── prof_*.json.gz ``` -### 数据解析文件 prof_*.json.gz,解析文件内容包含distrubutedInfo、traceEvent等字段,数据内容一般包含ts、dur等字段,解析文件内容示例: -json里需要有 + +数据解析文件 prof_*.json.gz,解析文件内容包含distrubutedInfo、traceEvent等字段,数据内容一般包含ts、dur等字段,解析文件内容示例: + ``` { "schemaVersion": 1, @@ -66,7 +67,8 @@ json里需要有 └── ASCEND_PROFILER_OUTPUT/ └── trace_view.json ``` -### 数据解析文件 trace_view.json,解析文件内容必须包含"ph": "M",且"name": "Overlap Analysis"对应"pid"的数据,该数据一般包含ts、dur等字段,解析文件内容示例: + +数据解析文件 trace_view.json,解析文件内容必须包含"ph": "M",且"name": "Overlap Analysis"对应"pid"的数据,该数据一般包含ts、dur等字段,解析文件内容示例: ``` [