Skip to content

[K3.1-Pro] Day-0 support SGLang on B200 - #4801

Merged
cquil11 merged 6 commits into
mainfrom
cam/kimik3.1-b200-sglang
Nov 5, 2026
Merged

cquil11 merged 6 commits into
mainfrom
cam/kimik3.1-b200-sglang

Conversation

@cquil11

@cquil11 cquil11 commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Kimi K3.1 Pro AgentX on B200 with SGLang, at the B200 points Kimi K3 shows on InferenceX today. One 8xB200 node cannot hold the ~1.56 TB MXFP4 checkpoint, so every point is one aggregated worker across two nodes.

The DFLASH points need #4798's golden curve before they can launch. Until kimi-k3.1-pro__dflash__kimi-k3.1-dflash2-preview__default-block lands, binding these rows fails with No golden curve for model prefix 'kimik3.1' and method 'dflash'. The curve is being collected in run 41910694249.

The layout is unverified. The SGLang Kimi K3.1 Pro cookbook's B200 command (--tp-size 16 --dcp-size 16) is marked as a placeholder: no K3.1 recipe has run on B200 yet.

Config key Topology Concurrency Speculation KV offload
kimik3.1-fp4-b200-dynamo-sglang-agentic-dflash 2 nodes, TP16 + DCP16, EP1 1, 4, 8, 14 DFLASH, 7 drafts none
24, 32, 48, 56, 72, 80 DFLASH, 4 drafts none
96 none none
  • Image: lmsysorg/sglang:dev-kimi-k31-pro@sha256:67fc77d1…, the SGLang team's K3.1 day-0 build.
  • Serving: frontend.type: sglang, so the single aggregated worker serves the public port itself, the way Kimi K3's B200 points served vLLM directly. The cookbook's Dynamo snapshot needed a patched Dynamo for K3.1, so this avoids Dynamo. The dynamo-sglang framework label only routes the point through the b200-nscale multi-node lane. With no Dynamo frontend, the AgentX client runs with AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: '0'.
  • Speculation: RadixArk/Kimi-K3.1-Dflash2-Preview with --speculative-use-block-verification, FP8 draft KV, cutedsl_mla draft attention and --enable-linear-replayssm-spec. --speculative-num-draft-tokens is the verification width, so it is 8 for 7 drafts and 5 for 4 drafts; 5 is the draft's own configured block. The driver injects the golden AL; nothing is hard-coded.
  • Admission: max-running-requests is twice the concurrency, with decode CUDA graphs to the same batch.
    SGLang caps max_running_requests at 40 on the DFLASH points and 60 at c96 (mamba state cache, 5 slots per request), so points above c40 measure saturation.
  • Power: AgentX power is on. power.py gains the matching b200-nscale multi-node rule.

K3.1 week-1 precision policy:

  • Linear ops, shared experts: the native MXFP4 checkpoint loads as shipped, with no quantization flags.
  • KV cache: kv-cache-dtype: fp8_e4m3.
  • KDA cache: mamba-ssm-dtype: float32.
  • Conv cache: engine default (native BF16).
  • MoE combine and AllReduce/AG/RS: BF16. No quantized-communication flags or environment variables are set.
  • EPLB: not enabled.
  • Draft: served as shipped. FP8 draft KV matches the FP8 target KV, as the draft card and cookbook run it.

Stacked on #4798 (DFLASH golden curve), so the diff includes its commits until it merges.

@github-actions

github-actions Bot commented Nov 4, 2026

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 任务通过。临时性失败通常可以通过重新运行恢复;参见重新运行失败任务的说明。

Comment thread inferencex-e2e/perf-changelog.yaml Outdated
description:
- "Add Kimi K3.1 Pro B200 SGLang AgentX on lmsysorg/sglang:dev-kimi-k31-pro: one aggregated worker over two nodes, TP16 with DCP16, no KV offload, concurrency 1, 4, 8, 14, 24, 32, 48, 56, 72, 80 with DFLASH and 96 without speculation."
- "DFLASH uses RadixArk/Kimi-K3.1-Dflash2-Preview with block verification, 7 draft tokens through concurrency 14 and 4 above."
pr-link: TBD

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.

🔴 The perf-changelog check will fail on this PR, so the PR stays red until the link is fixed. The new entry uses pr-link: TBD. The validator accepts only the PR's own canonical URL or an XXX placeholder (PR_LINK_PLACEHOLDERS in validate_perf_changelog.py:21). Fix: set pr-link to https://github.com/SemiAnalysisAI/InferenceX/pull/XXX or to this PR's real URL.

Why this was flagged

On a PR run, validate_added_pr_link (infx/workflows/validate_perf_changelog.py:105-116) compares each appended entry's link against expected (the PR's own URL) and PR_LINK_PLACEHOLDERS = {"XXX", "https://github.com/SemiAnalysisAI/InferenceX/pull/XXX"}. "TBD" is in neither, so it raises new PR entry must use '...' or an XXX placeholder; found 'TBD'. That fails the changelog validation job for this PR. On a main-branch run, CANONICAL_PR_LINK would also reject it with new main-branch entry has invalid pr-link. No other entry in perf-changelog.yaml uses TBD.

