Skip to content

fix(power): sample power-telemetry DCGM every 1000 ms / fix(power):功耗遥测 DCGM 改为每 1000 ms 采样 - #4974

Merged
edwingao28 merged 7 commits into
mainfrom
rihuo/dcgm-collect-interval-1000
Nov 11, 2026
Merged

edwingao28 merged 7 commits into
mainfrom
rihuo/dcgm-collect-interval-1000

Conversation

@richardhuo-nv

@richardhuo-nv richardhuo-nv commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Since #3670, every multi-node point on a cluster with a power-exporter-port starts the power-telemetry dcgm-exporter from configs/srt-recipes/telemetry-dcgm.yaml, and that exporter sampled every 100 ms (--collect-interval=100). When power telemetry brings its own exporter, srt-slurm skips Tachometer's (implicit.py#L168-L171), so it is the only DCGM exporter on each node. The collector reads it once per second (collect_interval_ms: 1000), so most of those samples are never read, but the sampling still slows serving. srt-slurm measured about 2% decode ITL p50 overhead for 100 ms sampling on GB300 (telemetry_stage.py#L50-L53). Its warning only covers Tachometer's exporter, though, so these runs never logged it.

This PR samples every 1000 ms (--collect-interval=1000). That matches the 1 s scrape and the default_gpu_exporter of every NVIDIA cluster in configs/runners.yaml, which is what runs sampled at before power telemetry was on by default.

Evidence: PR 4747 vs PR 4834

PRs #4747 and #4834 ran the same GB300 Qwen3.5 TRT-LLM AgentX curve. The PR 4747 run predates #3670: it had no power telemetry, only Tachometer's 1000 ms exporter. The PR 4834 runs had the 100 ms power exporter. The regression was isolated to this sampling interval. The other differences between the runs were ruled out: srt-slurm 2.66.1 → 2.66.2, agentx-harness 1.0.12 → 1.0.13, and node placement.

e2e p90 is higher at every point, by 5–18% on the eight points whose recipe fingerprints match. ITL p50 rises by about 2% on average, in line with srt-slurm's measurement, and throughput per GPU stays within 1.4%.

Point Recipe e2e p90 (s) TTFT p95 (s) ITL p50 (ms) Total tok/s per GPU
c8¹ same 3.04 → 3.35 (+10.1%) 2.94 → 3.35 0.61 → 0.62 (+1.6%) 2,800 → 2,824 (+0.9%)
c16 same 1.88 → 2.02 (+7.2%) 0.43 → 0.45 0.70 → 0.74 (+5.7%) 5,410 → 5,404 (-0.1%)
c28¹ same 2.55 → 2.67 (+5.0%) 0.56 → 0.62 0.95 → 0.96 (+1.1%) 14,194 → 14,192 (0.0%)
c128 same 3.09 → 3.50 (+13.3%) 0.83 → 1.11 1.25 → 1.27 (+1.6%) 35,617 → 35,372 (-0.7%)
c176 same 3.67 → 4.33 (+18.0%) 1.23 → 1.64 1.39 → 1.40 (+0.7%) 50,774 → 50,312 (-0.9%)
c224 same 5.77 → 6.18 (+7.1%) 1.80 → 1.82 2.20 → 2.29 (+4.1%) 103,934 → 103,866 (-0.1%)
c264 same 4.31 → 4.87 (+13.0%) 1.09 → 1.69 1.66 → 1.67 (+0.6%) 63,143 → 62,688 (-0.7%)
c352² differs 7.83 → 9.24 (+17.9%) 1.67 → 2.10 3.06 → 3.16 (+3.3%) 133,737 → 132,489 (-0.9%)
c392² differs 8.72 → 10.85 (+24.4%) 2.52 → 6.13 3.26 → 3.34 (+2.5%) 144,965 → 142,979 (-1.4%)
c720³ same 17.22 → 18.17 (+5.5%) 6.21 → 7.35 6.89 → 6.91 (+0.3%) 166,421 → 164,096 (-1.4%)

¹ c8 and c28 failed at setup in run 42317315774, so their 4834 numbers come from the PR's next sweep, run 42390081277, with the same recipes.

² 4834 drops mnnvl_allreduce_fp8_payload: true from the 3P1D decode used at c352 and c392.

³ 4747's c720 ran twice; this is the last attempt.

At c128 and c176, which were analyzed in detail, most of the gap comes from one request burst about 300 s into the run. At c176, prefill → decode KV transfer during the burst (300–360 s) moved 7,111 GB at 118.5 GB/s in the 4747 run against 3,154 GB at 52.6 GB/s in the 4834 run, and the backed-up requests landed in the latency tail. Leaving out 300–600 s of each run, e2e p90 barely moves: c128 goes from 2.90 to 2.92 s and c176 from 3.39 to 3.41 s.

Sweep impact

The changelog entry lists 19 config keys, 107 AgentX points on H200, B200, B300, GB200 and GB300, so this PR needs a green sweep and /use before merge. No sweep label is applied yet.

For power data, each 1 s scrape now returns a sample up to 1 s old instead of up to 100 ms old. The number of samples per window is unchanged.

Six Qwen3.5 SGLang GB200/GB300 1k1k recipes still set their own 100 ms telemetry command. No master config uses them, so they are left as is.

AI model disclosure
  • Model/version: Claude Opus 5.5 (claude-opus-5-5), via Claude Code
  • Role: compared the PR 4747 and PR 4834 runs, traced the srt-slurm DCGM exporter launch paths, made the config change and changelog entry, and wrote this description. The author isolated the regression to the sampling interval. No other models or delegated agents were used.
PR checklist and change type

Type of Change

  • Bug fix
  • New feature
  • Configuration change
  • Documentation update
  • Other (please describe)

Checklist

  • I have completed the AI model disclosure and kept it current
  • I have tested my changes locally
  • I have updated documentation if necessary
  • If python -m infx.matrix.changed --base origin/main lists affected config keys, I have appended one new entry covering them to the physical end of inferencex-e2e/perf-changelog.yaml; if it lists none, I have added none. I have not edited historical entries
  • If this PR appends an inferencex-e2e/perf-changelog.yaml entry, it carries exactly one primary sweep label (a maintainer applies it on fork PRs): full-sweep-fail-fast (recommended), full-sweep-enabled, or non-canary-full-sweep-enabled. Optional modifiers all-evals, evals-only, and agentx-fast require a primary label; the last two block reuse while applied.
  • Before merging via reuse, an authorized maintainer (OWNER/MEMBER/COLLABORATOR) has commented /use <run_id> (or the legacy /reuse-sweep-run) on this PR. Do this only once there is a final full sweep that is all green with evals passing, since after this comment the primary sweep label will no longer automatically kick off new sweeps. Remove and re-add the primary sweep label to force a new sweep.
中文

概述

自 #3670 起,在配置了 power-exporter-port 的集群上,每个多节点点位都会按 configs/srt-recipes/telemetry-dcgm.yaml 启动功耗遥测的 dcgm-exporter,它的采样间隔是 100 ms(--collect-interval=100)。功耗遥测自带 exporter 时,srt-slurm 会跳过 Tachometer 的 exporter(implicit.py#L168-L171),所以它是每个节点上唯一的 DCGM exporter。采集器每秒只读取一次(collect_interval_ms: 1000),大部分样本根本不会被读到,但采样本身仍然拖慢推理。srt-slurm 自己测得,GB300 上 100 ms 采样会让解码 ITL p50 增加约 2%(telemetry_stage.py#L50-L53)。不过这条告警只针对 Tachometer 的 exporter,所以这些运行里从未输出过。

本 PR 将采样间隔改为 1000 ms(--collect-interval=1000)。这与 1 秒的采集周期一致,也与 configs/runners.yaml 中所有 NVIDIA 集群的 default_gpu_exporter 一致,即功耗遥测默认开启之前的采样间隔。

证据:PR 4747 与 PR 4834

#4747 和 #4834 运行的是同一条 GB300 Qwen3.5 TRT-LLM AgentX 曲线。PR 4747 的运行早于 #3670:没有功耗遥测,只有 Tachometer 的 1000 ms exporter。PR 4834 的运行使用了 100 ms 的功耗 exporter。性能回退已定位到这一采样间隔。几次运行之间的其他差异均已排除:srt-slurm 2.66.1 → 2.66.2、agentx-harness 1.0.12 → 1.0.13,以及节点分配。

