SKILL.md
SKILL.mdBrowse 18 files
6,480 tokens
25,470 bytes
Token encoding: o200k_base
Snapshot a9fb1c3
1---2name: llm-torch-profiler-analysis3description: "Unified LLM torch-profiler triage skill for `sglang`, `vllm`, `TensorRT-LLM`, and `TokenSpeed`. Use it to inspect an existing `trace.json(.gz)` or profile directory, or to drive live profiling against a running server when supported and return one three-table report with kernel, overlap-opportunity, and fuse-pattern tables."4---5 6# Unified LLM Torch Profiler Analysis7 8## Overview9 10Use this skill for `torch.profiler` analysis across:11 12- `sglang`13- `vllm`14- `TensorRT-LLM`15- `TokenSpeed`16 17There is only one public workflow:18 19- `triage`20 21Preferred unified entrypoint:22 23- [scripts/analyze_llm_torch_profile.py](scripts/analyze_llm_torch_profile.py)24 25Backwards-compatibility shim (kept so older `docker exec ... analyze_sglang_torch_profile.py ...` calls keep working; it just forwards to the unified entrypoint):26 27- [scripts/analyze_sglang_torch_profile.py](scripts/analyze_sglang_torch_profile.py)28 29Markdown bundling helper:30 31- [scripts/render_triage_markdown_bundle.py](scripts/render_triage_markdown_bundle.py)32 33`triage` always prints the same three tables:34 35- kernel table36- overlap-opportunity table37- fuse-pattern table38 39By default, all three tables only render rows at or above `1.0%` cumulative GPU-time share.40Rows below that are hidden by default unless the user asks for a lower cutoff.41 42Keep the fuse-pattern table source-backed and deterministic.43Do not turn it into a fuzzy matcher.44 45If exact source-backed matching is weak but a kernel cluster is still close to a known family,46add one short note after the tables with exactly one of:47 48- `high`49- `medium`50- `low`51 52## Capability Matrix53 54| Capability | SGLang | vLLM | TensorRT-LLM | TokenSpeed |55| --- | --- | --- | --- | --- |56| Existing trace triage | yes | yes | yes | yes |57| Single-trace live capture | yes | yes, if torch profiler is enabled on server | requires profiler control endpoints | yes, if `/start_profile` and `/stop_profile` are exposed |58| Two-trace mapping+formal triage | yes | yes | yes | yes |59| Stage-separated live workload | yes | yes | yes, with a writable shared trace dir or per-stage host runner | yes, via workload-separated HTTP capture |60| `--profile-by-stage` capture | yes | no | no | no |61| `--profile-prefix` control | yes | usually ignored on HTTP profiler route | usually ignored on HTTP profiler route | yes, mapped to `profile_id` |62 63For TensorRT-LLM, live capture only works when the server exposes `/start_profile` and64`/stop_profile`, and when the deployment already provides a shared trace path plus the65required env vars.66 67For TokenSpeed, this skill supports both existing trace triage and live capture68against current servers that expose `/start_profile` and `/stop_profile`.69The live helper sends `output_dir`, `activities`, `with_stack`,70`record_shapes`, and `profile_id` in the start payload. TokenSpeed also has its71own native `profile_by_stage` field for manual capture, but the unified helper72uses workload-separated `prefill/` and `decode/` directories by default so the73tables stay comparable across frameworks.74 75## Real H100 Validation76 77The current reference run is the `4x H100` matrix captured on `2026-04-23` on78`h100_sglang` under:79 80- `/data/bbuf/validate/unified_llm_profiler_skill/runs/20260423_h100_large_model_matrix_v3`81 82Rendered markdown bundle:83 84- `/data/bbuf/validate/unified_llm_profiler_skill/runs/20260423_h100_large_model_matrix_v3/h100_large_model_matrix_v3_bundle.md`85 86Validated model directories:87 88- `mixtral_8x7b_instruct`89- `qwen2_5_32b_instruct`90- `qwen3_32b`91 92Each model directory contains:93 94- `analysis_sglang.txt`95- `analysis_vllm.txt`96- `analysis_trtllm.txt`97- framework-specific trace roots and probe artifacts98 99Validated matrix:100 101| Model | SGLang | vLLM | TensorRT-LLM | Result |102| --- | --- | --- | --- | --- |103| `mistralai/Mixtral-8x7B-Instruct-v0.1` | `4x H100` | `4x H100` | `4x H100` | three tables rendered correctly on all three frameworks; benchmark probes returned direct, non-empty text |104| `Qwen/Qwen2.5-32B-Instruct` | `4x H100` | `4x H100` | `4x H100` | three tables rendered correctly on all three frameworks; benchmark probes returned direct, non-empty text |105| `Qwen/Qwen3-32B` | `4x H100` | `4x H100` | `4x H100` | three tables rendered correctly on all three frameworks; vLLM and TensorRT-LLM chat probes often emitted `<think>` prefixes |106 107Use this run as the main H100 reference.108The older `2026-04-22` single-card Qwen3 matrix is still useful for bring-up, but it is109not the default reference anymore.110TokenSpeed support was added later and is covered by existing-trace triage and111HTTP profiler-control support, but it is not part of this older H100 validation112matrix yet.113 114Stage-separated workload validation captured on `2026-05-01` on `h100_sglang`:115 116- `/data/bbuf/validate/unified_llm_profiler_skill/runs/20260501_stage_split_validation`117- `/data/bbuf/validate/unified_llm_profiler_skill/runs/20260501_stage_split_validation_large`118 119Validated models:120 121| Model | GPU | Workloads | Result |122| --- | --- | --- | --- |123| `Qwen/Qwen2.5-0.5B-Instruct` | `1x H100` | prefill `4090->1`, decode `1->2048` | generated separate `prefill/*.trace.json.gz` and `decode/*.trace.json.gz`; kernel, overlap, and fuse tables rendered with separate `extend/prefill` and `decode` sections |124| `Qwen/Qwen2.5-1.5B-Instruct` | `1x H100` | prefill `4090->1`, decode `1->2048` | generated separate `prefill/*.trace.json.gz` and `decode/*.trace.json.gz`; kernel, overlap, and fuse tables rendered with separate `extend/prefill` and `decode` sections |125| `Qwen/Qwen2.5-7B-Instruct` | `1x H100` | prefill `4090->1`, decode `1->2048` | generated separate traces; prefill kernel table captured 28-layer GEMM/FA3/RMSNorm work, decode captured 5-step graph launches, and fuse rows were split by stage |126| `Qwen/Qwen2.5-14B-Instruct` | `1x H100` | prefill `4090->1`, decode `1->2048` | generated separate traces; prefill kernel table captured 48-layer GEMM/FA3/RMSNorm work, decode captured 5-step graph launches, and fuse rows were split by stage |127| `Qwen/Qwen3-8B` | `2x H100`, TP=2 | prefill `4090->1`, decode `1->2048`, warmup 10/capture 5 | generated separate prefill/decode traces and all three tables; unique probe prompts avoided prefix-cache pollution in the prefill table |128| `mistralai/Mistral-7B-Instruct-v0.3` | `2x H100`, TP=2 | prefill `4090->1`, decode `1->2048`, warmup 10/capture 5 | generated separate prefill/decode traces and all three tables; server logs showed no repeated-prompt prefix-cache shortcut during the active prefill window |129 130This validation also covers the compatibility fix for older SGLang profiler131state machines: workload-separated live capture labels stages by output132directory and avoids nesting SGLang's internal `profile_by_stage` state machine133inside each workload. The helper134adds one internal scheduler guard step because SGLang increments `forward_ct`135before checking whether the profiler should stop; without that guard, a136`num_steps=1` prefill capture can stop just before the actual prefill forward.137The 2026-05-01 two-card validation artifacts for the additional models are:138 139- `/data/bbuf/validate/core_skill_validation_20260501/qwen3_8b/profiler`140- `/data/bbuf/validate/core_skill_validation_20260501/mistral_7b_instruct_v03/profiler`141 142To render a validated run into one markdown document:143 144```bash145python3 scripts/render_triage_markdown_bundle.py \146 --analysis-root /data/bbuf/validate/unified_llm_profiler_skill/runs/20260423_h100_large_model_matrix_v3 \147 --output /data/bbuf/validate/unified_llm_profiler_skill/runs/20260423_h100_large_model_matrix_v3/h100_large_model_matrix_v3_bundle.md148```149 150The bundle groups by model and keeps the three tables for each framework.151 152H100 notes:153 154- all three frameworks now render kernel, overlap, and fuse tables with separate `extend/prefill` and `decode` sections when the trace contains a clean stage split155- SGLang live capture is validated and calls the server profiler API directly instead of shelling out to `sglang.profiler`156- SGLang trace flush can lag well beyond a few seconds, so the runner waits longer for artifacts than the earlier implementation157- SGLang kernel-site reconstruction keeps sampling disabled in the mapping path so the optimized parser does not perturb SGLang table output; equality rechecks matched for `Mixtral-8x7B-Instruct-v0.1`, `Qwen3-32B`, and `nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8`158- vLLM live capture requires `--output-dir` to match the server `torch_profiler_dir`; the validated H100 flow uses `--profiler-config {"profiler":"torch","torch_profiler_dir":"..."}` and then drives `/start_profile` and `/stop_profile`159- TensorRT-LLM validation stays on `--backend pytorch`; the H100 flow writes the trace with `TLLM_TORCH_PROFILE_TRACE` and then analyzes the saved trace160- TensorRT-LLM current mainline was rechecked at `0722c5f47d2cae69ac1a237da51e550dd214532c` on 2026-06-26; the latest delta affects KV eviction / block-offset staging rather than profiler trace controls, so the `b9e1945` profiler evidence still applies: PyTorch profiling uses `record_shapes=True` and `with_modules=True`, but not `with_stack=True`; keep the override path for table-quality Python locations unless the target image proves otherwise161- TokenSpeed trace analysis has first-class registry rows for native TokenSpeed CuTe DSL MLA, MLA KV pack + FP8 quantize, fused top-k/top-p sampling, persistent lm_head GEMM, and NVFP4 GEMM + SwiGLU + quant; live capture still requires an existing torch-profiler trace until the target TokenSpeed image exposes a supported profiler API162- on this host, keep all trace roots under `/data/...`, not `/home/...`163 164## When To Use It165 166- inspect a `torch.profiler` trace or profile directory from `sglang`, `vllm`,167 `TensorRT-LLM`, or `TokenSpeed`168- profile a live serving endpoint and analyze the result169- summarize which kernel families dominate prefill or decode170- map kernels back to Python code paths171- judge whether a code path still leaves overlap opportunity172- check whether an already-known fusion or overlap path should have applied173 174## Diffusion Backend Gate175 176For diffusion benchmark or profiling work, only analyze traces produced by the native177SGLang diffusion backend.178 179If the run that generated the trace logs any of:180 181- `Falling back to diffusers backend`182- `Using diffusers backend`183- `Loaded diffusers pipeline`184 185stop the workflow instead of analyzing the trace.186Handle it as a backend-selection issue, not as native-kernel profiler evidence.187 188## Main Flows189 190## Stage-Separated Live Capture Contract191 192Live capture must not use one mixed prompt as the default.193By default, `analyze_llm_torch_profile.py --url ...` captures two labeled194workloads and then renders the same three tables with separate stage sections:195 196- prefill: synthetic input length `4090`, output length `1`197- decode: synthetic input length `1`, output length `2048`198 199Every live profiler path warms up `10` steps before arming the profiler and then200captures `5` active steps by default. Keep this warmup/active split aligned201across SGLang, vLLM, and TensorRT-LLM before comparing kernel tables.202 203Use these options to override the contract when the benchmark workload is known:204 205```bash206--profile-workload both \207--warmup-steps 10 --num-steps 5 \208--prefill-input-len 4090 --prefill-output-len 1 \209--decode-input-len 1 --decode-output-len 2048210```211 212Allowed `--profile-workload` values:213 214- `both`: default; capture prefill and decode separately215- `prefill`: capture only the long-input / one-token workload216- `decode`: capture only the one-input / long-output workload217- `legacy`: keep the old `--probe-prompt` / `--probe-max-new-tokens` behavior218 219For `sglang-sota-humanize-loop`, do not use the defaults if the slow SGLang220benchmark scenario has a known input/output distribution.221Set the profiler lengths from that slow scenario instead: prefill uses the slow222input length with output `1`, and decode uses input `1` with the slow output223length. For a mixed dataset, profile the slowest representative bucket such as224the p50 or p95 input/output pair used in the benchmark report, and record the225bucket in the artifact notes.226 227### 1. Single-trace triage from an existing profile dir or trace228 229```bash230python3 scripts/analyze_llm_torch_profile.py \231 --input /path/to/profile_dir_or_trace.json.gz232```233 234Use this when one trace is enough.235The overlap table stays conservative in single-trace mode and will tell you when a236mapping/formal pair is needed.237 238### 2. Single-trace live capture from SGLang239 240```bash241python3 scripts/analyze_llm_torch_profile.py \242 --framework sglang \243 --url http://127.0.0.1:30000 \244 --output-dir /data/bbuf/validate/unified_llm_profiler_skill/runs/example/sglang_profile_live \245 --num-steps 5 \246 --warmup-steps 10 \247 --profile-by-stage \248 --profile-workload both249```250 251The script sends `POST /start_profile` to the SGLang server directly.252Keep `--output-dir` under `/data/...` so later analysis and docs can see the trace.253The script writes `server_args.json`, warms up with the same workload shape,254sends the active probe requests after profiling is armed, captures separate255`prefill/` and `decode/` profile roots by default, and waits longer for trace256flush than the earlier implementation.257For the default workload-separated capture, the directory name labels the stage258and the SGLang internal `profile_by_stage` mode is not used inside each259workload. This avoids mixing a one-token prefill probe with a separate decode260profile. The helper still adds one internal guard step because older SGLang261profilers check the target counter before running the next forward.262 263### 3. Single-trace live capture from vLLM264 265Launch vLLM with torch profiler enabled, for example:266 267```bash268vllm serve meta-llama/Llama-3.1-8B-Instruct \269 --profiler-config '{"profiler":"torch","torch_profiler_dir":"/data/bbuf/validate/unified_llm_profiler_skill/runs/example/vllm_profile"}'270```271 272Then run:273 274```bash275python3 scripts/analyze_llm_torch_profile.py \276 --framework vllm \277 --url http://127.0.0.1:8000 \278 --output-dir /data/bbuf/validate/unified_llm_profiler_skill/runs/example/vllm_profile \279 --num-steps 5 \280 --warmup-steps 10 \281 --no-profile-by-stage \282 --profile-workload both283```284 285For vLLM, `--output-dir` must point to the same `torch_profiler_dir` the server uses.286The current vLLM profiler config already defaults `torch_profiler_with_stack=true`,287so the runner only needs to set `torch_profiler_dir`.288On `h100_sglang`, external vLLM containers should mount both:289 290- `/data/.cache/huggingface:/root/.cache/huggingface`291- `/data/bbuf/validate/unified_llm_profiler_skill:/data/bbuf/validate/unified_llm_profiler_skill`292 293### 4. Single-trace live capture from TensorRT-LLM294 295Use this only when the server exposes `POST /start_profile` and `POST /stop_profile`,296and the trace path is shared with the current machine.297 298Typical env expectations are:299 300- `TLLM_PROFILE_START_STOP=<start>-<stop>` such as `10-20`301- `TLLM_TORCH_PROFILE_TRACE=/shared/path/trace.json` or `.json.gz`302 303Then run:304 305```bash306python3 scripts/analyze_llm_torch_profile.py \307 --framework trtllm \308 --url http://127.0.0.1:8000 \309 --output-dir /shared/path \310 --num-steps 5 \311 --no-profile-by-stage \312 --profile-workload both313```314 315If the deployment does not expose the profiler control endpoints, fall back to analyzing316an existing trace instead of trying live capture.317If the TensorRT-LLM trace output is configured as one fixed file path, use318`scripts/run_trtllm_pytorch_profile_host.sh --stage prefill` and `--stage decode`319instead of direct `--profile-workload both`, so each stage gets its own trace file.320 321On the current TensorRT-LLM mainline path, `py_executor.py` creates the torch profiler322with `record_shapes=True` and `with_modules=True` but not `with_stack=True`.323For table-quality validation, use the override generator:324 325```bash326python3 scripts/make_trtllm_py_executor_override.py \327 --source /path/to/original/py_executor.py \328 --output /data/bbuf/validate/unified_llm_profiler_skill/overrides/trtllm/py_executor_with_stack.py329```330 331The matrix runner does this automatically on H100 before TensorRT-LLM capture starts.332 333This is the validated TensorRT-LLM flow on `h100_sglang`:334 3351. launch `trtllm-serve` with `TLLM_PROFILE_START_STOP=<start>-<stop>` and `TLLM_TORCH_PROFILE_TRACE=/data/.../trace.json`3362. run a few benchmark requests3373. analyze the emitted trace with `--input /data/.../trace.json`338 339### 5. Single-trace live capture or triage from TokenSpeed340 341For a running TokenSpeed server that exposes the profiler routes, the unified342helper can drive live capture:343 344```bash345python3 scripts/analyze_llm_torch_profile.py \346 --framework tokenspeed \347 --url http://127.0.0.1:8000 \348 --output-dir /data/bbuf/validate/unified_llm_profiler_skill/runs/example/tokenspeed_profile \349 --num-steps 5 \350 --warmup-steps 10 \351 --no-profile-by-stage \352 --profile-workload both \353 --profile-prefix ts-triage354```355 356The helper sends `POST /start_profile` with:357 358- `output_dir`: the `--output-dir` path359- `activities`: `["CPU", "GPU"]`360- `with_stack`: `true`361- `record_shapes`: `false`362- `profile_id`: `--profile-prefix`, with `-prefill` or `-decode` appended during workload-separated capture363 364It then sends OpenAI-compatible probe requests and calls `POST /stop_profile`.365TokenSpeed writes files such as `ts-triage-prefill-TP-0.trace.json.gz` under the366output directory. If the server was launched with multiple TP ranks, expect one367trace per rank.368 369Existing TokenSpeed torch-profiler traces can still be analyzed directly:370 371```bash372python3 scripts/analyze_llm_torch_profile.py \373 --framework tokenspeed \374 --input /path/to/tokenspeed_profile_dir_or_trace.json.gz375```376 377TokenSpeed's own manual profiler control surface can also be used:378 379```bash380curl -X POST http://127.0.0.1:8000/start_profile \381 -H 'Content-Type: application/json' \382 -d '{"output_dir":"/data/bbuf/profiles/tokenspeed","activities":["CPU","GPU"],"with_stack":true,"record_shapes":false,"profile_id":"ts-manual"}'383 384# send representative workload here385 386curl -X POST http://127.0.0.1:8000/stop_profile387```388 389For server-side automatic stop, pass `num_steps`. For TokenSpeed-native390EXTEND/DECODE split, pass `profile_by_stage: true`; this produces files with391stage suffixes such as `-EXTEND` and `-DECODE`.392 393TokenSpeed's benchmark driver can capture traces too:394 395```bash396tokenspeed bench serve \397 --base-url http://127.0.0.1:8000 \398 --model <model> \399 --dataset-name random \400 --random-input-len 4090 \401 --random-output-len 1 \402 --num-prompts 64 \403 --profile \404 --profile-num-steps 5 \405 --extra-body '{"output_dir":"/data/bbuf/profiles/tokenspeed","activities":["CPU","GPU"],"with_stack":true,"profile_id":"ts-bench"}'406```407 408If `output_dir` is omitted, TokenSpeed falls back to `TOKENSPEED_PROFILER_DIR`409and then `/tmp`.410 411Use [scripts/probe_llm_server.py](scripts/probe_llm_server.py) with412`--framework tokenspeed` for a small OpenAI-compatible endpoint probe before or413after trace collection:414 415```bash416python3 scripts/probe_llm_server.py \417 --framework tokenspeed \418 --url http://127.0.0.1:8000 \419 --requests 6 \420 --max-tokens 48421```422 423For `sglang-sota-humanize-loop`, keep TokenSpeed profiler evidence aligned to424the same slow scenario bucket as the benchmark result. Prefer the unified425workload-separated live capture when possible; if only a mixed agentic trace is426available, label that limitation in `analysis/root-cause.md` before comparing427it to SGLang prefill/decode traces.428 429### 6. Two-trace triage from existing profile dirs or traces430 431```bash432python3 scripts/analyze_llm_torch_profile.py \433 --mapping-input /path/to/graph_off_profile_dir \434 --formal-input /path/to/graph_on_profile_dir435```436 437Use this when you need stronger overlap attribution and kernel-to-source mapping.438 439### 7. Two-trace triage from running servers440 441```bash442python3 scripts/analyze_llm_torch_profile.py \443 --framework sglang \444 --mapping-url http://127.0.0.1:31025 \445 --formal-url http://127.0.0.1:31026 \446 --num-steps 5 \447 --profile-by-stage448```449 450For `vllm` or `TensorRT-LLM`, use the same shape but pass:451 452- `--framework vllm` or `--framework trtllm`453- `--mapping-output-dir ...`454- `--formal-output-dir ...`455- `--no-profile-by-stage`456 457For TokenSpeed, either use `--mapping-url` and `--formal-url` against servers458that expose `/start_profile` and `/stop_profile`, or pass two existing trace459directories with `--mapping-input` and `--formal-input`.460 461## `profile_by_stage`462 463`--profile-by-stage` is only meaningful on the SGLang live-capture path.464 465- With `--profile-workload both` / `prefill` / `decode`, workload directories466 are the stage labels; the live-capture helper disables SGLang's internal467 stage profiler per workload, warms up first, and captures the requested468 active step count for the selected workload.469- On legacy or hand-captured SGLang serving, internal `profile_by_stage` is470 still useful because prefill and decode usually have very different471 bottlenecks.472- On the current profile-v2 path inside SGLang, stage-based profiling is effectively the normal path.473- PD-disaggregated serving adds one extra rule: prefill workers and decode workers must be profiled separately. That is stricter than ordinary `profile_by_stage`.474- For `vllm`, `TensorRT-LLM`, and `TokenSpeed`, disable it with475 `--no-profile-by-stage`.476 477## How To Choose The Triage Shape478 479### Single-trace triage480 481Use when you want the lowest-friction report:482 483- one trace is already available484- you mainly want kernel share and fusion clues485- you are comparing two runs side by side by running triage once per trace486 487Prefer this by default.488 489### Two-trace triage490 491Use when you need:492 493- a stronger overlap answer494- graph-off source mapping plus graph-on final behavior495- more trustworthy overlap recommendations in the middle table496 4971. mapping trace with graph disabled or with the lower-fusion / more-readable config4982. formal trace with the real serving optimizations enabled499 500Do not call the mapping pass a "fast profile".501It exists to recover `kernel -> cpu_op -> python scope`.502 503## Workflow504 505### Single-trace workflow506 5071. If the user only wants a diagnosis, one trace is enough.5082. Prefer one-rank traces over merged traces whenever the profiler emitted both.5093. For a live server, let the script drive the profiler only when the framework-specific prerequisites are already met.5104. Prefer `--profile-workload both`; use `legacy` only when reproducing an old trace contract.5115. Prefer workload-separated SGLang capture; use internal `--profile-by-stage`512 mainly for `legacy` or manually collected traces.5136. When on `h100_sglang`, create or clean the target trace directory through `docker exec sglang_bbuf ...` so the path is definitely writable under `/data`.514 515### Two-trace workflow516 5171. Produce a mapping trace first with graph disabled or the lower-fusion configuration.5182. Produce a formal trace second with the real serving optimizations enabled.5193. Run `triage` for the three-table report.5204. Read the results in this order:521 - kernel table522 - overlap-opportunity table523 - fuse-pattern table5245. Before calling something a "new" optimization idea, compare the top rows against both [references/fuse-overlap-catalog.md](references/fuse-overlap-catalog.md) and [references/overlap-catalog.md](references/overlap-catalog.md). Check mainline rows first, then the `PR-backed / in-flight` sections. Prefer reporting:525 - an existing fused or overlap path that should already apply here526 - an existing path that appears disabled, unsupported, or regressed in this trace527 - an upstream pattern that is mainline elsewhere but missing locally, or still open upstream528 - a truly new opportunity only when no catalog entry fits5296. If no exact pattern fully matches but the trace is still close to a known family, add one flat similarity note after the tables.530 Use `high`, `medium`, or `low` only.531 Base that note on the full pattern shape, not on one kernel name alone.532 Prefer semantic cues such as producer-consumer chain, source locations, CPU op names, TP context, and model-specific structure.533 Do not rewrite the script table itself to include these heuristic judgments.534 535## References536 537Load these only when needed:538 539- [references/source-map.md](references/source-map.md)540 - upstream SGLang profiler entrypoints and trace-writing paths; still most useful for SGLang-specific source follow-up541- [references/heuristics.md](references/heuristics.md)542 - overlap labels, dependency-risk interpretation, and limits543- [references/fuse-overlap-catalog.md](references/fuse-overlap-catalog.md)544 - mixed source-backed catalog of existing fuse and overlap patterns, including mainline rows plus PR-backed / in-flight rows545- [references/vllm-torch-compile-fusions.md](references/vllm-torch-compile-fusions.md)546 - current vLLM torch.compile fusion passes and the source patterns they target547- [references/overlap-catalog.md](references/overlap-catalog.md)548 - overlap-only lookup table across LLM, VLM, diffusion, disaggregation, HiSparse, and speculative scheduling549 550## Output Contract551 552Return:553 554- trace path or generated profile path555- framework556- model/server args when available557- kernel table558- overlap-opportunity table559- fuse-pattern table560- optional similarity note with `high` / `medium` / `low` when exact matching is inconclusive561- one short summary of what dominates the run562- whether the overlap read came from single-trace triage or mapping/formal two-trace triage563 Discovery context
Discovered by repository scan. No exact path reference found in the snapshot’s root docs/AGENTS.md.