Summary
On https://recipes.vllm.ai/zai-org/GLM-5.2?strategy=multi_node_tp_pp (H100 · Multi-Node TP + Pipeline Parallel · FP8), the synthesized launch command combines --pipeline-parallel-size 2 with --speculative-config '{"method":"mtp","num_speculative_tokens":5}'. This combination cannot start on any vLLM version — it fails during config validation with:
NotImplementedError: Pipeline parallelism is not supported for this model.
Supported models implement the `SupportsPP` interface.
The error is misleading: the main model (GlmMoeDsaForCausalLM) does support PP (it declares SupportsPP and its forward accepts intermediate_tensors). The failure comes from the MTP draft model: with method="mtp", SpeculativeConfig.hf_config_override rewrites the draft architecture to DeepSeekMTPModel, and DeepSeekMTP (vllm/model_executor/models/deepseek_mtp.py) neither declares SupportsPP nor implements make_empty_intermediate_tensors / a PP-capable forward. SpeculativeConfig._verify_args calls draft_model_config.verify_with_parallel_config(draft_parallel_config), and create_draft_parallel_config forwards the target's pipeline_parallel_size to the draft, so the PP gate is hit on the draft class.
Reproduction
Exact command from the recipe page (2 nodes, head node tab):
vllm serve zai-org/GLM-5.2-FP8 \
--tensor-parallel-size 8 \
--pipeline-parallel-size 2 \
--nnodes 2 \
--node-rank 0 \
--master-addr $HEAD_IP \
--kv-cache-dtype fp8 \
--tool-call-parser glm47 \
--enable-auto-tool-choice \
--reasoning-parser glm45 \
--speculative-config '{"method":"mtp","num_speculative_tokens":5}'
Minimal config-level repro (no GPUs needed beyond one node for ModelConfig):
from vllm.config import ModelConfig, ParallelConfig, SpeculativeConfig
mc = ModelConfig(model=<GLM-5.2 path>, runner="generate", trust_remote_code=True)
pc = ParallelConfig(pipeline_parallel_size=2, tensor_parallel_size=8,
distributed_executor_backend="ray")
sc = SpeculativeConfig(target_model_config=mc, target_parallel_config=pc,
model=<GLM-5.2 path>, method="mtp", num_speculative_tokens=5)
# → NotImplementedError: Pipeline parallelism is not supported for this model.
Verified across versions
I diffed the entire failing path between releases — it is byte-equivalent, so the recipe command fails on all of:
- v0.23.0 (the version the GLM-5.2 recipe pins:
min_vllm_version: 0.23.0, docker v0.23.0)
- v0.24.0
- latest main (as of 2026-08-20): the draft class moved to
DeepseekV32MTPModel (vllm/models/deepseek_v32/nvidia/mtp.py), which still has no SupportsPP / make_empty_intermediate_tensors. Both MTP classes gained an intermediate_tensors forward parameter upstream, but the body ignores it — PP for MTP drafts is not implemented.
Also note upstream main explicitly rejects dspark + PP at runtime (vllm/v1/worker/gpu/model_runner.py: f"{method} with pipeline parallel is not supported." for eagle3/dflash/dspark), which suggests spec-decode methods with separate draft models are generally not expected to work under PP yet.
Suggested fix
The recipe synthesizer combines compatible_strategies: [multi_node_tp_pp, ...] with the opt-in spec_decoding feature without checking mutual exclusibility. Options:
- When the selected strategy involves
--pipeline-parallel-size > 1 and the model's spec-decoding method uses a separate draft model (mtp, dspark, eagle-family), drop --speculative-config from the synthesized command (or grey out the feature with a tooltip explaining why).
- Add a per-model
strategy_overrides entry for GLM-5.2 excluding multi_node_tp_pp / pd_cluster when spec_decoding is enabled (finer-grained than removing the strategy entirely, since the main model alone does support PP).
Environment details: reproduced on a 2-node A100 cluster with GLM-5.2 (zai-org checkpoints, config glm_moe_dsa); config-level repro does not depend on GPU arch.
Found while debugging a production deployment; happy to provide more traces if useful. AI assistance was used in the investigation.
Summary
On https://recipes.vllm.ai/zai-org/GLM-5.2?strategy=multi_node_tp_pp (H100 · Multi-Node TP + Pipeline Parallel · FP8), the synthesized launch command combines
--pipeline-parallel-size 2with--speculative-config '{"method":"mtp","num_speculative_tokens":5}'. This combination cannot start on any vLLM version — it fails during config validation with:The error is misleading: the main model (
GlmMoeDsaForCausalLM) does support PP (it declaresSupportsPPand its forward acceptsintermediate_tensors). The failure comes from the MTP draft model: withmethod="mtp",SpeculativeConfig.hf_config_overriderewrites the draft architecture toDeepSeekMTPModel, andDeepSeekMTP(vllm/model_executor/models/deepseek_mtp.py) neither declaresSupportsPPnor implementsmake_empty_intermediate_tensors/ a PP-capable forward.SpeculativeConfig._verify_argscallsdraft_model_config.verify_with_parallel_config(draft_parallel_config), andcreate_draft_parallel_configforwards the target'spipeline_parallel_sizeto the draft, so the PP gate is hit on the draft class.Reproduction
Exact command from the recipe page (2 nodes, head node tab):
Minimal config-level repro (no GPUs needed beyond one node for ModelConfig):
Verified across versions
I diffed the entire failing path between releases — it is byte-equivalent, so the recipe command fails on all of:
min_vllm_version: 0.23.0, dockerv0.23.0)DeepseekV32MTPModel(vllm/models/deepseek_v32/nvidia/mtp.py), which still has noSupportsPP/make_empty_intermediate_tensors. Both MTP classes gained anintermediate_tensorsforward parameter upstream, but the body ignores it — PP for MTP drafts is not implemented.Also note upstream main explicitly rejects
dspark+ PP at runtime (vllm/v1/worker/gpu/model_runner.py:f"{method} with pipeline parallel is not supported."for eagle3/dflash/dspark), which suggests spec-decode methods with separate draft models are generally not expected to work under PP yet.Suggested fix
The recipe synthesizer combines
compatible_strategies: [multi_node_tp_pp, ...]with the opt-inspec_decodingfeature without checking mutual exclusibility. Options:--pipeline-parallel-size > 1and the model's spec-decoding method uses a separate draft model (mtp, dspark, eagle-family), drop--speculative-configfrom the synthesized command (or grey out the feature with a tooltip explaining why).strategy_overridesentry for GLM-5.2 excludingmulti_node_tp_pp/pd_clusterwhen spec_decoding is enabled (finer-grained than removing the strategy entirely, since the main model alone does support PP).Environment details: reproduced on a 2-node A100 cluster with GLM-5.2 (zai-org checkpoints, config
glm_moe_dsa); config-level repro does not depend on GPU arch.Found while debugging a production deployment; happy to provide more traces if useful. AI assistance was used in the investigation.