所有点位的 e2e p90 都变高了;在 recipe 指纹相同的八个点位上,升幅为 5–18%。ITL p50 平均上升约 2%,与 srt-slurm 的测量结果一致;单 GPU 吞吐量的变化不超过 1.4%。

表格见上方英文部分。

¹ c8 和 c28 在 run 42317315774 中启动阶段就失败了,因此它们的 4834 数据取自该 PR 的下一次扫描 run 42390081277,recipe 相同。

² 4834 去掉了 c352 和 c392 所用 3P1D 解码配置中的 mnnvl_allreduce_fp8_payload: true。

³ 4747 的 c720 运行了两次,这里取最后一次。

在详细分析过的 c128 和 c176 上,差距主要来自运行约 300 s 时的一次突发请求。在 c176 上,突发期间(300–360 s)预填充 → 解码的 KV 传输,4747 的运行以 118.5 GB/s 传输了 7,111 GB,4834 的运行则以 52.6 GB/s 只传输了 3,154 GB,积压的请求落入了延迟尾部。去掉每次运行的 300–600 s 后,e2e p90 几乎不变:c128 从 2.90 s 变为 2.92 s,c176 从 3.39 s 变为 3.41 s。

各次运行和服务器日志产物的链接见上方英文部分。

扫描影响

changelog 记录列出 19 个配置键,共 107 个 AgentX 点位,分布在 H200、B200、B300、GB200 和 GB300 上,因此合并前需要一次全绿的扫描和 /use。目前尚未添加扫描标签。

功耗数据方面,每次 1 秒的采集读到的样本最多是 1 秒前的,而不是 100 ms 前的。每个窗口的样本数不变。

有六个 Qwen3.5 SGLang GB200/GB300 1k1k recipe 仍自带 100 ms 的遥测命令。没有任何主配置使用它们,因此保持不变。

AI 模型使用说明:Claude Opus 5.5(claude-opus-5-5),通过 Claude Code 使用。它对比了 PR 4747 与 PR 4834 的运行,梳理了 srt-slurm 中 DCGM exporter 的启动路径,完成了配置修改和 changelog 记录,并撰写了本说明。性能回退由作者定位到采样间隔。未使用其他模型或委派 agent。

🤖 Generated with Claude Code

