{"record":{"id":"7f1216d31239f148","repo":"vllm-project/vllm","slug":"elastic-ep-is-not-supported-with-pipeline-parallel","errorCode":null,"errorMessage":"Elastic EP is not supported with pipeline parallelism (pipeline_parallel_size={self.pipeline_parallel_size}).","messagePattern":"Elastic EP is not supported with pipeline parallelism \\(pipeline_parallel_size=(.+?)\\)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"vllm/config/parallel.py","lineNumber":847,"sourceCode":"        return hash_factors(factors)\n\n    def __post_init__(self) -> None:\n        # Continue with the rest of the initialization\n        self.world_size = (\n            self.pipeline_parallel_size\n            * self.tensor_parallel_size\n            * self.prefill_context_parallel_size\n        )\n\n        if self.distributed_executor_backend == \"external_launcher\":\n            logger.info(\"Using external launcher for distributed inference.\")\n            self.world_size *= self.data_parallel_size\n\n        if self.enable_elastic_ep:\n            if not self.enable_eplb:\n                raise ValueError(\"Elastic EP is only supported with enable_eplb=True.\")\n            if self.pipeline_parallel_size > 1:\n                raise ValueError(\n                    \"Elastic EP is not supported with pipeline parallelism \"\n                    f\"(pipeline_parallel_size={self.pipeline_parallel_size}).\"\n                )\n            if self.data_parallel_external_lb or self.data_parallel_hybrid_lb:\n                raise NotImplementedError(\n                    \"Elastic EP is not compatible with data_parallel_external_lb \"\n                    \"or data_parallel_hybrid_lb. Elastic EP relies on a single API \"\n                    \"server and core client to coordinate scale up/down.\"\n                )\n            if self.eplb_config.use_async:\n                from vllm.distributed.nixl_utils import is_nixl_available\n\n                if not is_nixl_available():\n                    raise ValueError(\n                        \"Elastic EP with async EPLB requires the NIXL \"\n                        \"package. Either install NIXL or set \"\n                        \"--eplb-config.use_async=false.\"\n                    )","sourceCodeStart":829,"sourceCodeEnd":865,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/vllm/config/parallel.py#L829-L865","documentation":"Elastic EP coordinates scale-up/scale-down across a single pipeline; pipeline stages cannot be independently rescaled, so ParallelConfig rejects elastic EP with pipeline_parallel_size > 1.","triggerScenarios":"Combining --enable-elastic-ep with --pipeline-parallel-size 2 or more.","commonSituations":"Large MoE models that traditionally need PP to fit in memory, with operators attempting to add elastic EP on top; migrating a PP deployment to elastic scaling without removing PP.","solutions":["Remove pipeline parallelism (set --pipeline-parallel-size 1) and fit the model via TP/EP instead.","Or keep PP and drop --enable-elastic-ep, using static capacity planning instead of dynamic scaling."],"exampleFix":"# before\nvllm serve big-moe --pipeline-parallel-size 2 --enable-elastic-ep\n# after\nvllm serve big-moe --pipeline-parallel-size 1 --tensor-parallel-size 8 --enable-elastic-ep","handlingStrategy":"validation","validationCode":"def elastic_ep_pp_valid(enable_elastic_ep: bool, pp: int) -> bool:\n    return not enable_elastic_ep or pp <= 1\n\nassert elastic_ep_pp_valid(True, 1)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Plan MoE memory fit via TP/EP instead of PP when elastic scaling is a requirement.","Document per-model which parallel strategy is allowed so operators do not stack PP onto elastic EP."],"tags":["elastic-ep","pipeline-parallel","moe","configuration"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}