Verification: At perf-changelog.yaml:12023 the PR appends pr-link: TBD. validate_added_pr_link (validate_perf_changelog.py:105-116) raises because "TBD" is not in PR_LINK_PLACEHOLDERS. The PR-run check (run-sweep.yml:96-116) never calls it, so the failure lands at merge instead. merge_with_reuse.py:688 reaches compare_entries (prepare_perf_changelog_merge.py:88), which raises on 'TBD'.

Comment on lines +4817 to +4904
precision: fp4
framework: dynamo-sglang
multinode: true
disagg: false
srt-recipe-dir: kimik3.1/sglang/b200-fp4/agentx
scenarios:
agentic-coding:
- search-space:
- spec-decoding: draft_model
kv-offloading: none
conc-list: [1]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c1
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [4]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c4
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [8]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c8
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [14]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c14
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [24]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c24
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [32]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c32
power: true
worker:
num-worker: 1
tp: 16
dcp-size: 16
ep: 1
dp-attn: false
- spec-decoding: draft_model
kv-offloading: none
conc-list: [48]
num-nodes: 2
srt-recipe: agg-variants.yaml:override_tp16_c48
power: true
worker:
num-worker: 1

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.

🔴 If this merges before #4798, all ten DFLASH rows fail at binding with No golden curve for model prefix 'kimik3.1' and method 'dflash'. Only the c96 no-spec row would launch. identities.yaml has no kimik3.1 dflash identity, and this diff does not add one. Fix: add the kimi-k3.1-pro__dflash__kimi-k3.1-dflash2-preview__default-block identity and its curve in this change. Otherwise, gate the merge on #4798 or leave the DFLASH rows out until it lands.

Why this was flagged

The condition is merging this PR before the stacked #4798. Every search-space row with spec-decoding: draft_model (nvidia-master.yaml:4817-4944) resolves a golden AL curve by model prefix kimik3.1 and method dflash. infx/golden_al_distribution/identities.yaml has kimik3.1 only under method dspark (line 105-106). The only dflash identity there is for musespark (line 170-171). identity.py:260 therefore raises ValueError("No golden curve for model prefix 'kimik3.1' and method 'dflash'") for 10 of the 11 rows, so the sweep produces only the c96 no-spec point. The PR description acknowledges the dependency, but nothing in this diff enforces the merge order.

Verification: The diff does not touch infx/golden_al_distribution/identities.yaml. agg-variants.yaml sets speculative-algorithm: DFLASH (line 50). identities.yaml selects kimik3.1 only with method: dspark (line 106), so identity.py:260 raises ValueError. Result: all ten spec-decoding: draft_model rows fail to launch.

@cquil11
cquil11 force-pushed the cam/kimik3.1-b200-sglang branch 3 times, most recently from 968b4d9 to 09310d5 Compare November 4, 2026 23:05
One aggregated SGLang worker over two B200 nodes (TP16 + DCP16) serving
the public port directly, with RadixArk DFLASH and block verification at
concurrency 1-80 and no speculation at 96.
@cquil11
cquil11 force-pushed the cam/kimik3.1-b200-sglang branch from 09310d5 to e80fb62 Compare November 4, 2026 23:11
@cquil11 cquil11 added the non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim) label Nov 4, 2026
@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

…ng AgentX client

The aggregated SGLang worker serves the public port without a Dynamo frontend, and agentx profile rejects --use-dynamo-conv-aware-routing, so every throughput point failed before sending a request.
@cquil11

cquil11 commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

/use 41976897857

@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

@cquil11 staged run 41976897857.

This run remains available across future /stage-results requests. Staging the same run ID again updates its staged data. Staging workflow

@cquil11

cquil11 commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run 41976897857

@cquil11

cquil11 commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

/reuse-sweep-run 41976897857

@cquil11
cquil11 merged commit 220b85d into main Nov 5, 2026
27 checks passed
@cquil11
cquil11 deleted the cam/kimik3.1-b200-sglang branch November 5, 2026 14:26
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Ingest report — ✅ Results ingested into the production database.

Ingest workflow · Merge Ingest run · Benchmark source run

Category new duplicate skipped unmapped failed
benchmark 11 0 0 0 0
eval 7 7 0 0 0
trace 11 0 0 0 0
power 22 0 0 0 0

benchmarkFiles 11, rawBenchmarkRows 11, coveredByPerJobFiles 0, purgedPoints 0, failedRunRows 0, runStatsNew 0, runStatsDuplicate 0, evalSamplesNew 9233, gpuMetricSamplesNew 1261232, powerPublicationPoints 11, changelogEntriesWritten 1

Counts cover only this run. Rows: benchmark_results, eval_results, agentic rows linked to a trace, gpu_metrics series. This comment updates if the ingest is rerun.

中文

Ingest 报告 — ✅ 结果已写入 production 数据库。

上表仅统计本次运行写入的数据,各行单位依次为 benchmark_results 行、eval_results 行、已关联 trace 的 agentic 行和 gpu_metrics 序列。重新运行 ingest 时本评论会原地更新。

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

Labels

non-canary-full-sweep-enabled Run the full sweep without the canary gate (full search space, no trim)

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant