inference-dcgm-correlate
Purpose
Lift workload-level Speed-of-Light from "first-principles estimate" to
"measured byte traffic over the sweep window". The methodology canon
(docs/METHODOLOGY.md "Speed-of-light framing") names three levels of SoL rigor:
Steady-state window: per-(c) DCGM correlation is only meaningful when the bench cell
sustained steady state, i.e. num_prompts >= 2*c. At num=c+4 the window is ramp/drain-
dominated so BOTH the throughput AND the high-c DCGM utilization read low (see
docs/METHODOLOGY.md "Capture hygiene"). import_roofline_sweep WARNs on any cell < 2c.
- Sample-share proxy (page 4 in the perf-report PDF) - zymtrace
per-category time-share read as a coarse upper bound on category
busyness. (zymtrace flushes to ClickHouse asynchronously, so an empty L1
right after the window is ingest lag, not absence - wait + requery for
the freshest data. See
server/docs/zymtrace-query-hygiene.md.)
- ncu per-kernel arithmetic intensity (page 5) - proper roofline
scatter from ncu DRAM bytes + SM FLOPS counters.
- DCGM workload-level byte traffic (page 6) - this skill. Real GB
transferred across NVLink / HBM / Tensor pipe during the drive_load
sweep, divided by peak × duration × n_gpus.
This skill is the page-6 producer.
When to use
- After a campaign's
drive_load.py sweep completes and the bundle
has an inference_perfbench_v1.json.bench.captured_at + duration_effective_s pair recording the sweep window.
- When you want a workload-level %SoL number anchored in
measured byte counters, not a first-principles HBM-roofline
estimate.
- When refreshing a campaign's
sol-summary.md with byte-grounded
numbers replacing the time-share proxies.
Do not use for:
- Per-kernel arithmetic-intensity questions - that's
inference-kernel-ncu-profile's
domain (DCGM has no per-kernel attribution).
- Real-time cluster health - DCGM scrape interval (~10-30 s) is too
coarse for sub-minute incident response. Use
prometheus-anchored-query
directly with the regular dashboard panels.
Prerequisites
- The campaign / cell directory exists at
campaigns/<campaign>/cells/<cell>/.
- The source
inference_perfbench_v1.json is reachable (either inside
the cell dir or passed via --bundle-path explicitly).
- Prometheus is reachable via the Prometheus MCP server
(
prometheus_mcp). The query_observability_knowledge_base tool is used
FIRST to confirm the DCGM metrics exist with the expected cardinality.
- The cluster's DCGM exporter is configured to export the
DCGM_FI_PROF_* group. If not, the skill falls back to
DCGM_FI_DEV_* counter-tier and flags the result with
dcgm_group_level: "counter".
Workflow
Phase 0 - pre-flight (knowledge-base probe)
from tools.perf_tune_report.dcgm_correlate import (
DcgmCorrelateInputs,
correlate,
read_sweep_window_from_bundle,
)
- Resolve the bundle path + cell directory.
- Load
configs/sol-ceilings.yaml. On a GB300 cluster use
hw_key=gb300_nvl72, n_gpus=the deploy's TP (GB300 node = 4, NOT 8), and the tensor
peak_key=nvfp4_dense_pflops for NVFP4 weights (bf16_dense_pflops / fp8_dense_pflops
otherwise). Stamp these from the deploy, not from habit: the b200_sm100 / n_gpus: 8 /
bf16 defaults apply only to B200 clusters and will mis-scale a GB300/NVFP4 %SoL if reused.
- Call
query_observability_knowledge_base for the metrics listed
in dcgm_config.prof_group_probe_metrics. Confirm:
- Each metric exists on the target cluster.
- Labels include at least
{namespace, pod, gpu, device} (the
default DCGM label set).
- Cardinality is bounded (e.g. < 1000 series per metric across the
target deploy).
Phase 1 - sweep window
Read (start_utc, end_utc) either by calling
read_sweep_window_from_bundle(bundle_path) or from explicit
input (when the bundle's captured_at is the END of the sweep, not the
start - older bundles).
Phase 2 - build queries (dry-run)
inputs = DcgmCorrelateInputs(
bundle_path=bundle,
cell_dir=cell,
sweep_start=start,
sweep_end=end,
hw_key="b200_sm100", # GB300: "gb300_nvl72"
pod_label_selector="app=basic-inference",
namespace="inference",
expected_n_gpus=8, # GB300 node = 4 (the deploy TP), NOT 8
)
# Dry-run first to print the PromQL the correlator WILL fire:
result = correlate(inputs, ceilings, prom_client, dry_run=True)
for q in result.queries:
print(q["peak_key"], "->", q["promql"])
Phase 3 - execute the correlation
result = correlate(inputs, ceilings, prom_client, dry_run=False)
out_path = write_correlation(result, inputs.cell_dir)
The result's resources list has one row per peak that mapped to a
DCGM metric, each with:
measured_bytes_total, measured_bytes_per_s (bandwidth peaks) or
measured_tflops_avg (compute peaks)
sol_pct (the headline number)
notes[] (short-sweep / missing-data flags)
Phase 4 - patch sol-summary.md
Update the campaign's sol-summary.md "Workload-level SoL" table to
reference the byte-grounded numbers, replacing the previous
first-principles estimate. Cite the dcgm_correlation.json path so
future readers can re-derive the math.
Phase 5 - re-render + re-publish to raise sol_rigor to L3
Emitting dcgm_correlation.json per cell is not the end - the campaign's
published lake row + report PDF only reflect the byte-grounding after a
re-render then re-publish:
perftunereport report_render --campaign <slug> # draws pages 6 + 6b; sets dcgm_grounded + sol_rigor=L3
perftunereport publish_to_lake --campaign <slug> --if-exists overwrite \
--i-understand-this-publishes-externally
Byte-grounding raises sol_rigor to L3 and satisfies the default publish gate.
A sol_complete=true campaign that is dcgm_grounded=false lacks
dcgm_correlation.json and pages 6/6b. Strict publish refuses it.
dcgm_grounded + sol_rigor flow
report_status.json -> report_render envelope -> campaign_v1 columns. Run
this skill (or the CLI verb below) for every plot-ready cell, then
re-render + re-publish so the lake row is dcgm_grounded=true / sol_rigor=L3.
Use --no-strict only for an intentional L1 publish. That path records and
warns on the grounding gap.
Phase 5b - offline / CI path: the dcgm_correlate CLI verb + frozen snapshot
The live correlate() python path above needs a PrometheusClient (the
agent wires it to the Prometheus MCP). For an offline / re-runnable /
CI context that cannot reach Prometheus, capture the DCGM means into a
frozen YAML (schema dcgm_frozen_v1) once, then fold it in
deterministically with the CLI verb:
perftunereport dcgm_correlate --campaign <slug> --cell-id <cell> \
--frozen-yaml <cell>/dcgm-frozen.yaml \
[--kernels-json <cell>/kernels.json] # default: the cell's own kernels.json (page 6b)
This wraps correlate_from_frozen + write_correlation and is the path the
campaign orchestrator's step_dcgm_correlate runs (it consumes a
cells/<id>/dcgm-frozen.yaml per cell). Always snapshot a frozen YAML even
when you used the live path, so the byte-grounding is reproducible offline
and survives deploy teardown (the DCGM time-series may age out of Prometheus
retention, but the frozen means do not).
Full-context reporting (no bare numbers)
Per the canon "Every performance number carries its full context (no bare numbers)"
(docs/METHODOLOGY.md "Full-context reporting"): every number this
skill emits MUST carry its full measurement-context descriptor, and every comparison MUST be
matched on it. A bare tok/s / TPOT / BW / %SoL / speedup is a defect - it cannot set a
default, ship a config, or appear in a report.
- Identity: model (+HF path), hardware (exact ceiling token
GB300/B200), quant, kv-cache dtype.
- Parallelism: TP, DP (replicas), PP, EP, parallel_strategy.
- Serving cfg: max-num-seqs, max-num-batched-tokens, gpu-memory-utilization, max-model-len, cudagraph_mode/enforce_eager, async_scheduling, prefix-caching.
- Workload: dataset, ISL/OSL (or mean in/out tokens), concurrency, num-prompts.
- Regime: warm vs cold. Latency vs throughput tier.
- Stack: image/vllm commit, bench backend, serving engine.
- Grounding:
%SoL (+ ceiling key from configs/sol-ceilings.yaml - never inline a peak), sol_rigor (L1-L4), trials n (mean±std), same-node, baseline named.
- Per-number exact shape (no smoothing): when reporting more than one number, keep EACH with its own exact shape (ISL/OSL, concurrency, dataset, regime) - never normalize a set to one uniform descriptor that hides per-point variation (e.g.
c=1 @ ISL1024/OSL256 + c=64 @ ISL4096/OSL512, NOT one shared "random").
This skill IS the byte-grounded SoL producer. Its output is the
authoritative third-tier evidence per docs/METHODOLOGY.md
"Speed-of-light framing":
- Peaks live in
configs/sol-ceilings.yaml. This skill
reads them by key (b200_sm100.hbm3e_tbps,
gb300_nvl72.nvfp4_dense_pflops, etc.) - never inline.
- DCGM metric anchors live in the same YAML under each peak's
dcgm_metric / dcgm_metrics_bytes / dcgm_fallback_metric fields.
- The renderer's page 6 (
dcgm_sol.py) consumes the emitted
dcgm_correlation.json and draws workload-level resource bars
showing measured-vs-peak × duration × n_gpus.
- This skill's output drives the
dcgm_grounded flag + the campaign's
sol_rigor: with a dcgm_correlation.json the campaign is
dcgm_grounded=true / sol_rigor=L3 (or L4 if ncu is also present),
without one it is dcgm_grounded=false / sol_rigor=L1. Strict publish
refuses the ungrounded campaign. Run this skill per cell to raise rigor to L3.
Use --no-strict only for an intentional L1 publish. That path records the
gap on the campaign_v1 row and prints a warning.
Next lever / BREAKTHROUGH (Grind Mandate)
If this skill emits a measured result, its output MUST end by naming the next perf lever,
its expected unlock (direction + rough magnitude), and the gate that proves/refutes it,
per docs/METHODOLOGY.md "Always be grinding (next-lever framing)". A
measured win is the new floor, not the finish -- so do everything we can to find the next
BREAKTHROUGH: the highest-EV unlock toward Speed-of-Light (a new champion / kernel / router /
quant / parallelism / spec-decode win, or an unblocked stack), not just the next micro-lever.
Rank the candidate breakthrough levers by value x cost (the GRIND FRONTIER, perftunereport value_view), pursue the top, bank the rest with evidence. Record WHY a refuted lever loses,
update the standing frontier in the active bundle's HANDOFF.md. Never conclude
"exhausted/optimal/done" without an explicit next-lever frontier (an empty frontier AND a
documented SoL wall only). Delete this section ONLY if the skill produces no measurements.
Safety
- Read-only. Every Prometheus call is a read. No mutation of any
cluster state.
- Knowledge-base FIRST. Skill MUST call
query_observability_knowledge_base before any query_prometheus
to confirm cardinality bounds. This is the standing
prometheus-anchored-query pattern.
- Bundle write only inside the supplied cell directory.
No writes outside
<campaign>/cells/<cell>/.
- Provenance preserved. Every PromQL invocation is recorded in the
output's
queries array. The dcgm_correlation.json carries
schema_version, sweep_start_utc, sweep_end_utc, n_gpus,
dcgm_group_level. It also carries the
re-query provenance nodes (distinct host(s) the DCGM series carried),
namespace, and pod_label_selector. DCGM_FI_DEV_POWER_USAGE is
per-node, so without the node a window-only capture cannot be
re-queried later for tokens_per_watt - the live correlate() now
auto-captures the node from the series labels (Hostname / node /
exported_node / instance), and a frozen YAML SHOULD record
nodes: (+ optional namespace: / pod_label_selector:) so the
byte-grounding stays re-queryable after the time-series ages out.
Pairs with
inference-kernel-ncu-profile
- per-kernel arithmetic intensity. Run BOTH for a complete SoL
picture: ncu surfaces the per-kernel %SoL, this skill surfaces the
workload-level %SoL aggregated over the same window.
inference-perf-bench - the
drive_load.py sweep that produces the window this skill correlates
against.
prometheus-anchored-query
- the general anchored-PromQL primitive. This skill is
the DCGM-specific specialisation.
analyze-zymtrace-workload
- the time-share proxy view (level 1 of SoL hierarchy). This skill
is its level-3 upgrade.
Source-of-truth references
Contact
Open an issue on this repository.
1---2name: inference-dcgm-correlate3description: Correlate DCGM Prometheus byte-traffic counters with an inference-perf-bench sweep window to compute byte-grounded workload-level Speed-of-Light. The third tier of the SoL rigor hierarchy (after zymtrace sample-share and ncu per-kernel arithmetic intensity). Reads the sweep window from `inference_perfbench_v1.json.bench`, queries Prometheus via the Prometheus MCP for the DCGM PROF group (`DRAM_ACTIVE`, `NVLINK_TX/RX_BYTES`, `PIPE_TENSOR_ACTIVE`, `PIPE_FP16_ACTIVE`), falls back to `DCGM_FI_DEV_*` counter-tier metrics when PROF is not exported, and writes `<cell>/dcgm_correlation.json` with per-resource %SoL = real byte traffic / (peak * duration * n_gpus). Triggers on "dcgm correlate", "dcgm sol", "byte-grounded sol", "workload %sol", "dram active over sweep", "nvlink bytes", "tensor pipe active", "real-vs-peak workload bandwidth", or combinations of "dcgm / prometheus" with "sweep / window / sol / workload / byte-traffic".4license: MIT5---67# inference-dcgm-correlate89## Purpose1011Lift workload-level Speed-of-Light from "first-principles estimate" to12"measured byte traffic over the sweep window". The methodology canon13(`docs/METHODOLOGY.md` "Speed-of-light framing") names three levels of SoL rigor:1415> **Steady-state window:** per-(c) DCGM correlation is only meaningful when the bench cell16> sustained steady state, i.e. `num_prompts >= 2*c`. At `num=c+4` the window is ramp/drain-17> dominated so BOTH the throughput AND the high-c DCGM utilization read low (see18> `docs/METHODOLOGY.md` "Capture hygiene"). `import_roofline_sweep` WARNs on any cell `< 2c`.19201. **Sample-share proxy** (page 4 in the perf-report PDF) - zymtrace21 per-category time-share read as a coarse upper bound on category22 busyness. (zymtrace flushes to ClickHouse asynchronously, so an empty L123 right after the window is **ingest lag, not absence** - wait + requery for24 the freshest data. See25 [`server/docs/zymtrace-query-hygiene.md`](../../server/docs/zymtrace-query-hygiene.md).)262. **ncu per-kernel arithmetic intensity** (page 5) - proper roofline27 scatter from ncu DRAM bytes + SM FLOPS counters.283. **DCGM workload-level byte traffic** (page 6) - this skill. Real GB29 transferred across NVLink / HBM / Tensor pipe during the drive_load30 sweep, divided by peak × duration × n_gpus.3132This skill is the page-6 producer.3334## When to use3536- After a campaign's `drive_load.py` sweep completes and the bundle37 has an `inference_perfbench_v1.json.bench.captured_at +38 duration_effective_s` pair recording the sweep window.39- When you want a workload-level %SoL number anchored in40 measured byte counters, not a first-principles HBM-roofline41 estimate.42- When refreshing a campaign's `sol-summary.md` with byte-grounded43 numbers replacing the time-share proxies.4445Do **not** use for:4647- Per-kernel arithmetic-intensity questions - that's48 [`inference-kernel-ncu-profile`](../inference-kernel-ncu-profile/SKILL.md)'s49 domain (DCGM has no per-kernel attribution).50- Real-time cluster health - DCGM scrape interval (~10-30 s) is too51 coarse for sub-minute incident response. Use52 [`prometheus-anchored-query`](../prometheus-anchored-query/SKILL.md)53 directly with the regular dashboard panels.5455## Prerequisites5657- The campaign / cell directory exists at58 `campaigns/<campaign>/cells/<cell>/`.59- The source `inference_perfbench_v1.json` is reachable (either inside60 the cell dir or passed via `--bundle-path` explicitly).61- Prometheus is reachable via the Prometheus MCP server62 (`prometheus_mcp`). The `query_observability_knowledge_base` tool is used63 FIRST to confirm the DCGM metrics exist with the expected cardinality.64- The cluster's DCGM exporter is configured to export the65 `DCGM_FI_PROF_*` group. If not, the skill falls back to66 `DCGM_FI_DEV_*` counter-tier and flags the result with67 `dcgm_group_level: "counter"`.6869## Workflow7071### Phase 0 - pre-flight (knowledge-base probe)7273```python74from tools.perf_tune_report.dcgm_correlate import (75 DcgmCorrelateInputs,76 correlate,77 read_sweep_window_from_bundle,78)79```80811. Resolve the bundle path + cell directory.822. Load `configs/sol-ceilings.yaml`. **On a GB300 cluster use83 `hw_key=gb300_nvl72`, `n_gpus`=the deploy's TP (GB300 node = **4**, NOT 8), and the tensor84 `peak_key=nvfp4_dense_pflops` for NVFP4 weights** (`bf16_dense_pflops` / `fp8_dense_pflops`85 otherwise). Stamp these from the deploy, not from habit: the `b200_sm100` / `n_gpus: 8` /86 `bf16` defaults apply only to B200 clusters and will mis-scale a GB300/NVFP4 %SoL if reused.873. Call `query_observability_knowledge_base` for the metrics listed88 in `dcgm_config.prof_group_probe_metrics`. Confirm:89 - Each metric exists on the target cluster.90 - Labels include at least `{namespace, pod, gpu, device}` (the91 default DCGM label set).92 - Cardinality is bounded (e.g. < 1000 series per metric across the93 target deploy).9495### Phase 1 - sweep window9697Read `(start_utc, end_utc)` either by calling98`read_sweep_window_from_bundle(bundle_path)` or from explicit99input (when the bundle's `captured_at` is the END of the sweep, not the100start - older bundles).101102### Phase 2 - build queries (dry-run)103104```python105inputs = DcgmCorrelateInputs(106 bundle_path=bundle,107 cell_dir=cell,108 sweep_start=start,109 sweep_end=end,110 hw_key="b200_sm100", # GB300: "gb300_nvl72"111 pod_label_selector="app=basic-inference",112 namespace="inference",113 expected_n_gpus=8, # GB300 node = 4 (the deploy TP), NOT 8114)115116# Dry-run first to print the PromQL the correlator WILL fire:117result = correlate(inputs, ceilings, prom_client, dry_run=True)118for q in result.queries:119 print(q["peak_key"], "->", q["promql"])120```121122### Phase 3 - execute the correlation123124```python125result = correlate(inputs, ceilings, prom_client, dry_run=False)126out_path = write_correlation(result, inputs.cell_dir)127```128129The result's `resources` list has one row per peak that mapped to a130DCGM metric, each with:131132- `measured_bytes_total`, `measured_bytes_per_s` (bandwidth peaks) or133- `measured_tflops_avg` (compute peaks)134- `sol_pct` (the headline number)135- `notes[]` (short-sweep / missing-data flags)136137### Phase 4 - patch sol-summary.md138139Update the campaign's `sol-summary.md` "Workload-level SoL" table to140reference the byte-grounded numbers, replacing the previous141first-principles estimate. Cite the `dcgm_correlation.json` path so142future readers can re-derive the math.143144### Phase 5 - re-render + re-publish to raise `sol_rigor` to L3145146Emitting `dcgm_correlation.json` per cell is not the end - the campaign's147published lake row + report PDF only reflect the byte-grounding after a148**re-render then re-publish**:149150```text151perftunereport report_render --campaign <slug> # draws pages 6 + 6b; sets dcgm_grounded + sol_rigor=L3152perftunereport publish_to_lake --campaign <slug> --if-exists overwrite \153 --i-understand-this-publishes-externally154```155156**Byte-grounding raises `sol_rigor` to L3 and satisfies the default publish gate.**157A `sol_complete=true` campaign that is `dcgm_grounded=false` lacks158`dcgm_correlation.json` and pages 6/6b. Strict publish refuses it.159`dcgm_grounded` + `sol_rigor` flow160`report_status.json` -> `report_render` envelope -> `campaign_v1` columns. Run161this skill (or the CLI verb below) for **every** plot-ready cell, then162re-render + re-publish so the lake row is `dcgm_grounded=true` / `sol_rigor=L3`.163Use `--no-strict` only for an intentional L1 publish. That path records and164warns on the grounding gap.165166### Phase 5b - offline / CI path: the `dcgm_correlate` CLI verb + frozen snapshot167168The live `correlate()` python path above needs a `PrometheusClient` (the169agent wires it to the Prometheus MCP). For an offline / re-runnable /170CI context that cannot reach Prometheus, capture the DCGM means into a171**frozen YAML** (schema `dcgm_frozen_v1`) once, then fold it in172deterministically with the CLI verb:173174```text175perftunereport dcgm_correlate --campaign <slug> --cell-id <cell> \176 --frozen-yaml <cell>/dcgm-frozen.yaml \177 [--kernels-json <cell>/kernels.json] # default: the cell's own kernels.json (page 6b)178```179180This wraps `correlate_from_frozen` + `write_correlation` and is the path the181campaign orchestrator's `step_dcgm_correlate` runs (it consumes a182`cells/<id>/dcgm-frozen.yaml` per cell). **Always snapshot a frozen YAML even183when you used the live path**, so the byte-grounding is reproducible offline184and survives deploy teardown (the DCGM time-series may age out of Prometheus185retention, but the frozen means do not).186187## Full-context reporting (no bare numbers)188189Per the canon "Every performance number carries its full context (no bare numbers)"190(`docs/METHODOLOGY.md` "Full-context reporting"): every number this191skill emits MUST carry its full measurement-context descriptor, and every comparison MUST be192matched on it. A bare `tok/s` / TPOT / BW / %SoL / speedup is a defect - it cannot set a193default, ship a config, or appear in a report.194- **Identity:** model (+HF path), hardware (exact ceiling token `GB300`/`B200`), quant, kv-cache dtype.195- **Parallelism:** TP, DP (replicas), PP, EP, parallel_strategy.196- **Serving cfg:** max-num-seqs, max-num-batched-tokens, gpu-memory-utilization, max-model-len, cudagraph_mode/enforce_eager, async_scheduling, prefix-caching.197- **Workload:** dataset, ISL/OSL (or mean in/out tokens), concurrency, num-prompts.198- **Regime:** warm vs cold. Latency vs throughput tier.199- **Stack:** image/vllm commit, bench backend, serving engine.200- **Grounding:** `%SoL` (+ ceiling key from `configs/sol-ceilings.yaml` - never inline a peak), sol_rigor (L1-L4), trials n (mean±std), same-node, baseline named.201- **Per-number exact shape (no smoothing):** when reporting more than one number, keep EACH with its own exact shape (ISL/OSL, concurrency, dataset, regime) - never normalize a set to one uniform descriptor that hides per-point variation (e.g. `c=1 @ ISL1024/OSL256` + `c=64 @ ISL4096/OSL512`, NOT one shared "random").202203This skill IS the byte-grounded SoL producer. Its output is the204authoritative third-tier evidence per `docs/METHODOLOGY.md`205"Speed-of-light framing":206207- Peaks live in `configs/sol-ceilings.yaml`. This skill208 reads them by key (`b200_sm100.hbm3e_tbps`,209 `gb300_nvl72.nvfp4_dense_pflops`, etc.) - never inline.210- DCGM metric anchors live in the same YAML under each peak's211 `dcgm_metric` / `dcgm_metrics_bytes` / `dcgm_fallback_metric` fields.212- The renderer's page 6 (`dcgm_sol.py`) consumes the emitted213 `dcgm_correlation.json` and draws workload-level resource bars214 showing measured-vs-peak × duration × n_gpus.215- This skill's output drives the `dcgm_grounded` flag + the campaign's216 `sol_rigor`: with a `dcgm_correlation.json` the campaign is217 `dcgm_grounded=true` / `sol_rigor=L3` (or `L4` if ncu is also present),218 without one it is `dcgm_grounded=false` / `sol_rigor=L1`. Strict publish219 refuses the ungrounded campaign. Run this skill per cell to raise rigor to L3.220 Use `--no-strict` only for an intentional L1 publish. That path records the221 gap on the `campaign_v1` row and prints a warning.222223## Next lever / BREAKTHROUGH (Grind Mandate)224225If this skill emits a measured result, its output MUST end by naming the **next perf lever**,226its **expected unlock** (direction + rough magnitude), and the **gate** that proves/refutes it,227per `docs/METHODOLOGY.md` "Always be grinding (next-lever framing)". A228measured win is the new floor, not the finish -- so **do everything we can to find the next229BREAKTHROUGH**: the highest-EV unlock toward Speed-of-Light (a new champion / kernel / router /230quant / parallelism / spec-decode win, or an unblocked stack), not just the next micro-lever.231Rank the candidate breakthrough levers by value x cost (the GRIND FRONTIER, `perftunereport232value_view`), pursue the top, bank the rest with evidence. Record WHY a refuted lever loses,233update the standing frontier in the active bundle's `HANDOFF.md`. Never conclude234"exhausted/optimal/done" without an explicit next-lever frontier (an empty frontier AND a235documented SoL wall only). Delete this section ONLY if the skill produces no measurements.236237## Safety238239- **Read-only.** Every Prometheus call is a read. No mutation of any240 cluster state.241- **Knowledge-base FIRST.** Skill MUST call242 `query_observability_knowledge_base` before any `query_prometheus`243 to confirm cardinality bounds. This is the standing244 prometheus-anchored-query pattern.245- **Bundle write only inside the supplied cell directory.**246 No writes outside `<campaign>/cells/<cell>/`.247- **Provenance preserved.** Every PromQL invocation is recorded in the248 output's `queries` array. The `dcgm_correlation.json` carries249 `schema_version`, `sweep_start_utc`, `sweep_end_utc`, `n_gpus`,250 `dcgm_group_level`. It also carries the251 re-query provenance `nodes` (distinct host(s) the DCGM series carried),252 `namespace`, and `pod_label_selector`. `DCGM_FI_DEV_POWER_USAGE` is253 **per-node**, so without the node a window-only capture cannot be254 re-queried later for `tokens_per_watt` - the live `correlate()` now255 auto-captures the node from the series labels (`Hostname` / `node` /256 `exported_node` / `instance`), and a frozen YAML SHOULD record257 `nodes:` (+ optional `namespace:` / `pod_label_selector:`) so the258 byte-grounding stays re-queryable after the time-series ages out.259260## Pairs with261262- [`inference-kernel-ncu-profile`](../inference-kernel-ncu-profile/SKILL.md)263 - per-kernel arithmetic intensity. Run BOTH for a complete SoL264 picture: ncu surfaces the per-kernel %SoL, this skill surfaces the265 workload-level %SoL aggregated over the same window.266- [`inference-perf-bench`](../inference-perf-bench/SKILL.md) - the267 drive_load.py sweep that produces the window this skill correlates268 against.269- [`prometheus-anchored-query`](../prometheus-anchored-query/SKILL.md)270 - the general anchored-PromQL primitive. This skill is271 the DCGM-specific specialisation.272- [`analyze-zymtrace-workload`](../analyze-zymtrace-workload/SKILL.md)273 - the time-share proxy view (level 1 of SoL hierarchy). This skill274 is its level-3 upgrade.275276## Source-of-truth references277278- Tool: [`server/tools/perf_tune_report/dcgm_correlate.py`](../../server/tools/perf_tune_report/dcgm_correlate.py).279- Tests: [`server/tools/perf_tune_report/test_dcgm_correlate.py`](../../server/tools/perf_tune_report/test_dcgm_correlate.py)280 - fake-Prometheus-client coverage of ratio/byte-rate aggregation,281 PROF/counter/absent fallback, and short-sweep warning.282- Renderer page 6: `server/tools/perf_tune_report/renderer/dcgm_sol.py`283 (consumes the emitted `dcgm_correlation.json`).284- `docs/METHODOLOGY.md` "Speed-of-light framing" - the standing285 three-level rigor hierarchy this skill operationalises.286287## Contact288289Open an issue on this repository.