cann-workbench 0.0.0-stage → 0.0.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +183 -2
  2. package/THIRD_PARTY_NOTICES.md +85 -0
  3. package/cordis.patch.yml +3 -0
  4. package/doctor/LICENSE +202 -0
  5. package/doctor/NOTICE +12 -0
  6. package/doctor/README.md +18 -0
  7. package/lib/client.js +94437 -0
  8. package/lib/index.d.ts +722 -0
  9. package/lib/index.js +33711 -0
  10. package/locale/en.json +6 -0
  11. package/locale/zh.json +6 -0
  12. package/package.json +171 -4
  13. package/skills/asc-tools/tool-ops-tune/INSTALL.md +52 -0
  14. package/skills/asc-tools/tool-ops-tune/LICENSE +38 -0
  15. package/skills/asc-tools/tool-ops-tune/README.md +167 -0
  16. package/skills/asc-tools/tool-ops-tune/SKILL.md +93 -0
  17. package/skills/asc-tools/tool-ops-tune/agent/AGENTS.md +195 -0
  18. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-implementer.md +68 -0
  19. package/skills/asc-tools/tool-ops-tune/agent/agents/perf-reviewer.md +86 -0
  20. package/skills/asc-tools/tool-ops-tune/agent/workflows/task-prompts.md +362 -0
  21. package/skills/asc-tools/tool-ops-tune/agent/workflows/troubleshooting.md +43 -0
  22. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.png +0 -0
  23. package/skills/asc-tools/tool-ops-tune/docs/figures/opstune-architecture.svg +253 -0
  24. package/skills/asc-tools/tool-ops-tune/docs/ops-tune-design.md +404 -0
  25. package/skills/asc-tools/tool-ops-tune/docs//347/224/250/344/276/213/346/236/204/345/273/272.md +730 -0
  26. package/skills/asc-tools/tool-ops-tune/docs//347/237/245/350/257/206/345/272/223/350/247/204/350/214/203.md +103 -0
  27. package/skills/asc-tools/tool-ops-tune/evals/evals.json +242 -0
  28. package/skills/asc-tools/tool-ops-tune/ops-collect/SKILL.md +146 -0
  29. package/skills/asc-tools/tool-ops-tune/ops-collect/references/tool-routing.md +86 -0
  30. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_board.sh +458 -0
  31. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_cases.py +368 -0
  32. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/collect_sim.sh +134 -0
  33. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/csv_to_db.py +314 -0
  34. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/db_bench.py +545 -0
  35. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/facts_bridge.py +1102 -0
  36. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/isolation_test.py +452 -0
  37. package/skills/asc-tools/tool-ops-tune/ops-collect/scripts/jsonl_to_cases.py +163 -0
  38. package/skills/asc-tools/tool-ops-tune/ops-family/SKILL.md +76 -0
  39. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/advanced_tiling.md +92 -0
  40. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/broadcast_design.md +160 -0
  41. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_kernel.cpp +126 -0
  42. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_add_tiling.cpp +144 -0
  43. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/broadcast_tiling_common.h +401 -0
  44. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_kernel.cpp +107 -0
  45. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/code/onedim_add_tiling.cpp +64 -0
  46. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/datacopypad_design.md +46 -0
  47. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/guide.md +14 -0
  48. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/nddma_design.md +53 -0
  49. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/onedim_design.md +114 -0
  50. package/skills/asc-tools/tool-ops-tune/ops-family/references/broadcast/ub_broadcast_design.md +67 -0
  51. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/datacopy_optimization_design.md +351 -0
  52. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/index.md +9 -0
  53. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/tail_block_design.md +268 -0
  54. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/index.md +38 -0
  55. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_aclrt_event.cpp +199 -0
  56. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/timing_harness/timing_harness_torch_event.py +130 -0
  57. package/skills/asc-tools/tool-ops-tune/ops-family/references/common/ub_resident_design.md +342 -0
  58. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/guide.md +69 -0
  59. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/index.md +4 -0
  60. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_base.template +81 -0
  61. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_big_dim.template +217 -0
  62. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_one_axis.template +336 -0
  63. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_cut_two_axis.template +781 -0
  64. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_n_last.template +340 -0
  65. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_small_shape.template +321 -0
  66. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_tensor_move.template +102 -0
  67. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd.template +480 -0
  68. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_transdata_5hd_021axis.template +533 -0
  69. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/dav3510/transpose_with_gather.template +688 -0
  70. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/templates/transpose_tiling_data.template +192 -0
  71. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_big_dim.md +220 -0
  72. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_one_axis.md +175 -0
  73. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_cut_two_axis.md +177 -0
  74. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_fusion_design.md +398 -0
  75. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_gather.md +191 -0
  76. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_n_last.md +276 -0
  77. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_small_shape.md +315 -0
  78. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tensor_move.md +203 -0
  79. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_tiling_data.md +176 -0
  80. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_021.md +206 -0
  81. package/skills/asc-tools/tool-ops-tune/ops-family/references/conversion/transpose_vconv_5hd.md +179 -0
  82. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/double_buffer_design.md +288 -0
  83. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/guide.md +46 -0
  84. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/index.md +10 -0
  85. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/CMakeLists.txt +131 -0
  86. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/README.md +55 -0
  87. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/add_custom_torch.cpp +80 -0
  88. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/ops.h +23 -0
  89. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_extension/register.cpp +30 -0
  90. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/add_custom.asc +149 -0
  91. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_host/data_utils.h +97 -0
  92. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_kernel.asc +136 -0
  93. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/op_kernel/add_custom_tiling.h +31 -0
  94. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/run.sh +87 -0
  95. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/gen_data.py +70 -0
  96. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/golden.py +34 -0
  97. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/test_torch.py +99 -0
  98. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/add_custom/scripts/verify_result.py +56 -0
  99. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/templates/usage_guide.md +61 -0
  100. package/skills/asc-tools/tool-ops-tune/ops-family/references/elementwise/vector_efficiency_design.md +203 -0
  101. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_mixed_kernel_design.md +174 -0
  102. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/fa_roofline_design.md +141 -0
  103. package/skills/asc-tools/tool-ops-tune/ops-family/references/fa/guide.md +87 -0
  104. package/skills/asc-tools/tool-ops-tune/ops-family/references/knowledge_gaps.json +56 -0
  105. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/best-practices-guide.md +14 -0
  106. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/fullload_design.md +344 -0
  107. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/guide.md +52 -0
  108. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/mte2_preload_design.md +320 -0
  109. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/pingpong_design.md +254 -0
  110. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/scale_coalescing_design.md +282 -0
  111. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/streamk_design.md +374 -0
  112. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/swat_design.md +423 -0
  113. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/matmul_basic_blaze.template +165 -0
  114. package/skills/asc-tools/tool-ops-tune/ops-family/references/matmul/templates/usage_guide.md +29 -0
  115. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/best-practices-guide.md +43 -0
  116. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/guide.md +42 -0
  117. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/local_matmul_design.md +130 -0
  118. package/skills/asc-tools/tool-ops-tune/ops-family/references/mc2/pipeline_balancing_design.md +502 -0
  119. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/guide.md +178 -0
  120. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/kernel_utils.template +75 -0
  121. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_full_load.template +429 -0
  122. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_recompute.template +485 -0
  123. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ar_small_r.template +348 -0
  124. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_full_load.template +574 -0
  125. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_online.template +324 -0
  126. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_ara_recompute.template +436 -0
  127. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/dav310/softmax_v2_base.template +950 -0
  128. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/fused_attention_online_softmax_design.md +428 -0
  129. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_full_load.md +137 -0
  130. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_recompute.md +135 -0
  131. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ar_small_r.md +122 -0
  132. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_full_load.md +144 -0
  133. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_online.md +185 -0
  134. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_ara_recompute.md +163 -0
  135. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling.template +460 -0
  136. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/softmax_v2_tiling_data.template +278 -0
  137. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/state_resident_design.md +337 -0
  138. package/skills/asc-tools/tool-ops-tune/ops-family/references/reduce/templates/usage_guide.md +253 -0
  139. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/coding_principles.md +476 -0
  140. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/conv_scalar.md +163 -0
  141. package/skills/asc-tools/tool-ops-tune/ops-family/references/scalar/guide.md +30 -0
  142. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/guide.md +91 -0
  143. package/skills/asc-tools/tool-ops-tune/ops-family/references/simt/optimization-guide.md +110 -0
  144. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/guide.md +83 -0
  145. package/skills/asc-tools/tool-ops-tune/ops-family/references/sort/radix_sort.md +354 -0
  146. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/family_asset_audit.py +68 -0
  147. package/skills/asc-tools/tool-ops-tune/ops-family/scripts/tiling_candidates.py +419 -0
  148. package/skills/asc-tools/tool-ops-tune/ops-mechanism/SKILL.md +23 -0
  149. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_groupedmatmul_pipeline.md +23 -0
  150. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/ascendc/case_triton_atomic_revert.md +19 -0
  151. package/skills/asc-tools/tool-ops-tune/ops-mechanism/cases/mc2/case_mc2_fusion.md +19 -0
  152. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/api-usage.md +70 -0
  153. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-regbase-vf.md +45 -0
  154. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/ascendc-tiling.md +51 -0
  155. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/data-copy.md +67 -0
  156. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/index.md +45 -0
  157. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2-balancing.md +77 -0
  158. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/mc2.md +103 -0
  159. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/memory-hierarchy.md +40 -0
  160. package/skills/asc-tools/tool-ops-tune/ops-mechanism/references/optimize/pipeline.md +95 -0
  161. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/case_backfill.py +170 -0
  162. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/log_gap.py +145 -0
  163. package/skills/asc-tools/tool-ops-tune/ops-mechanism/scripts/mc2_search.py +367 -0
  164. package/skills/asc-tools/tool-ops-tune/ops-report/SKILL.md +77 -0
  165. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/run_evals.py +963 -0
  166. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/install-hooks.sh +65 -0
  167. package/skills/asc-tools/tool-ops-tune/ops-verdict/evals/smoke/run_smoke.sh +535 -0
  168. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/core_tail_a5.csv +25 -0
  169. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/few_cores_a5.csv +5 -0
  170. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/mte2_bound_a2.csv +17 -0
  171. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/multi_kernel_mix_a5.csv +7 -0
  172. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/no_bound_a5.csv +9 -0
  173. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/serial_no_overlap_a2.csv +9 -0
  174. package/skills/asc-tools/tool-ops-tune/ops-verdict/fixtures/vec_bound_a5.csv +9 -0
  175. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/io-contracts.md +94 -0
  176. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/rule-schema.md +130 -0
  177. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/scope-schema.md +61 -0
  178. package/skills/asc-tools/tool-ops-tune/ops-verdict/references/soc-spec.yaml +140 -0
  179. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L0-instruction.yaml +67 -0
  180. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L1-single-core.yaml +316 -0
  181. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L2-inter-core.yaml +173 -0
  182. package/skills/asc-tools/tool-ops-tune/ops-verdict/rules/L3-inter-card.yaml +156 -0
  183. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/batch_pipeline.py +466 -0
  184. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/calibrate.py +249 -0
  185. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/delta_compare.py +278 -0
  186. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/render_html.py +304 -0
  187. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/snapshot.py +200 -0
  188. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/trace_bubble.py +331 -0
  189. package/skills/asc-tools/tool-ops-tune/ops-verdict/scripts/verdict.py +1094 -0
  190. package/skills/asc-tools/tool-ops-tune/scripts/diff_audit.py +281 -0
  191. package/skills/asc-tools/tool-precision-debug/LICENSE +38 -0
  192. package/skills/asc-tools/tool-precision-debug/README.md +190 -0
  193. package/skills/asc-tools/tool-precision-debug/scripts/install.sh +475 -0
  194. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/LICENSE +38 -0
  195. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/SKILL.md +136 -0
  196. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/evals/evals.json +932 -0
  197. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/baseline.md +69 -0
  198. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/checkpoint-design.md +82 -0
  199. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/dumptensor.md +83 -0
  200. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/hypothesis-experiment.md +114 -0
  201. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/index.md +20 -0
  202. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/localization.md +85 -0
  203. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/numerical-modeling.md +94 -0
  204. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/operator-modeling.md +116 -0
  205. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/progressive-error-analysis.md +86 -0
  206. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reporting.md +140 -0
  207. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/reproducibility.md +121 -0
  208. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/semantic-bisection.md +72 -0
  209. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/diagnosis/sensitive-points.md +146 -0
  210. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fp16-promotion-boundary.md +46 -0
  211. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/fused-rmsnorm-gelu-residual.md +162 -0
  212. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/index.md +16 -0
  213. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/integer-float-collision.md +44 -0
  214. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/partial-statistics-merge.md +30 -0
  215. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/softplus-v2-grad-family.md +156 -0
  216. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/sync-dataflow-handshake.md +89 -0
  217. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/tail-valid-region-state.md +30 -0
  218. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/cases/thnn-fused-gru-bias-reduction.md +73 -0
  219. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/index.md +34 -0
  220. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/accumulation-order.md +108 -0
  221. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/algorithm-parameter-contract.md +118 -0
  222. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/buffer-lifetime-alias.md +133 -0
  223. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/cast-rounding.md +76 -0
  224. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/complex-operator-boundary.md +48 -0
  225. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/data-movement-alignment.md +104 -0
  226. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/golden-host-contract.md +84 -0
  227. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index-address-ownership.md +57 -0
  228. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/index.md +32 -0
  229. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/multicore-ownership.md +117 -0
  230. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/pipeline-sync-visibility.md +146 -0
  231. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/precision-mode-approximation.md +90 -0
  232. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/shape-boundary-contract.md +57 -0
  233. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/special-values.md +122 -0
  234. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/mechanisms/tiling-tail-state.md +146 -0
  235. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/broadcast-transpose.md +64 -0
  236. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/convolution.md +60 -0
  237. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/dynamic-quant.md +47 -0
  238. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/index.md +18 -0
  239. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/matmul-mmad.md +131 -0
  240. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/normalization.md +145 -0
  241. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/reduction.md +167 -0
  242. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/softplus-v2-grad.md +58 -0
  243. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/patterns/operators/sort-merge.md +65 -0
  244. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/index.md +18 -0
  245. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/kernel-debug-data.md +133 -0
  246. package/skills/asc-tools/tool-precision-debug/skills/tool-precision-debug/references/tools/msobjdump.md +150 -0
  247. package/skills/cann-doctor/SKILL.md +15 -0
  248. package/skills/catalog.json +79 -0
  249. package/skills/mattpocock/GLOSSARY.md +30 -0
  250. package/skills/mattpocock/LICENSE +21 -0
  251. package/skills/mattpocock/README.md +258 -0
  252. package/skills/mattpocock/SCOPE.md +35 -0
  253. package/skills/mattpocock/docs/agents/triage-labels.md +15 -0
  254. package/skills/mattpocock/docs/engineering/ask-matt.md +91 -0
  255. package/skills/mattpocock/docs/engineering/code-review.md +101 -0
  256. package/skills/mattpocock/docs/engineering/codebase-design.md +88 -0
  257. package/skills/mattpocock/docs/engineering/diagnosing-bugs.md +94 -0
  258. package/skills/mattpocock/docs/engineering/domain-modeling.md +86 -0
  259. package/skills/mattpocock/docs/engineering/grill-with-docs.md +82 -0
  260. package/skills/mattpocock/docs/engineering/implement-spec.md +86 -0
  261. package/skills/mattpocock/docs/engineering/implement.md +97 -0
  262. package/skills/mattpocock/docs/engineering/improve-codebase-architecture.md +113 -0
  263. package/skills/mattpocock/docs/engineering/pr.md +79 -0
  264. package/skills/mattpocock/docs/engineering/prototype.md +67 -0
  265. package/skills/mattpocock/docs/engineering/research.md +73 -0
  266. package/skills/mattpocock/docs/engineering/resolving-merge-conflicts.md +53 -0
  267. package/skills/mattpocock/docs/engineering/retro.md +81 -0
  268. package/skills/mattpocock/docs/engineering/setup-matt-pocock-skills.md +94 -0
  269. package/skills/mattpocock/docs/engineering/tdd.md +94 -0
  270. package/skills/mattpocock/docs/engineering/to-spec.md +81 -0
  271. package/skills/mattpocock/docs/engineering/to-tickets.md +99 -0
  272. package/skills/mattpocock/docs/engineering/triage.md +109 -0
  273. package/skills/mattpocock/docs/engineering/wayfinder.md +103 -0
  274. package/skills/mattpocock/docs/engineering/wizard.md +96 -0
  275. package/skills/mattpocock/docs/productivity/grill-me.md +76 -0
  276. package/skills/mattpocock/docs/productivity/grilling.md +87 -0
  277. package/skills/mattpocock/docs/productivity/handoff.md +76 -0
  278. package/skills/mattpocock/docs/productivity/teach.md +97 -0
  279. package/skills/mattpocock/docs/productivity/to-questionnaire.md +78 -0
  280. package/skills/mattpocock/docs/productivity/wait-what.md +36 -0
  281. package/skills/mattpocock/docs/productivity/writing-for-agents.md +70 -0
  282. package/skills/mattpocock/scripts/link-skills.sh +62 -0
  283. package/skills/mattpocock/scripts/list-skills.sh +7 -0
  284. package/skills/mattpocock/scripts/sync-plugin-version.mjs +41 -0
  285. package/skills/mattpocock/skills/deprecated/README.md +3 -0
  286. package/skills/mattpocock/skills/engineering/README.md +34 -0
  287. package/skills/mattpocock/skills/engineering/ask-matt/PHASE-BOUNDARIES.md +55 -0
  288. package/skills/mattpocock/skills/engineering/ask-matt/SKILL.md +97 -0
  289. package/skills/mattpocock/skills/engineering/ask-matt/agents/openai.yaml +5 -0
  290. package/skills/mattpocock/skills/engineering/code-review/SKILL.md +89 -0
  291. package/skills/mattpocock/skills/engineering/code-review/agents/openai.yaml +3 -0
  292. package/skills/mattpocock/skills/engineering/codebase-design/DEEPENING.md +37 -0
  293. package/skills/mattpocock/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +44 -0
  294. package/skills/mattpocock/skills/engineering/codebase-design/SKILL.md +114 -0
  295. package/skills/mattpocock/skills/engineering/codebase-design/agents/openai.yaml +3 -0
  296. package/skills/mattpocock/skills/engineering/diagnosing-bugs/SKILL.md +138 -0
  297. package/skills/mattpocock/skills/engineering/diagnosing-bugs/agents/openai.yaml +3 -0
  298. package/skills/mattpocock/skills/engineering/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  299. package/skills/mattpocock/skills/engineering/domain-modeling/ADR-FORMAT.md +47 -0
  300. package/skills/mattpocock/skills/engineering/domain-modeling/GLOSSARY-FORMAT.md +60 -0
  301. package/skills/mattpocock/skills/engineering/domain-modeling/SKILL.md +74 -0
  302. package/skills/mattpocock/skills/engineering/domain-modeling/agents/openai.yaml +3 -0
  303. package/skills/mattpocock/skills/engineering/grill-with-docs/SKILL.md +7 -0
  304. package/skills/mattpocock/skills/engineering/grill-with-docs/agents/openai.yaml +5 -0
  305. package/skills/mattpocock/skills/engineering/implement/SKILL.md +17 -0
  306. package/skills/mattpocock/skills/engineering/implement/agents/openai.yaml +5 -0
  307. package/skills/mattpocock/skills/engineering/implement-spec/SKILL.md +42 -0
  308. package/skills/mattpocock/skills/engineering/implement-spec/agents/openai.yaml +5 -0
  309. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/HTML-REPORT.md +123 -0
  310. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/SKILL.md +71 -0
  311. package/skills/mattpocock/skills/engineering/improve-codebase-architecture/agents/openai.yaml +5 -0
  312. package/skills/mattpocock/skills/engineering/pr/CREDITS.md +3 -0
  313. package/skills/mattpocock/skills/engineering/pr/SKILL.md +170 -0
  314. package/skills/mattpocock/skills/engineering/pr/agents/openai.yaml +3 -0
  315. package/skills/mattpocock/skills/engineering/prototype/LOGIC.md +67 -0
  316. package/skills/mattpocock/skills/engineering/prototype/SKILL.md +26 -0
  317. package/skills/mattpocock/skills/engineering/prototype/UI.md +112 -0
  318. package/skills/mattpocock/skills/engineering/prototype/agents/openai.yaml +3 -0
  319. package/skills/mattpocock/skills/engineering/research/SKILL.md +12 -0
  320. package/skills/mattpocock/skills/engineering/research/agents/openai.yaml +3 -0
  321. package/skills/mattpocock/skills/engineering/retro/SKILL.md +44 -0
  322. package/skills/mattpocock/skills/engineering/retro/agents/openai.yaml +5 -0
  323. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/SKILL.md +120 -0
  324. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/agents/openai.yaml +5 -0
  325. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/domain.md +51 -0
  326. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +50 -0
  327. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +46 -0
  328. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +30 -0
  329. package/skills/mattpocock/skills/engineering/setup-matt-pocock-skills/triage-labels.md +15 -0
  330. package/skills/mattpocock/skills/engineering/tdd/SKILL.md +38 -0
  331. package/skills/mattpocock/skills/engineering/tdd/agents/openai.yaml +3 -0
  332. package/skills/mattpocock/skills/engineering/tdd/mocking.md +59 -0
  333. package/skills/mattpocock/skills/engineering/tdd/tests.md +77 -0
  334. package/skills/mattpocock/skills/engineering/to-spec/SKILL.md +75 -0
  335. package/skills/mattpocock/skills/engineering/to-spec/agents/openai.yaml +5 -0
  336. package/skills/mattpocock/skills/engineering/to-tickets/SKILL.md +105 -0
  337. package/skills/mattpocock/skills/engineering/to-tickets/agents/openai.yaml +5 -0
  338. package/skills/mattpocock/skills/engineering/triage/AGENT-BRIEF.md +207 -0
  339. package/skills/mattpocock/skills/engineering/triage/OUT-OF-SCOPE.md +105 -0
  340. package/skills/mattpocock/skills/engineering/triage/SKILL.md +112 -0
  341. package/skills/mattpocock/skills/engineering/triage/agents/openai.yaml +5 -0
  342. package/skills/mattpocock/skills/engineering/wayfinder/SKILL.md +128 -0
  343. package/skills/mattpocock/skills/engineering/wayfinder/agents/openai.yaml +5 -0
  344. package/skills/mattpocock/skills/engineering/wizard/SKILL.md +44 -0
  345. package/skills/mattpocock/skills/engineering/wizard/agents/openai.yaml +3 -0
  346. package/skills/mattpocock/skills/engineering/wizard/template.sh +223 -0
  347. package/skills/mattpocock/skills/in-progress/README.md +17 -0
  348. package/skills/mattpocock/skills/in-progress/chief-of-staff/SKILL.md +75 -0
  349. package/skills/mattpocock/skills/in-progress/chief-of-staff/agents/openai.yaml +5 -0
  350. package/skills/mattpocock/skills/in-progress/claude-handoff/SKILL.md +18 -0
  351. package/skills/mattpocock/skills/in-progress/claude-handoff/agents/openai.yaml +5 -0
  352. package/skills/mattpocock/skills/in-progress/loop-me/SKILL.md +32 -0
  353. package/skills/mattpocock/skills/in-progress/loop-me/agents/openai.yaml +5 -0
  354. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/SKILL.md +102 -0
  355. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/agents/openai.yaml +5 -0
  356. package/skills/mattpocock/skills/in-progress/setup-ts-deep-modules/dependency-cruiser.config.cjs +95 -0
  357. package/skills/mattpocock/skills/in-progress/software-factory/EXAMPLE-TASKS.md +80 -0
  358. package/skills/mattpocock/skills/in-progress/software-factory/GIT-HOSTS.md +84 -0
  359. package/skills/mattpocock/skills/in-progress/software-factory/OBSERVABILITY-PLATFORMS.md +75 -0
  360. package/skills/mattpocock/skills/in-progress/software-factory/RUNNERS.md +94 -0
  361. package/skills/mattpocock/skills/in-progress/software-factory/SKILL.md +98 -0
  362. package/skills/mattpocock/skills/in-progress/software-factory/TICKET-TRACKERS.md +85 -0
  363. package/skills/mattpocock/skills/in-progress/writing-beats/SKILL.md +67 -0
  364. package/skills/mattpocock/skills/in-progress/writing-beats/agents/openai.yaml +5 -0
  365. package/skills/mattpocock/skills/in-progress/writing-fragments/SKILL.md +79 -0
  366. package/skills/mattpocock/skills/in-progress/writing-fragments/agents/openai.yaml +5 -0
  367. package/skills/mattpocock/skills/in-progress/writing-shape/SKILL.md +79 -0
  368. package/skills/mattpocock/skills/in-progress/writing-shape/agents/openai.yaml +5 -0
  369. package/skills/mattpocock/skills/misc/README.md +8 -0
  370. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/SKILL.md +95 -0
  371. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/agents/openai.yaml +3 -0
  372. package/skills/mattpocock/skills/misc/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
  373. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/SKILL.md +118 -0
  374. package/skills/mattpocock/skills/misc/migrate-to-shoehorn/agents/openai.yaml +3 -0
  375. package/skills/mattpocock/skills/misc/scaffold-exercises/SKILL.md +106 -0
  376. package/skills/mattpocock/skills/misc/scaffold-exercises/agents/openai.yaml +3 -0
  377. package/skills/mattpocock/skills/misc/setup-pre-commit/SKILL.md +91 -0
  378. package/skills/mattpocock/skills/misc/setup-pre-commit/agents/openai.yaml +3 -0
  379. package/skills/mattpocock/skills/productivity/README.md +20 -0
  380. package/skills/mattpocock/skills/productivity/grill-me/SKILL.md +7 -0
  381. package/skills/mattpocock/skills/productivity/grill-me/agents/openai.yaml +5 -0
  382. package/skills/mattpocock/skills/productivity/grilling/SKILL.md +30 -0
  383. package/skills/mattpocock/skills/productivity/grilling/agents/openai.yaml +3 -0
  384. package/skills/mattpocock/skills/productivity/handoff/SKILL.md +16 -0
  385. package/skills/mattpocock/skills/productivity/handoff/agents/openai.yaml +5 -0
  386. package/skills/mattpocock/skills/productivity/teach/GLOSSARY-FORMAT.md +35 -0
  387. package/skills/mattpocock/skills/productivity/teach/LEARNING-RECORD-FORMAT.md +46 -0
  388. package/skills/mattpocock/skills/productivity/teach/MISSION-FORMAT.md +31 -0
  389. package/skills/mattpocock/skills/productivity/teach/RESOURCES-FORMAT.md +32 -0
  390. package/skills/mattpocock/skills/productivity/teach/SKILL.md +140 -0
  391. package/skills/mattpocock/skills/productivity/teach/agents/openai.yaml +5 -0
  392. package/skills/mattpocock/skills/productivity/to-questionnaire/SKILL.md +54 -0
  393. package/skills/mattpocock/skills/productivity/to-questionnaire/agents/openai.yaml +5 -0
  394. package/skills/mattpocock/skills/productivity/wait-what/SKILL.md +7 -0
  395. package/skills/mattpocock/skills/productivity/wait-what/agents/openai.yaml +5 -0
  396. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL-MECHANICS.md +22 -0
  397. package/skills/mattpocock/skills/productivity/writing-for-agents/SKILL.md +81 -0
  398. package/skills/mattpocock/skills/productivity/writing-for-agents/agents/openai.yaml +3 -0
  399. package/skills/task-agents/operator-development/Agent.md +71 -0
  400. package/skills/task-agents/operator-development/skills.json +120 -0
  401. package/skills/task-agents/operator-development/stages.schema.json +532 -0
  402. package/skills/task-agents/performance-optimization/Agent.md +78 -0
  403. package/skills/task-agents/performance-optimization/skills.json +64 -0
  404. package/skills/task-agents/response-protocol.md +35 -0
  405. package/skills/task-agents/sidebar-contracts.schema.json +4168 -0
  406. package/skills/task-agents/sidebar-selection.schema.json +971 -0
  407. package/skills/task-agents/visuals/components.json +283 -0
  408. package/skills/task-agents/visuals/contracts.schema.json +3628 -0
