Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
base:
schema: 2
name: musespark-fp4-gb300-sglang-agentic
resources:
gpu_type: gb300
gpus_per_node: 4
slurm:
time_limit: '4:00:00'
frontend:
type: sglang
enable_multiple_frontends: false
observability:
enabled: false
tachometer:
enabled: false
engine: sglang
roles:
agg:
nodes: 1
workers: 1
gpus: 4
args:
served-model-name: meta-models/Muse-Spark-Open-816B-A42B-NVFP4
trust-remote-code: true
tensor-parallel-size: 4
expert-parallel-size: 4
quantization: modelopt_fp4
moe-runner-backend: flashinfer_trtllm
kv-cache-dtype: fp8_e4m3
mem-fraction-static: 0.8
enable-layernorm-sp: true
enable-megamoe-for-layernorm-sp: true
# DFlash2 verifies 8 tokens per step: the current token plus 7 drafts.
speculative-algorithm: DFLASH
speculative-draft-model-path: RadixArk/Muse-Spark-Open-DFlash2
speculative-draft-attention-backend: fa4
speculative-num-draft-tokens: 8
mm-feature-transport: cpu
reasoning-parser: muse
tool-call-parser: muse
watchdog-timeout: 3600
enable-metrics: true
env:
PYTHONNOUSERSITE: '1'
PYTHONUNBUFFERED: '1'
# Outlast AIPerf's pooled connections past Uvicorn's keep-alive.
SGLANG_TIMEOUT_KEEP_ALIVE: '900'
# Cold 533 GB weight loads from shared storage plus graph capture outlast the default.
health_check:
max_attempts: 1440
interval_seconds: 5
benchmark:
env:
# The gated Hub repo is unreadable with the job token; tokenize from the staged checkpoint.
TOKENIZER: /model
# Warmup can leave bytes unacknowledged past AIPerf's 30 s default.
AIPERF_HTTP_TCP_USER_TIMEOUT: '900000'
AIPERF_REQUIRED_SERVER_METRIC_PREFIX: 'sglang:'

zip_override_tp4:
roles:
agg:
args:
max-running-requests: [1, 2, 4, 8, 16, 24, 32, 48, 64, 128]
benchmark:
env:
CONC: ['1', '2', '4', '8', '16', '24', '32', '48', '64', '128']
14 changes: 14 additions & 0 deletions inferencex-e2e/configs/nvidia-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9206,6 +9206,20 @@ qwen3.8next-fp4-gb300-sglang-agentic-mtp:
conc-list: [1, 2, 4, 8, 16, 32, 48, 64]
srt-recipe: agentic.yaml

musespark-fp4-gb300-sglang-agentic-dflash:
image: lmsysorg/sglang:dev-muse-spark-open@sha256:8cfc5a72cb296771f5f8a4a4688cb6d05685610a830cbb616fa4ab0eb7bb2b0a
model: meta-models/Muse-Spark-Open-816B-A42B-NVFP4
model-prefix: musespark
runner: cluster:gb300-nv
precision: fp4
framework: sglang
multinode: false
srt-recipe-dir: musespark/sglang/gb300-fp4-mtp
scenarios:
agentic-coding:
- search-space:
- { tp: 4, ep: 4, kv-offloading: none, spec-decoding: draft_model, conc-list: [1, 2, 4, 8, 16, 24, 32, 48, 64, 128], srt-recipe: agentic.yaml }

