Repository navigation
feat(config): add Qwen3.8 GB300 AgentX / feat(config): 新增 Qwen3.8 GB300 AgentX 配置 - #3816
Conversation
新增 Qwen3.8-Flash-Next NVFP4 的 GB300 AgentX 配置,使用原生 NEXTN MTP 和 SGLang HiCache。
|
Thanks for the contribution!
中文感谢你的贡献!
|
更新 Qwen3.8 GB300 changelog 条目的 PR 链接。
There was a problem hiding this comment.
I reviewed this PR and didn't find any bugs. Because the two files it touches (inferencex-e2e/configs/nvidia-master.yaml and the new gb300-fp4-mtp/agentic.yaml recipe) are CODEOWNERS-protected and require sign-off from the listed NVIDIA maintainers, a human look would still be worthwhile.
What was reviewed:
- New agentic.yaml recipe:
identity.container.imageandmodel.containermatch; checked theenable-linear-replayssm-specwithoutlinear-replayssm-cache-lenconcern raised by earlier passes — several other existing recipes in the repo (e.g. the gb300-fp8 nightly agentx configs) also omit this companion flag, so it's not unique to this change. - Confirmed the missing
USE_CHAT_TEMPLATEenv var is expected here:validate_recipeininfx/srt_slurm/single_node.pyonly requires it for non-agentic recipes, and this one is agentic (srt_agentic.sh). nvidia-master.yaml's new search-space entry and theperf-changelog.yamlentry are consistent with the recipe and correctly appended at the tail.- The changelog's
pr-linkis still thepull/XXXplaceholder; per CONTRIBUTING.md that's filled in after the PR number is known, but it should be set to the real URL before merge.
Extended reasoning...
Config/recipe-only addition (new SGLang GB300 AgentX recipe for Qwen3.8-Flash-Next NVFP4, a master-config entry, and a perf-changelog block) with no source code touched, so no injection/auth/data-exposure surface. Verified the image/container pin matches, the agentic-only USE_CHAT_TEMPLATE exemption in validate_recipe, and that the flagged replayssm cache-len omission has precedent elsewhere in the repo. Both changed files fall under CODEOWNERS entries naming specific NVIDIA maintainers (including the PR author themselves), which is the deciding factor for deferring to a human review rather than approving.
This review covers commit c01e7c4, which is no longer the latest commit on this pull request; later commits are not covered by it.
|
View unofficial run (performance): https://inferencex.semianalysis.com/inference?unofficialRun=37714835620 View unofficial run (accuracy): https://inferencex.semianalysis.com/evaluation?unofficialRun=37714835620 |
|
/use 37714835620 |
|
@RohitNagraj staged run 37714835620: https://inferencemax-app-git-staging-semianalysisai.vercel.app/inference?i_dates=2026-10-08~r37714835620 This run remains available across future |
|
As a PR reviewer and CODEOWNER, I have reviewed this and have:
Additional detail section:
Signed: |
✅✅✅ Verdict: PASS ✅✅✅Passed and not applicable checks✅ Check 0 (CODEOWNER): PASS — ✅ Check 1 (Passing sweep + evals on in-PR commit): PASS — head ✅ Check 2 (Eval accuracy): PASS — ✅ Check 3 (Upstream recipe): PASS — sgl-project/sglang#43159 is MERGED (2026-10-08T23:56:31Z, ✅ Check 4 (Reuse command): PASS — ✅ Check 5 (Latest checklist template): PASS — all 16 items in the current template, including the recipe sub-item, are present and checked. ✅ Check 6 (Upstream image / engine-first): PASS — ✅ Check 7 (No deprecated models/scenarios): PASS — MODELS.md lists ✅ Check 8 (No architecture hacks / event publication): PASS — no ✅ Check 9 (Spec-decode via chat template): PASS — the aiperf ✅ Check 10 (No engine patches): PASS — the stock image runs with no patch, ✅ Check 11 (Agentic golden AL): PASS — the c4 job log shows ➖ Check 12 (Append-only): N/A — the new changelog entry does not set ✅ Check 13 (Draft runs as shipped): PASS — the embedded MTP head comes from the same checkpoint revision ✅ Check 14 (Pareto coverage): PASS — one curve, ✅ Check 15 (PR description): PASS — the body's claims match the code and run: stock SGLang v0.5.21-cu130 with a pinned digest and revision, TP1/EP1 aggregate, NEXTN MTP, HiCache, concurrency 1–64, BF16 target/draft KV, metrics and cache reporting, golden AL for throughput and real verification for the eval. Assessed commit: |
functionstackx
left a comment
There was a problem hiding this comment.
can u add to cookbook , the new ponah way
|
[by Claude Code] The SGLang cookbook integration of this PR's AgentX config ( |
|
[by Claude Code] sgl-project/sglang#43083 has been merged. This PR's AgentX config ( The commands mirror the launch measured in run 37714835620, pinned by this PR's |
cquil11
left a comment
There was a problem hiding this comment.
Approved for merge with the existing CODEOWNER sign-off and sweep reuse. The cookbook update is merged in sgl-project/sglang#43083.
…t-recipe (#3805) * refactor(matrix): select srt-slurm recipes with srt-recipe-dir and srt-recipe Master configs name each row's recipe with srt-recipe (and eval-srt-recipe) relative to a per-entry srt-recipe-dir instead of CONFIG_FILE and EVAL_CONFIG_FILE additional-settings. Validation requires them on every srt-slurm row, checks the file and selected variant exist at load time, and rejects the old settings; llmd-vllm entries keep CONFIG_FILE. The generator emits project-relative paths, counts nodes from the row's recipe, and the launcher reads SRT_RECIPE/EVAL_SRT_RECIPE, staging the same recipes/<path>:<selector> argument for srtctl. Also drops the unread SYNTHETIC_ACCEPTANCE* and SLURM_PARTITION settings. * chore(recipes): drop stale CONFIG_FILE header comments Master rows now select bundle variants with srt-recipe, so the recipe headers no longer describe how to pick one. * fix(matrix): resolve srt recipes under the loaded config's project Recipe existence, selector checks and recipe node counts read files from the project that holds the loaded configs/ (or the root a caller passes) instead of the tooling checkout's repository_root(). The generator CLI and planner pass config_root(config files), Klaud live families pass the checkout root, and Klaud's canonical matrix fetches the candidate's recipes from the candidate head. * test(operatorx): give the generator fixture a project-layout srt recipe Master configs now name an srt-recipe resolved under the project that holds configs/, so the fixture places its master in configs/ beside a recipe. * fix(configs): select the DSv4.1-Flash ATOM AgentX recipe with srt-recipe-dir srt-recipe paths, which validation rejects now that every srt-slurm entry needs srt-recipe-dir. The entry sets srt-recipe-dir and its rows select agentic.yaml; the generated rows are unchanged. * chore(recipes): drop stale CONFIG_FILE headers from the DSv4.1-Flash GB300 AgentX recipes #3598 added the GB300 Dynamo+SGLang recipes with headers that say to select a variant with CONFIG_FILE. Master rows select them with srt-recipe now, so the headers stop at the variant layout like the other AgentX bundles. * refactor(matrix): deslop srt-recipe selection Set an AgentX row's srt-recipe fields once after the topology branch, and fetch each recipe file a Klaud family references once rather than once per row. * test: deslop srt-recipe selection tests The installed-package test no longer checks recipe node counts, which take an explicit root since srt-recipe and so no longer exercise caller-repository resolution. Drop unused monkeypatch fixtures and a history comment. * docs: deslop srt-recipe selection guidance Show srt-recipe in the CONFIGS.md search-space example, shorten its selection note, name srt-slurm recipes in the revision snapshot description, and shorten the debug-runs recipe path. * fix(configs): select each GB200 DSR1 FP8 low-latency variant explicitly The low-latency row named disagg-tp8-stp-variants.yaml without a selector, so one job submitted all three zip variants under a 4-node, 1-decode-worker label. Each variant now runs only the concurrencies it is tuned for, with its selector and its 7 TP8 decode workers on 16 nodes: zip_override_lowlat[0] (c8) at 4 and 8, zip_override_lowlat[1] (c16-32) at 16. zip_override_lowlat[2] is tuned for concurrency 64, which the entry never ran, so it has no row. * fix(configs): select the Qwen3.8 and Qwen3.5 GB300 AgentX recipes with srt-recipe-dir #3816 and #3840 added qwen3.8next-fp4-gb300-sglang-agentic-mtp and the Qwen3.5 FP8 GB300 midcurve entries with a project-relative srt-recipe path and CONFIG_FILE settings, which validation rejects now that every srt-slurm entry needs srt-recipe-dir. The entries set srt-recipe-dir and their rows select the same recipes and DEP16 overrides; the generated rows are unchanged. * fix(matrix): report a malformed srt-recipe as a validation error A recipe that fails to parse raised a raw yaml.YAMLError out of validate_master_config, so Klaud's canonical_matrix crashed on a malformed candidate recipe instead of rejecting it like other bad srt-recipe references. It now raises the same ValueError, naming the recipe file. * fix(configs): select the Qwen3.5 GB200 FP4 V2 MTP recipes with srt-recipe-dir #2594 added qwen3.5-fp4-gb200-dynamo-sglang-mtp with CONFIG_FILE settings, which validation rejects now that every srt-slurm entry needs srt-recipe-dir. The entry sets srt-recipe-dir and each row selects the same recipe; the generated rows are unchanged.
…r row (#3818) * refactor(srt): compose AgentX recipes from fragments and set power on master rows AgentX recipes, single- and multi-node, become fragments like the fixed-sequence ones. configs/srt-recipes/agentic-{single,multi}.yaml supply the client command; the binder writes the master model, image, precision and identity, and the launcher hands multi-node clients RESULT_DIR, AIPERF_DATASET_MMAP_CACHE_DIR and HF_HUB_CACHE from the volumes it mounts (agentic-volume-mounts replaces lanes._AGENTIC_CACHES). Dead keys and copies of the workflow environment leave the fragments; a fragment that sets a bound key fails before submission. A multinode search-space row with power: true replaces recipe telemetry blocks: the shared telemetry-dcgm.yaml is merged with the cluster's power-exporter-port and benchmark.concurrencies is bound after variant selection, so bundles can measure power. POWER_LANES now judges the row's field instead of reading recipe text, and inject_concurrencies is gone. Selected zip variants drop null-valued keys as srtctl apply does, and h200-dgxc GLM-5.2 FP8 AgentX keeps serving the Hub snapshot. * feat(srt): generate the bound recipes of AgentX points too infx generate now binds every srt-slurm point of the selected keys, AgentX as well as fixed-sequence, single- and multi-node, through the binder the launcher runs. The workflow environment it reproduces gains the AgentX inputs (IS_AGENTIC, KV_OFFLOADING, TOTAL_CPU_DRAM_GB, THINKING_MODE) and the multi-node request fields. A multi-node point takes the binder inputs the launcher derives from the one cluster its runner label schedules on: launch_path, the lane's POWER_LANES decision and the cluster's power-exporter-port give the DCGM telemetry block and bound concurrencies, and config.agentic_client_env, which no longer needs an SrtRun, gives the AgentX client paths. Such a point fails when its label spans several clusters or the lane refuses its power. The manifest records the cluster. * refactor(srt): compose the DSv4.1-Flash ATOM AgentX recipe from a fragment so binding it fails on its model block and benchmark MODEL. Like the other AgentX fragments it drops them, the client command its shared block supplies, and WEKA_LOADER_OVERRIDE, which names the corpus dsv41flash replays by default. Every point binds to main's selected variant without that override. * refactor(srt): deslop AgentX composition The multi-node binder reads IS_AGENTIC instead of defaulting a missing value to fixed-sequence, model_paths drops a guard the binder makes redundant, and RECIPES.md points at the bound-key tables instead of copying them. * refactor(srt): drop checks and env placeholders the binder makes dead select_recipe binds each variant before validate_recipe sees it, and the binder writes model.path, model.container, model.precision and benchmark.env.MODEL from the same environment, so those four comparisons can never fail. infx generate set KV_OFFLOADING and TOTAL_CPU_DRAM_GB to empty or zero placeholders for fixed-sequence points that nothing reads; it now sets them only for AgentX points. * refactor(srt): share the multi-node binder inputs with infx generate The launcher and infx generate each derived the DCGM exporter port and the AgentX client paths from the cluster, lane, request and power decision, and infx generate must match the launcher. Both now call config.binder_inputs. infx generate imports the launcher modules at the top: they import nothing that imports it back. * test(srt): drop binder tests that echo their inputs or repeat launcher tests The bound AgentX client test asserted values it passed in, and the CLI test's power and client-env tail repeated the srt driver tests that run the same module with those flags. The fragment-rejection test no longer pins the explanatory suffix, and an unused constant goes. * docs(srt): condense infx generate guidance RECIPES.md states the infx generate binder inputs in fewer words and drops a sentence the power-row table already makes. CONFIGS.md puts mounts back beside volume-mounts, which it describes, and the GLM-5.2 GB200 power comment moves onto the power field. * docs: drop recipe image and telemetry rules the binder now owns Recipes may no longer set model.container, identity.container.image or telemetry.enabled, yet the Klaud prompt and docs still asked for matching images, nuke.md still ran a script that rewrites model.container (it now fails on every recipe), and the power docs still gated energy collection on recipe telemetry. They now say the binder writes the master image and a power: true master row enables DCGM telemetry. * refactor(srt): compose main's new GB300 and B300 AgentX recipes from fragments #3816, #3840 and #3744 added full recipes: the Qwen3.8 GB300 and Qwen3.5 GB300 DEP16 recipes carry model blocks, the client command, benchmark MODEL and the client paths the launcher hands multi-node points, and both new recipes and the DSv4.1-Flash B300 one set the identity repo and image the binder writes. Like the other AgentX fragments they drop them, and WEKA_LOADER_OVERRIDE, which names both models' default corpus. The Qwen3.8 recipe keeps the TOTAL_CPU_DRAM_GB and KV_OFFLOADING the launcher checks against the point. Each point binds to main's selected variant, with the Qwen3.5 model alias bound as its Hub id like the other GB300 Qwen3.5 AgentX points. * refactor(srt): share one agentic.yaml block between the AgentX lanes agentic-single.yaml and agentic-multi.yaml were byte-identical. Single- and multi-node AgentX points now compose with configs/srt-recipes/agentic.yaml; the bound recipes are unchanged. * test(srt): reject a single-node variant sized for another DRAM budget The launcher rejects a variant whose TOTAL_CPU_DRAM_GB differs from the point's, the check that ties a recipe's literal host pools to the row's dram-utilization. No test covered it. * fix(srt): bind the AgentX client's IS_MULTINODE and power switch Aggregated multi-node AgentX recipes pinned IS_MULTINODE=false so the client would not measure power, and so published a single-node result shape for jobs that span nodes (the DSv4 GB300 TP8 agg point runs on two). The client's conc_N naming had to accept the workflow's CONC_LIST to keep collecting them. The Qwen3.5 B300 disagg recipe pinned ENABLE_AGENTX_POWER=0 instead. The binder now writes both into every multi-node AgentX recipe from the launcher's own state: IS_MULTINODE from the request, and ENABLE_AGENTX_POWER=1 exactly when the power decision collects AgentX or adapter power. A fragment that sets either fails composition. The pins are deleted, and so are the TP, PP_SIZE, PCP_SIZE and EP_SIZE copies: only single-node points read them, and multi-node results take their topology from the workflow's PREFILL_* and DECODE_* env. The client names results per concurrency on IS_MULTINODE alone. The DSv4 GB300 vLLM 1P4D recipe also pinned RUNNER_TYPE=gb300 and PREFILL_TP=1. Its prefill worker is DEP4 (tensor-parallel-size 1, data-parallel-size 4, expert parallel) on four GPUs, which the master row records as tp 4, ep 4, dp-attn like its DEP4 siblings; the pin published prefill_tp 1 and counted one prefill GPU instead of four. Those pins and the unread OFFLOADING copy are deleted, so the row publishes its runner label and topology like its siblings. The client's power mode, result directory and file name are unchanged for every point, except that the 192 multi-node points without power switch from an invalid power verdict (multinode_power_contract_missing) to none. The 35 formerly pinned points publish is_multinode true with prefill and decode topology. * refactor(srt): stop pinning workflow env in recipe fragments Fragments still set values the workflow exports from the matrix point or from runtime_settings.sh. The Kimi-K3 GB200 and GB300 fragments pinned REQUIRE_POWER=1, two TensorRT-LLM fragments pinned MAX_MODEL_LEN, MiniMax-M3 GB200 TRT copied KV_OFFLOAD_BACKEND_METADATA, the DSv4 GB300 frontends copied MODEL, MODEL_PREFIX, FRAMEWORK, PRECISION, DURATION, KV_OFFLOADING and CONC, and GLM-5.3 TileRT set MODEL=/model, which it published as the model. The binder now writes REQUIRE_POWER into every multi-node AgentX recipe: 1 when the workflow requires power or the lane's power rule does. The gb200-nv and gb300-nv Kimi-K3 AgentX rules require it, which keeps the pinned points strict and no others. BOUND_ENV rejects every name the workflow exports from the matrix point. MAX_MODEL_LEN goes (the AgentX client never reads it; evals take the job's), and so do the frontend copies, which the Dynamo frontend never reads. GLM-5.3 names its local checkpoint as the client's TOKENIZER, which the replay reads before MODEL, so it publishes zai-org/GLM-5.3 and keeps its tokenizer. Copies that equal the workflow's value go too: VLLM_ENGINE_READY_TIMEOUT_S 3600, PYTHONDONTWRITEBYTECODE, AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS 3600 and the MORI, NCCL and SGLang settings runtime_settings.sh exports for sglang-disagg. Every process keeps its effective value through the job environment. Fragments keep values that override the workflow's on purpose: the Dynamo routing and session settings, longer engine-ready timeouts, MORI_IO_QP_MAX_SEND_WR 32767 and single-node variant labels.
Add a GB300 AgentX configuration for Qwen3.8-Flash-Next NVFP4 using stock SGLang v0.5.21-cu130, aggregate TP1/EP1, native NEXTN MTP, and SGLang HiCache. Cover concurrency 1, 2, 4, 8, 16, 32, 48, and 64.
Pin the container digest and checkpoint revision, retain the checkpoint's embedded MTP head, and use BF16 target/draft KV. Enable engine metrics and cache reporting, with automatic golden acceptance for throughput and real verification for evaluation. Use the existing GB300 cluster profile and native Hugging Face checkpoint loading.
AI model disclosure
The runtime identifies the GPT-6 family; the exact model/version could not be verified. Role: configuration preparation, review, and local validation. No delegated agents contributed.
PR checklist and change type
Type of Change
Checklist
inferencex-e2e/perf-changelog.yamland have not edited historical entriesfull-sweep-fail-fast(recommended),full-sweep-enabled, ornon-canary-full-sweep-enabled. Optional modifiersall-evals,evals-only, andagentx-fastrequire a primary label; the last two block reuse.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.中文
新增 Qwen3.8-Flash-Next NVFP4 的 GB300 AgentX 配置,使用原版 SGLang v0.5.21-cu130、聚合式 TP1/EP1、原生 NEXTN MTP 和 SGLang HiCache,覆盖并发数 1、2、4、8、16、32、48、64。
固定容器 digest 和 checkpoint 版本,保留 checkpoint 自带的 MTP head,并为 target 和 draft 使用 BF16 KV。启用引擎 metrics 和缓存报告;吞吐测试自动选择 golden acceptance,质量评测使用真实验证。使用现有 GB300 cluster profile 和原生 Hugging Face checkpoint 加载方式。
运行环境仅标识 GPT-6 系列,无法核实准确模型及版本。工作内容为配置准备、审查和本地验证;未使用委派 agent。改动类型为新增功能和配置变更,检查清单已在上方填写。