@@ -0,0 +1,452 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ----------------------------------------------------------------------------------------------------------
4
+ # Copyright (c) 2026 Huawei Technologies Co., Ltd.
5
+ # This program is free software, you can redistribute it and/or modify it under the terms and conditions of
6
+ # CANN Open Software License Agreement Version 2.0 (the "License").
7
+ # Please refer to the License for details. You may not use this file except in compliance with the License.
8
+ # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
9
+ # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
10
+ # See LICENSE in the root of the software repository for the full text of the License.
11
+ # ----------------------------------------------------------------------------------------------------------
12
+ """isolation_test.py — MC² 隔离测试编排(T_comm / T_compute 采集 → R 值)
13
+
14
+ 设计对齐(docs/ops-tune-design.md §6 数据契约体系,opstune.isolation/1.0):
15
+ - MC² 隔离测试方法论此前长期停留在文档形态(复制源码、注释 process、tileCnt=1、
16
+ 多 rank 采集、算 R 值全靠人工执行)—— 本脚本把它变成可重复的实验编排。
17
+ - 纪律继承:隔离测试在源码副本进行(不碰用户原目录);多 rank 并行采集;
18
+ 循环 ≥10 次前 5 warm-up;跨 rank 取 max(木桶效应)。
19
+ - 输出直接可喂 verdict.py:--scalar t_comm_us=...,t_compute_us=...
20
+
21
+ 用法(典型,宿主程序须支持 COMM_ONLY/COMPUTE_ONLY 环境变量开关或源码注释由 Agent 完成):
22
+ python3 isolation_test.py --exe ./build/mc2_demo --args "4096 4096 4096 4 perf 1" \\
23
+ --prof-dir ./prof/iso --output iso_result.json
24
+
25
+ 输出 iso_result.json:
26
+ { t_comm_us, t_compute_us, r_value, bound_hint, rank_detail: {...}, steady_rule: "10轮前5warmup后5均值,跨rank取max" }
27
+
28
+ R 值档位真源:ops-verdict 规则包 L3-inter-card.yaml 的 r_value 叶子条件(脚本启动时解析,
29
+ 解析失败即报错退出——fail loud,保证规则演进时脚本不会静默回退到旧常量)。
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import argparse
35
+ import csv
36
+ import json
37
+ import os
38
+ import subprocess
39
+ import sys
40
+ from pathlib import Path
41
+
42
+ WARMUP = 5 # 前 5 次 warm-up(L2 预热、DVFS 爬升)
43
+ LOOPS = 10 # 循环至少 10 次
44
+ # MTE2 占比候选列(与 L1 词汇表 mte2_ratio 同源,三代列名兼容)
45
+ MTE2_RATIO_COLUMNS = [
46
+ "aic_mte2_ratio",
47
+ "aiv_mte2_ratio",
48
+ "ai_mte2_ratio",
49
+ "Mte2Utilization(%)",
50
+ "mte2_ratio",
51
+ "MTE2(%)",
52
+ ]
53
+
54
+ # L3 规则包默认路径(相对本脚本定位,仓内布局免传参;--rules 可覆写)
55
+ L3_RULES_FILE = "L3-inter-card" + ".yaml" # MC² 卡间判定规则包
56
+ DEFAULT_L3_RULES = (
57
+ Path(__file__).resolve().parents[2] / "ops-verdict" / "rules" / L3_RULES_FILE
58
+ )
59
+
60
+
61
+ def r_bands_from_rules(rules_path: str) -> list[tuple]:
62
+ """从 L3 规则包 YAML 派生 R 值档位表(规则 YAML 是唯一真源)。
63
+
64
+ 解析每条以 r_value 为唯一 metric 叶子条件、区间形状完整的规则,产出
65
+ [(lo, hi, rule_id, name, closed_upper), ...] 按 hi 升序(lo=None 表示
66
+ 无下界)。closed_upper 由上界叶子的比较算子推导(between/lte → 闭,
67
+ lt → 开)——档界的开闭语义随规则包演进,不按规则 ID 硬编码反推。
68
+ 解析不出任何档位 → 直接抛错退出(fail loud)。
69
+ """
70
+ import yaml
71
+
72
+ pack = yaml.safe_load(Path(rules_path).read_text(encoding="utf-8"))
73
+ bands = []
74
+ for rule in pack.get("rules", []):
75
+ leaves = _collect_metric_leaves(rule.get("condition"), "r_value")
76
+ if not leaves:
77
+ continue
78
+ lo = hi = None
79
+ closed_upper = True # between → 闭上界
80
+ ok = True
81
+ for leaf in leaves:
82
+ op, val = leaf["op"], leaf["value"]
83
+ if op == "between" and isinstance(val, list) and len(val) == 2:
84
+ lo, hi = float(val[0]), float(val[1])
85
+ elif isinstance(val, (int, float)):
86
+ if op in ("gt", "gte") and lo is None:
87
+ lo = float(val)
88
+ elif op in ("lt", "lte") and hi is None:
89
+ hi = float(val)
90
+ closed_upper = op == "lte"
91
+ else:
92
+ ok = False
93
+ break
94
+ else:
95
+ ok = False
96
+ break
97
+ if ok and (lo is not None or hi is not None):
98
+ # 单叶 gt(无上界,如 STRONG_COMPUTE R>2):hi 置 inf,作为兜底档
99
+ bands.append(
100
+ (
101
+ lo,
102
+ hi if hi is not None else float("inf"),
103
+ rule["id"],
104
+ rule.get("name", rule["id"]),
105
+ closed_upper,
106
+ )
107
+ )
108
+ if not bands:
109
+ raise RuntimeError(
110
+ f"无法从 {rules_path} 解析出 r_value 档位(规则结构变化?fail loud 退出)"
111
+ )
112
+ return sorted(bands, key=lambda b: b[1])
113
+
114
+
115
+ def classify_r(r: float, bands: list[tuple]) -> tuple[str, str]:
116
+ """按派生档位分类 R 值:唯一命中档 = 唯一满足区间条件的档;多重命中取最紧。
117
+
118
+ 边界语义由 band 元组的 closed_upper 携带(r_bands_from_rules 从上界
119
+ 叶子算子推导:between/lte → 闭、lt → 开)——r 恰落档界
120
+ (R=0.5/0.9/1.1/2.0)时须比较真实区间条件:开上界档要求 r < hi,
121
+ 闭上界档 r == hi 即命中。规则改名/新增档位时开闭语义自动跟随,
122
+ 不依赖按规则 ID 的硬编码反推。
123
+ """
124
+ # 第一轮:严格区间命中(lo ≤ r 且 r < hi 开上界 / r ≤ hi 闭上界)
125
+ strict = []
126
+ for lo, hi, bid, name, closed_upper in bands:
127
+ if (lo is None or r >= lo) and r < hi:
128
+ strict.append((lo, hi, bid, name, closed_upper))
129
+ elif (lo is None or r >= lo) and r == hi and closed_upper:
130
+ # r 恰等于闭上界档(between/lte)的 hi → 该档命中(如 BALANCED [0.9,1.1] 命中 R=1.1)
131
+ # 开上界档(lt)在 r==hi 时不命中
132
+ strict.append((lo, hi, bid, name, closed_upper))
133
+ if len(strict) == 1:
134
+ return strict[0][2], strict[0][3]
135
+ if len(strict) > 1:
136
+ # 多重命中取最紧上界档(区间重叠时的确定性规则;正常规则集不触发)
137
+ strict.sort(key=lambda b: b[1])
138
+ return strict[0][2], strict[0][3]
139
+ # 无严格命中(r 落在档界间隙或超出覆盖)→ 兜底最紧上界
140
+ for lo, hi, bid, name, closed_upper in bands:
141
+ if r <= hi:
142
+ return bid, name
143
+ return "UNRESOLVED", "超出规则档位覆盖范围(检查 L3 规则包区间连续性)"
144
+
145
+
146
+ def _collect_metric_leaves(cond, metric: str) -> list[dict]:
147
+ """递归收集条件树中引用指定 metric 的叶子。"""
148
+ out = []
149
+ if cond is None:
150
+ return out
151
+ if isinstance(cond, list):
152
+ for sub in cond:
153
+ out.extend(_collect_metric_leaves(sub, metric))
154
+ return out
155
+ if isinstance(cond, dict):
156
+ if "metric" in cond and cond["metric"] == metric:
157
+ out.append(cond)
158
+ for key in ("all", "any"):
159
+ if key in cond:
160
+ out.extend(_collect_metric_leaves(cond[key], metric))
161
+ return out
162
+
163
+
164
+ def parse_task_durations(prof_dir: str) -> dict[str, list[float]]:
165
+ """从 msprof 产出的 op_summary_*.csv 提取 Task Duration(us),按文件分组返回。
166
+
167
+ 每个文件 ≈ 一个 rank 的独立 op_summary(msprof 每设备一份 PROF 目录)——
168
+ 分组是「逐 rank 稳态均值再跨 rank 取 max」(木桶口径)的前提——
169
+ 全部行统一求均值在数学上不等价,mean(所有行) ≤ max(各 rank 均值),
170
+ 系统性低估 T → R 偏向「计算 bound」结论)。
171
+ 返回 {文件名: [时长列表]};空文件不产生键。
172
+ """
173
+ groups: dict[str, list[float]] = {}
174
+ for p in sorted(Path(prof_dir).rglob("op_summary_*.csv")):
175
+ vals = []
176
+ with open(p, encoding="utf-8-sig", errors="replace") as f:
177
+ for row in csv.DictReader(f):
178
+ v = row.get("Task Duration(us)") or row.get("Task Duration")
179
+ if v:
180
+ try:
181
+ vals.append(float(str(v).strip()))
182
+ except ValueError:
183
+ pass
184
+ if vals:
185
+ groups[str(p)] = vals
186
+ return groups
187
+
188
+
189
+ def steady_max(grouped: dict[str, list[float]], warmup: int) -> float | None:
190
+ """木桶口径稳态聚合:每 rank(文件组)内丢弃前 warmup 次取均值,
191
+ 再跨 rank 取 max——所有 rank 经 BarrierAll/CrossCoreFlag 同步,整体性能由
192
+ 最慢 rank 决定。"""
193
+ per_rank = []
194
+ for vals in grouped.values():
195
+ steady = vals[warmup:] if len(vals) > warmup else vals
196
+ if steady:
197
+ per_rank.append(sum(steady) / len(steady))
198
+ return max(per_rank) if per_rank else None
199
+
200
+
201
+ def parse_pipe_ratio(prof_dir: str, columns: list[str]) -> dict[str, float]:
202
+ """从 op_summary_*.csv 提取 pipe 占比列的逐 rank 稳态均值(mte2_ratio_pure 等的生产者)。
203
+
204
+ 返回 {文件名: 稳态均值};列不存在或全空 → 空 dict。
205
+ """
206
+ groups: dict[str, float] = {}
207
+ for p in sorted(Path(prof_dir).rglob("op_summary_*.csv")):
208
+ vals = []
209
+ with open(p, encoding="utf-8-sig", errors="replace") as f:
210
+ for row in csv.DictReader(f):
211
+ for col in columns:
212
+ v = row.get(col)
213
+ if v and str(v).strip() not in ("", "N/A", "NA", "-"):
214
+ try:
215
+ fv = float(str(v).strip().replace("%", ""))
216
+ vals.append(
217
+ fv * 100 if 0 <= fv <= 1.5 else fv
218
+ ) # ratio_to_pct 兼容
219
+ break
220
+ except ValueError:
221
+ pass
222
+ if vals:
223
+ groups[str(p)] = sum(vals) / len(vals)
224
+ return groups
225
+
226
+
227
+ def parse_switch(spec: str) -> dict:
228
+ """把 --comm-switch/--compute-switch 解析成环境变量注入 dict。
229
+
230
+ 支持两种形式:
231
+ - 纯 KEY=VALUE 或 KEY=VALUE,K2=V2:注入这些变量(默认 MC2_MODE=COMM_ONLY 等)
232
+ - 裸字符串(无 =):视为提示文本,不注入(打印用)
233
+ """
234
+ env = {}
235
+ for kv in spec.split(","):
236
+ kv = kv.strip()
237
+ if "=" in kv:
238
+ k, v = kv.split("=", 1)
239
+ env[k.strip()] = v.strip()
240
+ return env
241
+
242
+
243
+ def run_msprof_task_based(
244
+ exe: str, exe_args: str, out: str, env_extra: dict
245
+ ) -> dict[str, list[float]]:
246
+ """msprof task-based 采集一轮(MC² 专用路径),返回按 op_summary 文件(≈按 rank)
247
+ 分组的 Task Duration。
248
+
249
+ env 采用整体替换语义(subprocess.run(env=...) 不继承父进程环境),因此必须
250
+ 以 os.environ 为底、env_extra 覆盖——否则 PATH/ASCEND_HOME_PATH/LD_LIBRARY_PATH
251
+ 全部丢失,msprof 无法运行。
252
+ """
253
+ env = {**os.environ, **env_extra}
254
+ cmd = [
255
+ "msprof",
256
+ f"--output={out}",
257
+ "--ai-core=on",
258
+ "--aic-mode=task-based",
259
+ "--aic-metrics=PipeUtilization",
260
+ "--task-time=on",
261
+ "--ascendcl=on",
262
+ f"--application={exe} {exe_args}",
263
+ ]
264
+ proc = subprocess.run(cmd, capture_output=True, text=True, timeout=1800, env=env)
265
+ if proc.returncode != 0:
266
+ raise RuntimeError(f"msprof 失败: {proc.stderr[:400]}")
267
+ return parse_task_durations(out)
268
+
269
+
270
+ def main() -> int:
271
+ ap = argparse.ArgumentParser(description="MC² 隔离测试编排(T_comm/T_compute → R)")
272
+ ap.add_argument(
273
+ "--exe", required=True, help="待测可执行文件(须按 rank 数自行 fork)"
274
+ )
275
+ ap.add_argument(
276
+ "--args", default="", help='程序参数(如 "M K N rankNum perf tileCnt")'
277
+ )
278
+ ap.add_argument(
279
+ "--comm-switch",
280
+ default="MC2_MODE=COMM_ONLY",
281
+ help="纯通信开关(K=V 或 K1=V1,K2=V2 环境变量形式,注入采集子进程;"
282
+ "源码注释模式由 Agent 在副本完成后调用本脚本 --from-prof 收敛)",
283
+ )
284
+ ap.add_argument(
285
+ "--compute-switch",
286
+ default="MC2_MODE=COMPUTE_ONLY",
287
+ help="纯计算开关(同上形式,注入采集子进程)",
288
+ )
289
+ ap.add_argument(
290
+ "--switch-mode",
291
+ default="env",
292
+ choices=["env", "from-prof"],
293
+ help="env=程序自带模式开关;from-prof=已手工注释的两份 profiling 目录直接给路径",
294
+ )
295
+ ap.add_argument(
296
+ "--comm-prof", default=None, help="from-prof 模式:纯通信 profiling 目录"
297
+ )
298
+ ap.add_argument(
299
+ "--compute-prof", default=None, help="from-prof 模式:纯计算 profiling 目录"
300
+ )
301
+ ap.add_argument("--prof-dir", default="./prof/iso", help="env 模式采集落盘根目录")
302
+ ap.add_argument(
303
+ "--rules",
304
+ default=str(DEFAULT_L3_RULES),
305
+ help="L3 规则包 YAML(R 值档位唯一真源;默认仓内 L3-inter-card.yaml)",
306
+ )
307
+ ap.add_argument("--loops", type=int, default=LOOPS)
308
+ ap.add_argument("--warmup", type=int, default=WARMUP)
309
+ ap.add_argument("--output", required=True)
310
+ args = ap.parse_args()
311
+
312
+ if args.switch_mode == "from-prof":
313
+ comm_groups = parse_task_durations(args.comm_prof)
314
+ compute_groups = parse_task_durations(args.compute_prof)
315
+ if not comm_groups or not compute_groups:
316
+ print(
317
+ "ERROR: from-prof 目录中未找到 op_summary Task Duration 数据",
318
+ file=sys.stderr,
319
+ )
320
+ return 1
321
+ t_comm, t_compute = (
322
+ steady_max(comm_groups, args.warmup),
323
+ steady_max(compute_groups, args.warmup),
324
+ )
325
+ t_full, full_groups, mte2_ratio_full = None, {}, None
326
+ detail = {
327
+ "mode": "from-prof",
328
+ "comm_prof": args.comm_prof,
329
+ "compute_prof": args.compute_prof,
330
+ }
331
+ # F8:纯计算路径 pipe 占比(mte2_ratio_pure 的生产者——隔离计算 run 的
332
+ # aic_mte2_ratio 稳态均值,跨 rank 取 max,与 T 口径一致)
333
+ compute_pure_ratio = parse_pipe_ratio(args.compute_prof, MTE2_RATIO_COLUMNS)
334
+ mte2_ratio_pure = (
335
+ round(max(compute_pure_ratio.values()), 1) if compute_pure_ratio else None
336
+ )
337
+ else:
338
+ # env 开关模式:--comm-switch/--compute-switch 支持 K=V(或 K1=V1,K2=V2)形式,
339
+ # 解析出的变量真正注入子进程 env(消灭死参数
340
+ comm_env = parse_switch(args.comm_switch) or {"MC2_MODE": "COMM_ONLY"}
341
+ compute_env = parse_switch(args.compute_switch) or {"MC2_MODE": "COMPUTE_ONLY"}
342
+ comm_out = str(Path(args.prof_dir) / "comm")
343
+ compute_out = str(Path(args.prof_dir) / "compute")
344
+ print(f"[iso] 采集纯通信({args.comm_switch})…")
345
+ comm_groups = run_msprof_task_based(args.exe, args.args, comm_out, comm_env)
346
+ print(f"[iso] 采集纯计算({args.compute_switch})…")
347
+ compute_groups = run_msprof_task_based(
348
+ args.exe, args.args, compute_out, compute_env
349
+ )
350
+ print("[iso] 采集融合态(全量,F8:mte2_ratio_full / mask_ratio 生产者)…")
351
+ full_out = str(Path(args.prof_dir) / "full")
352
+ full_groups = run_msprof_task_based(args.exe, args.args, full_out, {})
353
+ t_comm, t_compute = (
354
+ steady_max(comm_groups, args.warmup),
355
+ steady_max(compute_groups, args.warmup),
356
+ )
357
+ t_full = steady_max(full_groups, args.warmup)
358
+ detail = {
359
+ "mode": "env",
360
+ "comm_ranks": len(comm_groups),
361
+ "compute_ranks": len(compute_groups),
362
+ "full_ranks": len(full_groups),
363
+ }
364
+ compute_pure_ratio = parse_pipe_ratio(compute_out, MTE2_RATIO_COLUMNS)
365
+ mte2_ratio_pure = (
366
+ round(max(compute_pure_ratio.values()), 1) if compute_pure_ratio else None
367
+ )
368
+ full_ratio = parse_pipe_ratio(full_out, MTE2_RATIO_COLUMNS)
369
+ mte2_ratio_full = round(max(full_ratio.values()), 1) if full_ratio else None
370
+
371
+ if not t_comm or not t_compute:
372
+ print("ERROR: 稳态数据为空(检查 op_summary 行数 ≥ loops)", file=sys.stderr)
373
+ return 1
374
+
375
+ # F8:rank_imbalance = max(rank 稳态均值)/mean(rank 稳态均值)(融合态,跨 rank 木桶离散度)
376
+ rank_imbalance = None
377
+ if t_full is not None and full_groups:
378
+ rank_means = []
379
+ for vals in full_groups.values():
380
+ steady = vals[args.warmup :] if len(vals) > args.warmup else vals
381
+ if steady:
382
+ rank_means.append(sum(steady) / len(steady))
383
+ if len(rank_means) >= 2 and sum(rank_means) > 0:
384
+ rank_imbalance = round(
385
+ max(rank_means) / (sum(rank_means) / len(rank_means)), 3
386
+ )
387
+
388
+ # F8:mask_ratio = (融合前耗时 − 融合后耗时) / min(T_comm, T_compute),上限 1.0
389
+ # 融合前耗时 = T_comm + T_compute(隔离态串行和);融合后 = t_full
390
+ mask_ratio = None
391
+ if t_full is not None and t_comm and t_compute:
392
+ denom = min(t_comm, t_compute)
393
+ if denom > 0:
394
+ mask_ratio = round(min((t_comm + t_compute - t_full) / denom, 1.0), 3)
395
+
396
+ r = t_compute / t_comm
397
+ # 档位从 L3 规则包 YAML 派生(规则是唯一真源;解析失败在 r_bands_from_rules 里 fail loud)
398
+ bound, bound_name = classify_r(r, r_bands_from_rules(args.rules))
399
+
400
+ # F8:产出直接拼成 verdict.py 的 --scalar 串(MC² 旗舰判定链端到端可执行)
401
+ scalar_parts = [f"t_comm_us={t_comm:.0f}", f"t_compute_us={t_compute:.0f}"]
402
+ if mte2_ratio_full is not None:
403
+ scalar_parts.append(f"mte2_ratio_full={mte2_ratio_full:.0f}")
404
+ if mte2_ratio_pure is not None:
405
+ scalar_parts.append(f"mte2_ratio_pure={mte2_ratio_pure:.0f}")
406
+ if rank_imbalance is not None:
407
+ scalar_parts.append(f"rank_imbalance={rank_imbalance}")
408
+ if mask_ratio is not None:
409
+ scalar_parts.append(f"mask_ratio={mask_ratio}")
410
+ scalar_str = ",".join(scalar_parts)
411
+
412
+ result = {
413
+ "schema": "opstune.isolation/1.0",
414
+ "t_comm_us": round(t_comm, 2),
415
+ "t_compute_us": round(t_compute, 2),
416
+ "t_full_us": round(t_full, 2) if t_full is not None else None,
417
+ "r_value": round(r, 3),
418
+ "bound_hint": bound,
419
+ "bound_name": bound_name,
420
+ "mte2_ratio_pure": mte2_ratio_pure,
421
+ "mte2_ratio_full": mte2_ratio_full,
422
+ "rank_imbalance": rank_imbalance,
423
+ "mask_ratio": mask_ratio,
424
+ "verdict_scalar": scalar_str,
425
+ "r_bands_source": str(Path(args.rules).name),
426
+ "steady_rule": (
427
+ f"{args.loops} 轮前 {args.warmup} warm-up 后逐 rank 均值,"
428
+ "跨 rank 取 max(木桶效应)"
429
+ ),
430
+ "detail": detail,
431
+ "next": (
432
+ f"喂判定引擎:python3 ../ops-verdict/scripts/verdict.py "
433
+ f"--rules ../ops-verdict/rules/L3-inter-card.yaml,../ops-verdict/rules/L1-single-core.yaml "
434
+ f"--soc a5 --scalar {scalar_str} -o verdict_mc2.json"
435
+ ),
436
+ }
437
+ out = Path(args.output)
438
+ out.parent.mkdir(parents=True, exist_ok=True)
439
+ out.write_text(
440
+ json.dumps(result, indent=2, ensure_ascii=False) + "\n", encoding="utf-8"
441
+ )
442
+ print(f"T_comm={t_comm:.1f}us T_compute={t_compute:.1f}us R={r:.3f} → {bound}")
443
+ if mte2_ratio_pure is not None or mte2_ratio_full is not None:
444
+ print(f"mte2_ratio: pure={mte2_ratio_pure} full={mte2_ratio_full}")
445
+ if rank_imbalance is not None:
446
+ print(f"rank_imbalance={rank_imbalance} mask_ratio={mask_ratio}")
447
+ print(f"→ {out}")
448
+ return 0
449
+
450
+
451
+ if __name__ == "__main__":
452
+ sys.exit(main())
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ----------------------------------------------------------------------------------------------------------
4
+ # Copyright (c) 2026 Huawei Technologies Co., Ltd.
5
+ # This program is free software, you can redistribute it and/or modify it under the terms and conditions of
6
+ # CANN Open Software License Agreement Version 2.0 (the "License").
7
+ # Please refer to the License for details. You may not use this file except in compliance with the License.
8
+ # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
9
+ # INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
10
+ # See LICENSE in the root of the software repository for the full text of the License.
11
+ # ----------------------------------------------------------------------------------------------------------
12
+ """jsonl_to_cases.py — JSONL 用例 → cases.csv 适配
13
+
14
+ 设计对齐:
15
+ - cases.csv 是本仓 A1 全量铁律的输入契约(io-contracts.md §1:case_id/shape/
16
+ dtype/attrs),但生态内存量算子工程用 JSONL 用例(torch-ops-profiler
17
+ 规范:每行 {"inputs": [{name/type/dtype/shape|value}...]})——两格式不通,
18
+ 存量工程进不了 Phase 0。
19
+ - 本脚本做单向适配:JSONL → cases.csv。转换规则全落脚本(判定/转换逻辑
20
+ 不进 LLM),歧义处 fail loud 列入 skipped 而非猜测。
21
+
22
+ 转换规则:
23
+ case_id :行号(c01 起)或 JSONL 行自带 case_id/name 字段(优先)
24
+ shape :首个 type=tensor 输入的 shape(多维 x 分隔);无 tensor 输入
25
+ → 该行 skipped(无性能可比形态)
26
+ dtype :首个 tensor 输入的 dtype(float16→fp16 等短名归一)
27
+ attrs :type != tensor 的输入(attr 类)拼 K=V(value 为列表/布尔的
28
+ 原样 JSON 序列化),保留原 name
29
+
30
+ 用法:
31
+ python3 jsonl_to_cases.py --jsonl layer_norm_perf_cases.jsonl -o cases.csv
32
+ python3 jsonl_to_cases.py --jsonl x.jsonl -o cases.csv --max-cases 20 # A1 截断同款
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import argparse
38
+ import csv
39
+ import json
40
+ import sys
41
+ from pathlib import Path
42
+
43
+ DTYPE_MAP = {
44
+ "float16": "fp16",
45
+ "float32": "fp32",
46
+ "bfloat16": "bf16",
47
+ "int8": "int8",
48
+ "int32": "int32",
49
+ "int64": "int64",
50
+ "float": "fp32",
51
+ "half": "fp16",
52
+ }
53
+
54
+
55
+ def fmt_value(v) -> str:
56
+ if isinstance(v, bool):
57
+ return "true" if v else "false"
58
+ if isinstance(v, (list, tuple)):
59
+ return "x".join(str(x) for x in v)
60
+ return str(v)
61
+
62
+
63
+ def convert_row(idx: int, row: dict) -> tuple[dict | None, str | None]:
64
+ """一行 JSONL → 一行 cases.csv(或 skip 原因)。"""
65
+ case_id = row.get("case_id") or row.get("name") or f"c{idx:02d}"
66
+ inputs = row.get("inputs")
67
+ if not isinstance(inputs, list) or not inputs:
68
+ return None, f"{case_id}: 无 inputs 数组"
69
+ tensors = [i for i in inputs if isinstance(i, dict) and i.get("type") == "tensor"]
70
+ if not tensors:
71
+ return None, f"{case_id}: 无 tensor 输入(无可比性能形态)"
72
+ t = tensors[0]
73
+ shape = t.get("shape")
74
+ if not isinstance(shape, (list, tuple)) or not shape:
75
+ return None, f"{case_id}: tensor 输入无 shape"
76
+ dtype = DTYPE_MAP.get(str(t.get("dtype", "")).lower())
77
+ if not dtype:
78
+ return None, f"{case_id}: 未知 dtype {t.get('dtype')!r}"
79
+ attrs = []
80
+ for i in inputs:
81
+ if isinstance(i, dict) and i.get("type") != "tensor" and "name" in i:
82
+ if "value" in i:
83
+ attrs.append(f"{i['name']}={fmt_value(i['value'])}")
84
+ return {
85
+ "case_id": str(case_id),
86
+ "shape": "x".join(str(d) for d in shape),
87
+ "dtype": dtype,
88
+ "attrs": ",".join(attrs),
89
+ }, None
90
+
91
+
92
+ def main() -> int:
93
+ ap = argparse.ArgumentParser(
94
+ description="JSONL 用例 → cases.csv(A1 铁律输入适配)"
95
+ )
96
+ ap.add_argument(
97
+ "--jsonl", required=True, help="JSONL 用例文件(torch-ops-profiler 规范)"
98
+ )
99
+ ap.add_argument("-o", "--output", required=True, help="cases.csv 输出")
100
+ ap.add_argument(
101
+ "--max-cases",
102
+ type=int,
103
+ default=0,
104
+ help="截断上限(0=不截断;>20 取前 20 需告知用户,与 A1 铁律同款)",
105
+ )
106
+ args = ap.parse_args()
107
+
108
+ rows_out, skipped = [], []
109
+ with open(args.jsonl, encoding="utf-8") as f:
110
+ for idx, line in enumerate(f, 1):
111
+ line = line.strip()
112
+ if not line:
113
+ continue
114
+ try:
115
+ row = json.loads(line)
116
+ except json.JSONDecodeError as e:
117
+ skipped.append(f"line {idx}: JSON 解析失败({e})")
118
+ continue
119
+ converted, reason = convert_row(idx, row)
120
+ if converted is None:
121
+ skipped.append(reason)
122
+ else:
123
+ rows_out.append(converted)
124
+
125
+ if not rows_out:
126
+ print("ERROR: 无可转换行(全部 skipped,见 stderr)", file=sys.stderr)
127
+ for s in skipped:
128
+ print(f" ⚠ {s}", file=sys.stderr)
129
+ return 1
130
+
131
+ truncated = False
132
+ if args.max_cases and len(rows_out) > args.max_cases:
133
+ rows_out = rows_out[: args.max_cases]
134
+ truncated = True
135
+ print(
136
+ f"WARN: 用例 {len(rows_out)} > {args.max_cases},取前 {args.max_cases}"
137
+ f"(A1 铁律截断,报告必须告知用户)",
138
+ file=sys.stderr,
139
+ )
140
+
141
+ out = Path(args.output)
142
+ out.parent.mkdir(parents=True, exist_ok=True)
143
+ # csv.writer 统一转义:case_id/shape/dtype 来自外部 JSONL
144
+ # 属不可信输入,手写拼接在含逗号/引号时产生错位或非法 CSV
145
+ with open(out, "w", encoding="utf-8", newline="") as f:
146
+ writer = csv.writer(f)
147
+ writer.writerow(["case_id", "shape", "dtype", "attrs"])
148
+ for r in rows_out:
149
+ writer.writerow([r["case_id"], r["shape"], r["dtype"], r["attrs"]])
150
+
151
+ print(
152
+ f"cases.csv → {out}({len(rows_out)} 行"
153
+ f"{'(A1 截断)' if truncated else ''},skipped {len(skipped)})"
154
+ )
155
+ for s in skipped[:10]:
156
+ print(f" ⚠ skipped: {s}", file=sys.stderr)
157
+ if len(skipped) > 10:
158
+ print(f" ⚠ …共 {len(skipped)} 条 skipped", file=sys.stderr)
159
+ return 0
160
+
161
+
162
+ if __name__ == "__main__":
163
+ sys.exit(main())