qwen3.5-fp8-gb300-dynamo-sglang-agentic-pp-midcurve:
image: lmsysorg/sglang:nightly-dev-cu13-20260913-fa663e72
model: Qwen/Qwen3.5-397B-A17B-FP8
Expand Down
2 changes: 2 additions & 0 deletions inferencex-e2e/configs/runners.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ clusters:
Kimi-K3: {root: scratch, dir: Kimi-K3}
MiniMax-M3-MXFP8: {root: data-models, dir: MiniMax-M3-MXFP8}
MiniMax-M3-NVFP4: {root: scratch, dir: MiniMax-M3-NVFP4}
Muse-Spark-Open-816B-A42B-NVFP4: {root: data-models, dir: Muse-Spark-Open-816B-A42B-NVFP4}
Qwen3.5-397B-A17B-FP8: {root: scratch, dir: Qwen3.5-397B-A17B-FP8}
Qwen3.5-397B-A17B-NVFP4-V2: {root: scratch, dir: Qwen3.5-397B-A17B-NVFP4-V2}
Qwen3.5-397B-A17B-NVFP4: {root: scratch, dir: Qwen3.5-397B-A17B-NVFP4-V2}
Expand Down Expand Up @@ -671,6 +672,7 @@ clusters:
rdma-device-ports: [mlx5_0:1, mlx5_1:1, mlx5_2:1, mlx5_3:1]
job-tag: gb300
segment-directive: false
single-node-models: staged
container-aliases: [dynamo-trtllm, dynamo-sglang, v0.5.11, v0.5.13.post1]
nginx-aliases: [nginx-sqsh]
env:
Expand Down
4 changes: 2 additions & 2 deletions inferencex-e2e/infx/srt_slurm/single_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ def validate_recipe(recipe: dict[str, Any], environment: Mapping[str, str]) -> N
if environment["FRAMEWORK"] not in {"sglang", "trt", "atom", "vllm"}:
raise ValueError(f"Unsupported single-node framework: {environment['FRAMEWORK']!r}")
spec = spec_parameters(role, engine)
if spec and spec["method"] not in {"eagle", "eagle3", "nextn", "mtp", "dspark"}:
if spec and spec["method"] not in {"eagle", "eagle3", "nextn", "mtp", "dspark", "dflash"}:
raise ValueError(
"Single-node SRT supports only native MTP, EAGLE3, DSpark or no speculation"
"Single-node SRT supports only native MTP, EAGLE3, DSpark, DFlash or no speculation"
)
speculation = "mtp" if spec else workload.get("SPEC_DECODING", "none")
agentic = environment["IS_AGENTIC"] == "1"
Expand Down
10 changes: 10 additions & 0 deletions inferencex-e2e/infx/srt_slurm/synthetic_acceptance.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@ def spec_parameters(role: Mapping[str, Any], engine: str) -> dict[str, Any]:
algorithm = next(iter(algorithms), "")
if not algorithm:
return {}
if algorithm == "dflash":
# DFlash verifies a block of the current token plus its drafts.
width = args.get("speculative-num-draft-tokens")
return {
"method": "dflash",
"num_speculative_tokens": width - 1
if isinstance(width, int) and not isinstance(width, bool)
else None,
"model": args.get("speculative-draft-model-path", ""),
}
return {
"method": "dspark" if algorithm == "dspark" else algorithm,
"num_speculative_tokens": args.get(
Expand Down
15 changes: 15 additions & 0 deletions inferencex-e2e/infx/tests/srt_slurm/test_synthetic_acceptance.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ def golden_dir(tmp_path: Path) -> Path:
("minimaxm3_eagle3.yaml", "minimax-m3", 2.5),
("minimaxm3_eagle3_gqa.yaml", "minimax-m3", 2.6),
("glm5.3_mtp.yaml", "glm-5.3", 3.2),
("musespark_dflash.yaml", "muse-spark-open", 3.4),
]:
(directory / filename).write_text(
yaml.safe_dump(
Expand Down Expand Up @@ -177,6 +178,20 @@ def test_kimi_curve_requires_an_explicit_supported_sampler(
"SGLANG_SIMULATE_ACC_TOKEN_MODE": "real-draft-token",
},
),
(
"sglang",
{
"speculative-algorithm": "DFLASH",
"speculative-draft-model-path": "RadixArk/Muse-Spark-Open-DFlash2",
"speculative-num-draft-tokens": 4,
},
{"MODEL_PREFIX": "musespark"},
{
"SGLANG_SIMULATE_ACC_LEN": "3.4",
"SGLANG_SIMULATE_ACC_METHOD": "match-expected",
"SGLANG_SIMULATE_ACC_TOKEN_MODE": "real-draft-token",
},
),
(
"dynamo-sglang",
{"speculative-algorithm": "EAGLE", "speculative-num-steps": 3},
Expand Down
11 changes: 11 additions & 0 deletions inferencex-e2e/perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9892,3 +9892,14 @@
- "The new image brings Kimi-K3 ROCm changes vllm-project/vllm#59591 (latent MoE up-proj stores only the local rank's shards), #59069 (AttnRes output fused with per-token FP8 input quantization), #60717 (vLLM's FP8 max in that fused quantization), #60446 (KDA autotune keys), #59523 (cuMem CUDA-graph pool offload on ROCm) and #59880 (speculative block reservations across KV cache groups with a KV connector)."
- "No change to the Inferact/Kimi-K3-DSpark draft's precision: K3DSparkModel and get_draft_quant_config() are unchanged between the two images, so the draft keeps BF16 weights and an fp8 KV cache."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3951

- config-keys:
- musespark-fp4-gb300-sglang-agentic-dflash
scenario-type:
- agentic-coding
description:
- "Add Muse Spark Open (meta-models/Muse-Spark-Open-816B-A42B-NVFP4) agentic coding on GB300 via single-node SGLang (lmsysorg/sglang:dev-muse-spark-open, digest sha256:8cfc5a72cb296771f5f8a4a4688cb6d05685610a830cbb616fa4ab0eb7bb2b0a) with DFlash2 speculative decoding (RadixArk/Muse-Spark-Open-DFlash2, 8-token verification block)."
- "Serve flags follow the verified GB300 NVFP4 cell of the SGLang Muse Spark cookbook: TP4/EP4, modelopt_fp4, flashinfer_trtllm MoE, fp8_e4m3 KV, mem-fraction-static 0.8, layernorm SP with MegaMoE, fa4 draft attention, muse reasoning and tool-call parsers. KV stays GPU-resident (no HiCache)."
- "Concurrency 1, 2, 4, 8, 16, 24, 32, 48, 64 and 128, with max-running-requests equal to concurrency."
- "Synthetic acceptance follows the committed musespark_dflash golden curve: AL 4.05 at 7 draft tokens, thinking_on."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/XXX
Loading