The power-telemetry dcgm-exporter sampled every 100 ms, ten times as
often as the collector scrapes it. On GB300 disaggregated serving that
interval slowed prefill-to-decode KV transfer: with identical recipes,
the PR 4747 run (Tachometer's 1000 ms exporter only) moved KV at
118.5 GB/s during a c176 request burst against 52.6 GB/s for the PR 4834
run (100 ms power exporter), and e2e p90 rose from 3.67 to 4.33 s.

Sample every 1000 ms, matching the 1 s scrape and each cluster's default
GPU exporter, and append a perf-changelog entry for the 16 power: true
AgentX configs whose fingerprint includes the telemetry block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Thanks for the contribution!

  • Review: If this PR changes files owned by someone other than a repository admin or @SemiAnalysisAI/core, ask one eligible CODEOWNER to complete the latest PR_REVIEW_CHECKLIST.md before contacting a core maintainer on Slack. Follow the template exactly, including As a PR reviewer and CODEOWNER, I have reviewed this and have, so sign-off verification triggers.
  • PR verification: Sweeps run only when the PR appends an inferencex-e2e/perf-changelog.yaml entry and carries exactly one primary label: full-sweep-fail-fast (strongly recommended; canary plus per-matrix fail-fast), full-sweep-enabled (canary; matrix jobs continue after a failure), or non-canary-full-sweep-enabled (no canary or fail-fast). The modifiers all-evals, evals-only, and agentx-fast require a primary label. On fork PRs, a maintainer applies the label. See sweep labels and reuse.
  • After merging: PR authors must ensure all GitHub Actions jobs pass. Transient failures often pass on rerun; see how to rerun failed jobs.
中文

感谢你的贡献!

  • **审阅:**如果 PR 修改的文件归属于仓库管理员及 @SemiAnalysisAI/core 之外的 CODEOWNER,请先联系一位有资格的 CODEOWNER 填写最新的 PR_REVIEW_CHECKLIST.md,再通过 Slack 联系核心维护者。必须严格遵循模板,并保留 As a PR reviewer and CODEOWNER, I have reviewed this and have,才能触发签核验证。
  • **PR 验证:**只有当 PR 在 inferencex-e2e/perf-changelog.yaml 末尾追加了条目,并且恰好带有一个主标签时,才会运行扫描:full-sweep-fail-fast(强烈推荐;canary 加逐矩阵 fail-fast)、full-sweep-enabled(有 canary;矩阵任务在失败后继续运行)或 non-canary-full-sweep-enabled(无 canary,也无 fail-fast)。修饰标签 all-evals、evals-only 和 agentx-fast 必须与主标签一起使用。fork PR 的标签由维护者添加。参见扫描标签与复用。
  • **合并后:**PR 作者必须确保所有 GitHub Actions 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.

Comment thread inferencex-e2e/perf-changelog.yaml Resolved
richardhuo-nv and others added 5 commits November 10, 2026 00:25
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
移除功耗遥测的专项扫描记录,让相关配置在下次扫描时采用 1000 ms 采样间隔。
@edwingao28
edwingao28 merged commit cbbdaea into main Nov 11, 2026
5 checks passed
@edwingao28
edwingao28 deleted the rihuo/dcgm-collect-interval-1000 branch November 11, 2026 00:14
richardhuo-nv added a commit that referenced this pull request Nov 11, 2026
Power telemetry now samples DCGM every 1000 ms (#4974), so run the
1P2D and 2P2D points at their original concurrency again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adibarra added a commit that referenced this pull request Nov 12, 2026
…ew points / perf(qwen3.5):GB300 TRT AgentX 升级至 TRT-LLM 1.4.0rc3 并更新为十个新配置点 (#4834)

* perf(qwen3.5): update GB300 TRT AgentX to TRT-LLM 1.4.0rc3 with a new ten-point search space

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf-changelog: set PR link

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf-changelog: restore existing entries; set PR link on the new entry only

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(qwen3.5): set GB300 TRT AgentX's TRT-LLM 1.4.0rc3 options as config fields

TensorRT-LLM 1.4.0rc3 (NVIDIA/TensorRT-LLM#20815) reads none of the
feature-branch TRTLLM_* switches this recipe set. Its Qwen3.5 paths are on
by default, derived from existing config, or explicit LLM-API fields.

- Prefill: shortest-uncached-first context scheduling, breakable prefill
  CUDA graphs on the same buckets without torch.compile, and branch
  snapshots under block_reuse_config. DEP prefill keeps piecewise graphs
  and ages context requests after 30 scheduler iterations (about 8 s at
  its measured 3.8 iterations/s).
- Decode: a replicated embedding table. TEP decode drafts with the MXFP8
  MTP LM head and keeps the GEN KV-transfer window with an explicit
  max_tokens_in_buffer; 3P1D also sends the MNNVL all-reduce payload in
  E4M3.
- Drop the switches rc3 does not read: TRTLLM_Q35_*, SRPT, PREFILL_BCG,
  in-forward snapshot, disaggregated-GEN, spec-sampler, overlap-loop,
  MNNVL FP8 and cuBLAS FP8 tables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(qwen3.5): drop the MXFP8 MTP draft LM head from GB300 TRT AgentX

Check 13 requires the draft to run as the checkpoint ships it. The
Qwen3.5-397B-A17B-NVFP4-V2 LM head is BF16, and draft_lm_head_dtype: mxfp8
sampled the MTP drafts from an MXFP8 copy of it; TEP decode now drafts from
the BF16 head, the rc3 default. The c720 override no longer needs to remove
the field.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(qwen3.5): update GB300 TRT AgentX to TRT-LLM 1.4.0rc3 with ten new points

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(qwen3.5): lower GB300 TRT AgentX conc 128 and 176 points by 10%

Run the 1P2D TEP4/TEP8 point at conc 115 instead of 128 and the
2P2D TEP2/TEP8 point at conc 158 instead of 176, and rename their
overrides to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf(qwen3.5): restore GB300 TRT AgentX conc 128 and 176 points

Power telemetry now samples DCGM every 1000 ms (#4974), so run the
1P2D and 2P2D points at their original concurrency again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: adibarra <93070681+adibarra@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants