Skip to content

[AMD][Qwen3.5] Bump MI355X FP8 AgentX image to sglang-rocm v0.5.23-20261109 and honor mem-fraction-static / [AMD][Qwen3.5] 将 MI355X FP8 AgentX 镜像升级至 sglang-rocm v0.5.23-20261109 并使 mem-fraction-static 生效 - #4975

Open
chuyeh wants to merge 5 commits into
mainfrom
amd/qwen35-fp8-mi355x-agentx-v0.5.23-20261109

Conversation

@chuyeh

@chuyeh chuyeh commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

main runs qwen3.5-fp8-mi355x-sglang-agentic-mtp on the 2026-10-20 image lmsysorg/sglang-rocm:v0.5.22-rocm720-mi35x-20261020. This bumps it to the latest MI355X image, lmsysorg/sglang-rocm:v0.5.23-rocm720-mi35x-20261109 (Docker Hub: pushed 2026-11-09T14:19:26Z, amd64 digest sha256:e728a52213cce18493a46ac8ac62d5c9eaee66591941871acd213fe989e55957), and sets two recipe env variables so the new image does not change behavior silently:

  • ROCM_QUICK_REDUCE_QUANTIZATION=NONE: the previous image defaulted to INT8 all-reduce and the new one does not (sgl-project/sglang#47163). This pins a full-precision all-reduce instead of relying on an image default.
  • SGLANG_AITER_HONOR_EXPLICIT_MEM_FRACTION=1: with the aiter attention backend and context above 8192, SGLang multiplies an explicit mem-fraction-static by 0.85, so the recipe's 0.8 ran as 0.68. With the variable set, 0.8 is used as-is and the KV pool grows from 7.83M to 11.32M tokens (+45%). That removes KV-pool queueing at the top of the curve (c72 to c80).

stream-interval stays at 50, which satisfies the current AgentX limit of at most 60 (checklist). The HiCache write_through policy, the TP4 concurrency grid and every other serving flag are unchanged, and other MI355X arms stay on their current tags.

The image, the all-reduce setting and the effective memory fraction change together, so differences against the v0.5.22 results cannot be attributed to the image alone.

Validation: run-sweep.yml run 43037834183 (full-sweep-fail-fast, head 76be03775) is in progress. Local A/B evidence for the memory fraction is in the details below; it is not a CI run.

Risk:

  • The local A/B covers c64 and c80 only, one run per arm, on a different image. The CI sweep is the real confirmation.
  • At c16 to c28 the HiCache host pool is sized by hicache-ratio (1.5), so it grows with the KV pool. Those points were not exercised locally. c32 and above use pinned sizes.
  • Qwen3.5 is on the all-reduce policy baseline matrix, so the integer all-reduce restriction does not require NONE here. It is set to avoid integer-quantized all-reduce. INT8 is not restored, so the prefill all-reduce speedup it gave on the previous image is not recovered.
Validation details

Local exclusive A/B (not a CI run). TP4 FP8, 3600 s AgentX replays with benchmarks/srt_agentic.sh, one run per arm, 0 request errors. Both arms use the previous head 80a58d278 plus ROCM_QUICK_REDUCE_QUANTIZATION=NONE; they differ only in SGLANG_AITER_HONOR_EXPLICIT_MEM_FRACTION. The runs used the local image rocm/sgl-dev:v0.5.23-rocm724-mi35x-20261030 (no INT8 default either) and stream-interval: 20, because the PR image was not on the host. Absolute numbers are below CI (c80: 46k to 48k against about 60k total tok/s/GPU), so only the relative change is claimed.

Metric c64: 0.68 → 0.8 c80: 0.68 → 0.8
Total tok/s/GPU 43,431 → 43,396 (-0.1%) 46,193 → 47,724 (+3.3%)
P90 interactivity 28.22 → 28.24 (+0.1%) 20.37 → 21.66 (+6.3%)
P90 TTFT 4.33 → 4.29 s 7.33 → 5.04 s (-31%)
KV use, median / peak 0.66 / 0.95 → 0.45 / 0.65 0.91 / 0.99 → 0.65 / 0.86
Mean queued requests 0 → 0 3.58 → 0

OOM stress test. c80 recipe flags with 0.8 honored. 96 unique prompts of 40k to 250k tokens (13.8M tokens), 80 in flight, then the same prompts again with 2k new tokens. 192 of 192 requests completed with no OOM, the KV pool reached 100%, and peak memory was 253 to 255 GB of about 288 GB per GPU (about 33 GB free).

Earlier sweep on this branch (run 42785772087, head 80a58d278, new image without these two variables):

  • c56 to c80 were 2% to 3% lower in throughput and 4% to 8% lower in P90 interactivity than the v0.5.22 results. The analysis attributes this to slower prefill (about 10% above 8k uncached tokens) after the INT8 default disappeared. This PR does not recover it.
  • c1, c22 and c48 were 4% to 8% lower, and all three ran on node mia1-p01-g11, which looks degraded (decode 7% slower at batch size 1, against 4% to 9% faster on other nodes). This is a suspicion, not a confirmed cause, and those points have not been rerun.
AI model disclosure
  • Model/version: Claude Sonnet 5.5 (the identifier exposed by the runtime)
  • Role: prepared the image bump, the recipe env settings, the perf-changelog.yaml entry, the merge with main and this description. The local A/B experiment and its analysis note were provided by the PR author; this model did not run them. No delegated agents.
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.
中文

main 上 qwen3.5-fp8-mi355x-sglang-agentic-mtp 仍使用 2026-10-20 的 lmsysorg/sglang-rocm:v0.5.22-rocm720-mi35x-20261020 镜像。本 PR 将其升级到最新的 MI355X 镜像 lmsysorg/sglang-rocm:v0.5.23-rocm720-mi35x-20261109(Docker Hub 推送时间 2026-11-09T14:19:26Z,amd64 摘要(digest)为 sha256:e728a52213cce18493a46ac8ac62d5c9eaee66591941871acd213fe989e55957),并在配方中设置两个环境变量,避免新镜像悄悄改变行为:

  • ROCM_QUICK_REDUCE_QUANTIZATION=NONE:旧镜像默认使用 INT8 all-reduce,新镜像不再默认如此(sgl-project/sglang#47163)。显式设置可固定使用全精度 all-reduce,而不是依赖镜像默认值。
  • SGLANG_AITER_HONOR_EXPLICIT_MEM_FRACTION=1:使用 aiter 注意力后端且上下文超过 8192 时,SGLang 会将显式设置的 mem-fraction-static 乘以 0.85,因此配方中的 0.8 实际按 0.68 运行。设置该变量后按 0.8 原值使用,KV 池由 783 万 token 增至 1132 万 token(+45%),从而消除曲线高并发端(c72 至 c80)的 KV 池排队。

stream-interval 保持为 50,满足当前 AgentX 不超过 60 的限制(检查清单)。HiCache write_through 策略、TP4 并发网格及其余服务参数均不变,其他 MI355X 配置保持原镜像。

镜像、all-reduce 设置和实际显存占比同时变化,因此与 v0.5.22 结果的差异不能仅归因于镜像。

验证: run-sweep.yml 运行 43037834183(full-sweep-fail-fast,head 76be03775)正在进行中。显存占比的本地 A/B 证据见上方折叠详情,它不是 CI 运行。

风险:

  • 本地 A/B 仅覆盖 c64 和 c80,每组只跑一次,且使用了不同的镜像。CI 扫描才是最终确认。
  • c16 至 c28 的 HiCache 主机池按 hicache-ratio(1.5)确定大小,会随 KV 池一起增大,这些点未在本地测试。c32 及以上使用固定大小。
  • Qwen3.5 属于 all-reduce 策略基线矩阵中的模型,整数 all-reduce 限制并不要求在此处设置 NONE;设置它是为了避免整数量化 all-reduce。INT8 不会恢复,因此旧镜像上它带来的预填充 all-reduce 加速不会找回。

本地 A/B(非 CI 运行): TP4 FP8,3600 秒 AgentX 回放,每组一次,无请求错误。两组均使用此前的 head 80a58d278 加 ROCM_QUICK_REDUCE_QUANTIZATION=NONE,只在 SGLANG_AITER_HONOR_EXPLICIT_MEM_FRACTION 上不同。运行使用本地镜像 rocm/sgl-dev:v0.5.23-rocm724-mi35x-20261030 和 stream-interval: 20(PR 镜像不在该主机上)。绝对数值低于 CI,因此只采信相对变化。c80:总 tok/s/GPU +3.3%,P90 交互性 +6.3%,P90 TTFT -31%,平均排队请求由 3.58 降至 0;c64:无变化(在 0.3% 以内)。OOM 压力测试:192/192 请求完成,无 OOM,峰值显存约 253 至 255 GB(每 GPU 约 288 GB),约 33 GB 空闲。

此前扫描(运行 42785772087):c56 至 c80 吞吐量低 2% 至 3%,分析认为是 INT8 默认值消失后预填充变慢所致,本 PR 不会找回。c1、c22、c48 低 4% 至 8%,三者都运行在节点 mia1-p01-g11 上,该节点看起来已降级。这只是怀疑而非已确认原因,这些点尚未重跑。

AI 模型使用说明:

  • 模型/版本:Claude Sonnet 5.5(运行环境提供的标识)
  • 工作内容:准备了镜像升级、配方环境变量设置、perf-changelog.yaml 条目、与 main 的合并及本说明。本地 A/B 实验及其分析笔记由 PR 作者提供,该模型未运行这些实验。未委派其他 agent。

改动类型: 配置变更。

…i35x-20261109

Co-authored-by: Cursor <cursoragent@cursor.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 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

Co-authored-by: Cursor <cursoragent@cursor.com>
@chuyeh
chuyeh marked this pull request as ready for review November 10, 2026 08:32
@chuyeh
chuyeh requested a review from a team November 10, 2026 08:32
@claude

claude Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @chuyeh's task in 29s —— View job


Review

  • Read the PR diff and the context
  • Checked the master config and the image
  • Checked the perf-changelog entry and where it sits in the file
  • Checked the AgentX stream interval
  • Posted the review

1 blocking issue found. The image bump itself is fine. lmsysorg/sglang-rocm:v0.5.23-rocm720-mi35x-20261109 is a public Docker Hub tag. The new perf-changelog.yaml entry is correctly appended at the end of the file and covers qwen3.5-fp8-mi355x-sglang-agentic-mtp.

The problem is in the recipe this config runs. The bump reruns every AgentX point, and qwen3.5/sglang/mi355x-fp8-mtp/agentic.yaml:37 sets stream-interval: 50 in the shared base args. No variant overrides it, so all 19 points from c1 to c80 run at 50, which breaks the AgentX limit of 20 or less. Lower it to 20 or less before sweeping, and update the changelog description, since the change will no longer be image-only. Details are in the inline comment.

Comment thread inferencex-e2e/configs/amd-master.yaml Resolved

@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.

I reviewed this PR and didn't find any bugs. Because inferencex-e2e/configs/amd-master.yaml has designated AMD code owners in CODEOWNERS, one of them should still take a look.

What was reviewed:

  • The only change in amd-master.yaml is the image: line for qwen3.5-fp8-mi355x-sglang-agentic-mtp. The model, runner, recipe dir, HiCache band and concurrency grid are unchanged, and the comment above the key still describes the current config accurately.
  • The perf-changelog.yaml block is appended at the physical end of the file, and no earlier bytes changed. Its config-keys, scenario-type: [agentic-coding] and PR #4975 link match the changed key and the existing entries for that key.
  • Not done: I didn't check whether the image tag exists or what its digest is, and no sweep results were available. The required /use <run_id> sweep is still outstanding.
Extended reasoning...

This is an 8-line config change. One image: tag in inferencex-e2e/configs/amd-master.yaml is bumped for a single AMD MI355X AgentX key, and one append-only perf-changelog.yaml entry is added for that key. It touches no security-sensitive code: no auth, injection or data-exposure surface. The change follows existing patterns and looks correct. I deferred instead of approving because CODEOWNERS assigns amd-master.yaml to specific AMD owners, and because the PR is a draft with no benchmark sweep run yet.

Co-authored-by: Cursor <cursoragent@cursor.com>
@chuyeh chuyeh changed the title [AMD][Qwen3.5] Bump MI355X FP8 AgentX image to sglang-rocm v0.5.23-20261109 / [AMD][Qwen3.5] 将 MI355X FP8 AgentX 镜像升级至 sglang-rocm v0.5.23-20261109 [AMD][Qwen3.5] Bump MI355X FP8 AgentX image to sglang-rocm v0.5.23-20261109 and lower stream interval to 20 / [AMD][Qwen3.5] 将 MI355X FP8 AgentX 镜像升级至 sglang-rocm v0.5.23-20261109 并将流式输出间隔降至 20 Nov 10, 2026
@chuyeh chuyeh added the full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended) label Nov 10, 2026
@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

chuyeh and others added 2 commits November 11, 2026 08:14
…-agentx-v0.5.23-20261109

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	inferencex-e2e/perf-changelog.yaml
…55X AgentX

Set SGLANG_AITER_HONOR_EXPLICIT_MEM_FRACTION=1 so mem-fraction-static 0.8 is
used as-is instead of being scaled to 0.68 by aiter above 8k context, and set
ROCM_QUICK_REDUCE_QUANTIZATION=NONE explicitly now that the image no longer
defaults to INT8. Restore stream-interval to 50, which the current AgentX
policy allows (at most 60, no lower bound).

Co-authored-by: Cursor <cursoragent@cursor.com>
@chuyeh chuyeh changed the title [AMD][Qwen3.5] Bump MI355X FP8 AgentX image to sglang-rocm v0.5.23-20261109 and lower stream interval to 20 / [AMD][Qwen3.5] 将 MI355X FP8 AgentX 镜像升级至 sglang-rocm v0.5.23-20261109 并将流式输出间隔降至 20 [AMD][Qwen3.5] Bump MI355X FP8 AgentX image to sglang-rocm v0.5.23-20261109 and honor mem-fraction-static / [AMD][Qwen3.5] 将 MI355X FP8 AgentX 镜像升级至 sglang-rocm v0.5.23-20261109 并使 mem-fraction-static 生效 Nov 11, 2026
@chuyeh chuyeh self-assigned this Nov 13, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-sweep-fail-fast Full sweep with canary gate; first failure cancels the rest of that matrix (recommended)

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant