-
Notifications
You must be signed in to change notification settings - Fork 264
Add MiniMax-M3 NVFP4 GB300 vLLM Disaggregated AgentX with EAGLE3-GQA MTP / 新增 MiniMax-M3 NVFP4 GB300 vLLM 分离式 AgentX EAGLE3-GQA MTP 配置 #2663
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
c0f60f3
1fbad05
a717638
e4b0828
d30a369
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,163 @@ | ||
| name: "minimax-m3-vllm-disagg-gb300-1p1d-tep4-tp4-c1-fp4-agentic" | ||
|
|
||
| model: | ||
| path: "nvidia/MiniMax-M3-NVFP4" | ||
| container: "vllm/vllm-openai:nightly-5e35a6f4f9bbc217c599692157ca985c894373f7" | ||
| precision: "fp4" | ||
|
|
||
| identity: | ||
| model: | ||
| repo: "nvidia/MiniMax-M3-NVFP4" | ||
| container: | ||
| image: "vllm/vllm-openai:nightly-5e35a6f4f9bbc217c599692157ca985c894373f7" | ||
| frameworks: | ||
| dynamo: "1.4.0.dev20260730" | ||
|
|
||
| dynamo: | ||
| version: "1.4.0.dev20260730" | ||
| install: true | ||
|
|
||
| health_check: | ||
| max_attempts: 2160 | ||
| interval_seconds: 10 | ||
|
|
||
| resources: | ||
| gpu_type: "gb300" | ||
| gpus_per_node: 4 | ||
| het_jobs: false | ||
| spread_workers: false | ||
| prefill_nodes: 1 | ||
| decode_nodes: 1 | ||
| prefill_workers: 1 | ||
| decode_workers: 1 | ||
| gpus_per_prefill: 4 | ||
| gpus_per_decode: 4 | ||
|
|
||
| infra: | ||
| etcd_nats_dedicated_node: false | ||
| nats_max_payload_mb: 32 | ||
|
|
||
| environment: | ||
| PYTHONHASHSEED: "0" | ||
|
|
||
| frontend: | ||
| type: dynamo | ||
| enable_multiple_frontends: false | ||
| nginx_session_affinity: true | ||
| nginx_session_affinity_header: "X-Dynamo-Session-ID" | ||
| args: | ||
| router-mode: "least-loaded" | ||
| router-session-affinity-ttl-secs: 1800 | ||
| env: | ||
| DYN_TOKENIZER: "fastokens" | ||
| DYN_TOKENIZER_CACHE_BYTES: "8589934592" | ||
| DYN_TCP_CONNECT_TIMEOUT: "120" | ||
|
|
||
| backend: | ||
| type: vllm | ||
| connector: null | ||
| dp_launch_mode: per_node | ||
| mooncake_kv_store: | ||
| env: | ||
| MC_ENABLE_DEST_DEVICE_AFFINITY: "1" | ||
| MC_STORE_CLIENT_METRIC: "1" | ||
| MC_STORE_CLIENT_METRIC_INTERVAL: "5" | ||
| MC_TE_METRIC: "0" | ||
| store_config: | ||
| metadata_server: "P2PHANDSHAKE" | ||
| global_segment_size: "200GB" | ||
| local_buffer_size: "4GB" | ||
| protocol: "rdma" | ||
| device_name: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" | ||
| mode: "embedded" | ||
| enable_offload: true | ||
| vllm_config: | ||
| prefill: | ||
| served-model-name: "nvidia/MiniMax-M3-NVFP4" | ||
| kv-cache-dtype: "fp8" | ||
| block-size: 128 | ||
| trust-remote-code: true | ||
| enable-prefix-caching: true | ||
| language-model-only: true | ||
| no-enable-flashinfer-autotune: true | ||
| reasoning-parser: "minimax_m3" | ||
| dyn-tool-call-parser: "minimax_m3" | ||
| dyn-reasoning-parser: "minimax_m3" | ||
| max-cudagraph-capture-size: 512 | ||
| max-num-batched-tokens: 16384 | ||
| stream-interval: 20 | ||
| gpu-memory-utilization: 0.9 | ||
| tensor-parallel-size: 4 | ||
| enable-expert-parallel: true | ||
| all2all-backend: "flashinfer_nvlink_one_sided" | ||
| attention-config: '{"backend":"FLASHINFER","use_trtllm_attention":true,"indexer_kv_dtype":"fp8"}' | ||
| speculative-config: '{"method":"eagle3","model":"Inferact/MiniMax-M3-EAGLE3-GQA","num_speculative_tokens":3,"attention_backend":"FLASH_ATTN","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.78}' | ||
| kv-transfer-config: '{"kv_connector":"MultiConnector","kv_role":"kv_both","kv_load_failure_policy":"recompute","kv_connector_extra_config":{"connectors":[{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_connector_extra_config":{"backends":["UCX"],"enforce_handshake_compat":false,"read_validation_timeout":30.0}},{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"lookup_async":true}}]}}' | ||
| enable-cumem-allocator: true | ||
| decode: | ||
| served-model-name: "nvidia/MiniMax-M3-NVFP4" | ||
| kv-cache-dtype: "fp8" | ||
| block-size: 128 | ||
| trust-remote-code: true | ||
| enable-prefix-caching: true | ||
| language-model-only: true | ||
| no-enable-flashinfer-autotune: true | ||
| reasoning-parser: "minimax_m3" | ||
| dyn-tool-call-parser: "minimax_m3" | ||
| dyn-reasoning-parser: "minimax_m3" | ||
| dyn-default-thinking-mode: "enabled" | ||
| max-cudagraph-capture-size: 512 | ||
| max-num-batched-tokens: 16384 | ||
| max-num-seqs: 1024 | ||
| stream-interval: 20 | ||
| gpu-memory-utilization: 0.9 | ||
| tensor-parallel-size: 4 | ||
| enable-expert-parallel: false | ||
| attention-config: '{"backend":"FLASHINFER","use_trtllm_attention":true,"indexer_kv_dtype":"fp8","minimax_m3_msa_decode_backend":"cutlass"}' | ||
| speculative-config: '{"method":"eagle3","model":"Inferact/MiniMax-M3-EAGLE3-GQA","num_speculative_tokens":3,"attention_backend":"FLASH_ATTN","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.78}' | ||
| kv-transfer-config: '{"kv_connector":"MultiConnector","kv_role":"kv_both","kv_load_failure_policy":"fail","kv_connector_extra_config":{"connectors":[{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_connector_extra_config":{"backends":["UCX"],"enforce_handshake_compat":false,"read_validation_timeout":30.0}},{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_consumer","kv_connector_extra_config":{"enable_lookup":false}}]}}' | ||
| enable-cumem-allocator: true | ||
| prefill_environment: &worker_environment | ||
| HF_HUB_CACHE: "/hf_hub_cache" | ||
| HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" | ||
| TRANSFORMERS_CACHE: "/hf_hub_cache" | ||
| VLLM_ENGINE_READY_TIMEOUT_S: "3600" | ||
| DYN_TCP_CONNECT_TIMEOUT: "120" | ||
| VLLM_FLOAT32_MATMUL_PRECISION: "high" | ||
| VLLM_FLASHINFER_ALLREDUCE_BACKEND: "trtllm" | ||
| VLLM_USE_NCCL_SYMM_MEM: "0" | ||
| VLLM_ALLREDUCE_USE_SYMM_MEM: "0" | ||
| VLLM_MOONCAKE_LOAD_RECV_THREADS: "20" | ||
| UCX_MEMTYPE_CACHE: "n" | ||
| UCX_CUDA_IPC_ENABLE_MNNVL: "y" | ||
| UCX_MODULE_DIR: "/usr/local/lib/python3.12/dist-packages/nixl_cu13.libs/ucx" | ||
| UCX_RNDV_PIPELINE_ERROR_HANDLING: "y" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_NVLS_ENABLE: "1" | ||
| NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" | ||
| decode_environment: | ||
| <<: *worker_environment | ||
| VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" | ||
|
|
||
| sbatch_directives: | ||
| cpus-per-task: "72" | ||
| mem: "0" | ||
|
|
||
| srun_options: | ||
| container-remap-root: "" | ||
|
|
||
| benchmark: | ||
| type: custom | ||
| command: "bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh" | ||
| env: | ||
| INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" | ||
| RESULT_DIR: "/logs/agentic" | ||
| PORT: "8000" | ||
| IS_MULTINODE: "true" | ||
| AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true" | ||
| AIPERF_EXTRA_INPUTS: "thinking:true" | ||
| AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" | ||
| AIPERF_SERVER_METRICS_COLLECTION_INTERVAL: "1.0" | ||
| HF_HUB_CACHE: "/hf_hub_cache" | ||
| WEKA_LOADER_OVERRIDE: "semianalysis_cc_traces_weka_062126" | ||
|
Comment on lines
+152
to
+163
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔴 All 10 new MiniMax-M3 GB300 agentic recipes under gb300-fp4/ omit AIPERF_EXTRA_INPUTS: "thinking:true" from benchmark.env, unlike every existing MiniMax-M3 agentic recipe (e.g. the GB200 sibling disagg-1p1d-dep8-dep4-agentic.yaml line 113, and all agg-*-agentic.yaml files). Since MiniMax-M3 is a reasoning model and this flag is what tells aiperf to exercise thinking mode, these runs will silently benchmark with thinking disabled or defaulted, producing output-length/acceptance-length/latency numbers that are not comparable to the model's real agentic-coding behavior or its own GB200 curve; add the flag to all 10 recipes' benchmark.env blocks before merging. Extended reasoning...The bug. Every one of the 10 new recipes under How the flag is used. if [ -n "${AIPERF_EXTRA_INPUTS:-}" ]; then
REPLAY_CMD+=" --extra-inputs $AIPERF_EXTRA_INPUTS"
fiThis is a plain conditional with no fallback/default — if the recipe's Why the shared dataset doesn't save it. One might assume the Why this looks like an authoring accident rather than an intentional change. The new GB300 Impact. These recipes exist specifically to produce a GB300 curve comparable to the GB200 MiniMax-M3 agentic curve, and to power a "real-verification" eval twin plus a tuned Proof walkthrough.
Fix. Add |
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,163 @@ | ||
| name: "minimax-m3-vllm-disagg-gb300-1p1d-tep4-tp4-c1-fp4-eval-agentic" | ||
|
|
||
| model: | ||
| path: "nvidia/MiniMax-M3-NVFP4" | ||
| container: "vllm/vllm-openai:nightly-5e35a6f4f9bbc217c599692157ca985c894373f7" | ||
| precision: "fp4" | ||
|
|
||
| identity: | ||
| model: | ||
| repo: "nvidia/MiniMax-M3-NVFP4" | ||
| container: | ||
| image: "vllm/vllm-openai:nightly-5e35a6f4f9bbc217c599692157ca985c894373f7" | ||
| frameworks: | ||
| dynamo: "1.4.0.dev20260730" | ||
|
|
||
| dynamo: | ||
| version: "1.4.0.dev20260730" | ||
| install: true | ||
|
|
||
| health_check: | ||
| max_attempts: 2160 | ||
| interval_seconds: 10 | ||
|
|
||
| resources: | ||
| gpu_type: "gb300" | ||
| gpus_per_node: 4 | ||
| het_jobs: false | ||
| spread_workers: false | ||
| prefill_nodes: 1 | ||
| decode_nodes: 1 | ||
| prefill_workers: 1 | ||
| decode_workers: 1 | ||
| gpus_per_prefill: 4 | ||
| gpus_per_decode: 4 | ||
|
|
||
| infra: | ||
| etcd_nats_dedicated_node: false | ||
| nats_max_payload_mb: 32 | ||
|
|
||
| environment: | ||
| PYTHONHASHSEED: "0" | ||
|
|
||
| frontend: | ||
| type: dynamo | ||
| enable_multiple_frontends: false | ||
| nginx_session_affinity: true | ||
| nginx_session_affinity_header: "X-Dynamo-Session-ID" | ||
| args: | ||
| router-mode: "least-loaded" | ||
| router-session-affinity-ttl-secs: 1800 | ||
| env: | ||
| DYN_TOKENIZER: "fastokens" | ||
| DYN_TOKENIZER_CACHE_BYTES: "8589934592" | ||
| DYN_TCP_CONNECT_TIMEOUT: "120" | ||
|
|
||
| backend: | ||
| type: vllm | ||
| connector: null | ||
| dp_launch_mode: per_node | ||
| mooncake_kv_store: | ||
| env: | ||
| MC_ENABLE_DEST_DEVICE_AFFINITY: "1" | ||
| MC_STORE_CLIENT_METRIC: "1" | ||
| MC_STORE_CLIENT_METRIC_INTERVAL: "5" | ||
| MC_TE_METRIC: "0" | ||
| store_config: | ||
| metadata_server: "P2PHANDSHAKE" | ||
| global_segment_size: "200GB" | ||
| local_buffer_size: "4GB" | ||
| protocol: "rdma" | ||
| device_name: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" | ||
| mode: "embedded" | ||
| enable_offload: true | ||
| vllm_config: | ||
| prefill: | ||
| served-model-name: "nvidia/MiniMax-M3-NVFP4" | ||
| kv-cache-dtype: "fp8" | ||
| block-size: 128 | ||
| trust-remote-code: true | ||
| enable-prefix-caching: true | ||
| language-model-only: true | ||
| no-enable-flashinfer-autotune: true | ||
| reasoning-parser: "minimax_m3" | ||
| dyn-tool-call-parser: "minimax_m3" | ||
| dyn-reasoning-parser: "minimax_m3" | ||
| max-cudagraph-capture-size: 512 | ||
| max-num-batched-tokens: 16384 | ||
| stream-interval: 20 | ||
| gpu-memory-utilization: 0.9 | ||
| tensor-parallel-size: 4 | ||
| enable-expert-parallel: true | ||
| all2all-backend: "flashinfer_nvlink_one_sided" | ||
| attention-config: '{"backend":"FLASHINFER","use_trtllm_attention":true,"indexer_kv_dtype":"fp8"}' | ||
| speculative-config: '{"method":"eagle3","model":"Inferact/MiniMax-M3-EAGLE3-GQA","num_speculative_tokens":3,"attention_backend":"FLASH_ATTN"}' | ||
| kv-transfer-config: '{"kv_connector":"MultiConnector","kv_role":"kv_both","kv_load_failure_policy":"recompute","kv_connector_extra_config":{"connectors":[{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_connector_extra_config":{"backends":["UCX"],"enforce_handshake_compat":false,"read_validation_timeout":30.0}},{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_both","kv_connector_extra_config":{"lookup_async":true}}]}}' | ||
| enable-cumem-allocator: true | ||
| decode: | ||
| served-model-name: "nvidia/MiniMax-M3-NVFP4" | ||
| kv-cache-dtype: "fp8" | ||
| block-size: 128 | ||
| trust-remote-code: true | ||
| enable-prefix-caching: true | ||
| language-model-only: true | ||
| no-enable-flashinfer-autotune: true | ||
| reasoning-parser: "minimax_m3" | ||
| dyn-tool-call-parser: "minimax_m3" | ||
| dyn-reasoning-parser: "minimax_m3" | ||
| dyn-default-thinking-mode: "enabled" | ||
| max-cudagraph-capture-size: 512 | ||
| max-num-batched-tokens: 16384 | ||
| max-num-seqs: 1024 | ||
| stream-interval: 20 | ||
| gpu-memory-utilization: 0.9 | ||
| tensor-parallel-size: 4 | ||
| enable-expert-parallel: false | ||
| attention-config: '{"backend":"FLASHINFER","use_trtllm_attention":true,"indexer_kv_dtype":"fp8","minimax_m3_msa_decode_backend":"cutlass"}' | ||
| speculative-config: '{"method":"eagle3","model":"Inferact/MiniMax-M3-EAGLE3-GQA","num_speculative_tokens":3,"attention_backend":"FLASH_ATTN"}' | ||
| kv-transfer-config: '{"kv_connector":"MultiConnector","kv_role":"kv_both","kv_load_failure_policy":"fail","kv_connector_extra_config":{"connectors":[{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_connector_extra_config":{"backends":["UCX"],"enforce_handshake_compat":false,"read_validation_timeout":30.0}},{"kv_connector":"MooncakeStoreConnector","kv_role":"kv_consumer","kv_connector_extra_config":{"enable_lookup":false}}]}}' | ||
| enable-cumem-allocator: true | ||
| prefill_environment: &worker_environment | ||
| HF_HUB_CACHE: "/hf_hub_cache" | ||
| HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" | ||
| TRANSFORMERS_CACHE: "/hf_hub_cache" | ||
| VLLM_ENGINE_READY_TIMEOUT_S: "3600" | ||
| DYN_TCP_CONNECT_TIMEOUT: "120" | ||
| VLLM_FLOAT32_MATMUL_PRECISION: "high" | ||
| VLLM_FLASHINFER_ALLREDUCE_BACKEND: "trtllm" | ||
| VLLM_USE_NCCL_SYMM_MEM: "0" | ||
| VLLM_ALLREDUCE_USE_SYMM_MEM: "0" | ||
| VLLM_MOONCAKE_LOAD_RECV_THREADS: "20" | ||
| UCX_MEMTYPE_CACHE: "n" | ||
| UCX_CUDA_IPC_ENABLE_MNNVL: "y" | ||
| UCX_MODULE_DIR: "/usr/local/lib/python3.12/dist-packages/nixl_cu13.libs/ucx" | ||
| UCX_RNDV_PIPELINE_ERROR_HANDLING: "y" | ||
| NCCL_CUMEM_ENABLE: "1" | ||
| NCCL_MNNVL_ENABLE: "1" | ||
| NCCL_NVLS_ENABLE: "1" | ||
| NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" | ||
| decode_environment: | ||
| <<: *worker_environment | ||
| VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" | ||
|
|
||
| sbatch_directives: | ||
| cpus-per-task: "72" | ||
| mem: "0" | ||
|
|
||
| srun_options: | ||
| container-remap-root: "" | ||
|
|
||
| benchmark: | ||
| type: custom | ||
| command: "bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh" | ||
| env: | ||
| INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" | ||
| RESULT_DIR: "/logs/agentic" | ||
| PORT: "8000" | ||
| IS_MULTINODE: "true" | ||
| AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true" | ||
| AIPERF_EXTRA_INPUTS: "thinking:true" | ||
| AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" | ||
| AIPERF_SERVER_METRICS_COLLECTION_INTERVAL: "1.0" | ||
| HF_HUB_CACHE: "/hf_hub_cache" | ||
| WEKA_LOADER_OVERRIDE: "semianalysis_cc_traces_weka_062126" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔴 All 10 new gb300-fp4 MiniMax-M3 agentic/eval-agentic recipes set only
reasoning-parser: minimax_m3in prefill and decode, but omitdyn-tool-call-parser: minimax_m3anddyn-reasoning-parser: minimax_m3— args every existing MiniMax-M3 dynamo+vllm agentic recipe sets (e.g.gb200-fp4/agentic/disagg-1p1d-dep8-dep4-agentic.yamllines 71-73, 97-99). Without these, the Dynamo frontend falls back to default tool-call/reasoning parsing for an agentic-coding workload that depends on correct tool-call extraction, which will misparse MiniMax-M3 output (especially in the real-verification-evaltwins). Please add bothdyn-tool-call-parser: "minimax_m3"anddyn-reasoning-parser: "minimax_m3"to the prefill and decodevllm_configblocks in all 10 new files.Extended reasoning...
What the bug is: The 10 new
benchmarks/multi_node/srt-slurm-recipes/vllm/minimax-m3/agentic/gb300-fp4/*.yamlrecipes configure vLLM's engine-sidereasoning-parser: "minimax_m3"in both the prefill and decodevllm_configblocks, but never setdyn-tool-call-parserordyn-reasoning-parser. These twodyn-*keys are distinct, Dynamo-frontend-side directives — they tell the Dynamo frontend (not the vLLM engine) how to extract tool-call and reasoning content out of the raw model output stream before it's returned to the client/benchmark harness.reasoning-parseralone only configures vLLM's own internal parsing; it does not populate the Dynamo frontend's extraction path.\n\nWhere this diverges from precedent: Every existing MiniMax-M3 dynamo+vllm agentic recipe in this repo sets all three keys together, in both prefill and decode blocks. For example,gb200-fp4/agentic/disagg-1p1d-dep8-dep4-agentic.yamlsetsreasoning-parser,dyn-tool-call-parser, anddyn-reasoning-parser, all to"minimax_m3", at lines 71-73 (prefill) and 97-99 (decode). Grepping all sixgb200-fp4/agentic/*.yamlfiles (theagg-*anddisagg-*siblings) confirms the same triad in every one. Grepping the 10 new gb300-fp4 files fordyn-tool-call-parser/dyn-reasoning-parserreturns zero matches — onlyreasoning-parser(at line 83 prefill / line 103 decode in the representative1p1d-tep4-tp4-c1-agentic.yaml) is present.\n\nWhy nothing else catches this: There's no schema validation on these recipe YAMLs enforcing that a givenreasoning-parservalue must be paired with matchingdyn-*frontend args — the pairing is purely a convention followed by hand in every prior recipe. Nothing inlaunch_gb300-nv.shor the srt-slurm framework injects a default derived fromreasoning-parser; omitting thedyn-*keys just means the frontend uses whatever its built-in default parser is (likely none, or a generic one), not MiniMax-M3's actual tool-call format.\n\nImpact: These recipes exist specifically to benchmark an agentic-coding workload, where the benchmark harness needs to correctly extract tool calls from the model's output to measure/verify tool use. Withoutdyn-tool-call-parser: minimax_m3, the Dynamo frontend will fail to correctly delimit and extract MiniMax-M3's tool-call blocks, corrupting the agentic benchmark's traces. This is doubly important for the five*-eval-agentic.yamltwins, which run real MTP verification and rely on correctly-parsed tool calls to score correctness — a frontend parsing mismatch there would silently produce wrong eval results rather than an obvious crash.\n\nStep-by-step proof:\n1. Opengb200-fp4/agentic/disagg-1p1d-dep8-dep4-agentic.yaml(an existing, presumably-correct MiniMax-M3 dynamo+vllm agentic recipe) and look at the prefillvllm_configblock: it setsreasoning-parser: "minimax_m3",dyn-tool-call-parser: "minimax_m3", anddyn-reasoning-parser: "minimax_m3"together (lines 71-73); the decode block repeats the same triad (lines 97-99).\n2. Now open the new1p1d-tep4-tp4-c1-agentic.yamladded by this PR: the prefill block (around line 83) has onlyreasoning-parser: "minimax_m3"; the decode block (around line 103) has only the same single key.dyn-tool-call-parseranddyn-reasoning-parserdo not appear anywhere in the file.\n3. Repeating this diff across the other 9 new gb300-fp4 files (both agentic and eval-agentic twins for each of the 5 topologies) shows the identical pattern: zero occurrences of eitherdyn-*key.\n4. Sincereasoning-parseris vLLM-engine-scoped and thedyn-*keys are Dynamo-frontend-scoped (as evidenced by every other MiniMax-M3 recipe setting them independently and together), the frontend in these 10 new recipes has no MiniMax-M3-specific tool-call/reasoning extraction configured and falls back to its default behavior — which will misparse this model's actual output format.\n\nFix: Adddyn-tool-call-parser: "minimax_m3"anddyn-reasoning-parser: "minimax_m3"alongsidereasoning-parser: "minimax_m3"in both theprefillanddecodevllm_configblocks of all 10 new files, matching the established pattern in the gb200-fp4 agentic recipes.