{"record":{"id":"2287d76e5a637e56","repo":"vllm-project/vllm","slug":"elastic-ep-is-only-supported-with-enable-eplb-true","errorCode":null,"errorMessage":"Elastic EP is only supported with enable_eplb=True.","messagePattern":"Elastic EP is only supported with enable_eplb=True\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"vllm/config/parallel.py","lineNumber":845,"sourceCode":"\n        factors = get_hash_factors(self, ignored_factors)\n        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 \"","sourceCodeStart":827,"sourceCodeEnd":863,"githubUrl":"https://github.com/vllm-project/vllm/blob/c794754062d49a8fdb63ab3c5215b488b865030c/vllm/config/parallel.py#L827-L863","documentation":"Elastic expert parallelism (elastic EP) dynamically rescales the EP group and depends on EPLB's redundant-expert machinery to redistribute experts. ParallelConfig therefore requires enable_eplb=True when enable_elastic_ep is set.","triggerScenarios":"Passing --enable-elastic-ep without --enable-eplb.","commonSituations":"Enabling elastic scaling for a MoE deployment while treating EPLB as an optional optimization; flag-order confusion in long launcher scripts.","solutions":["Add --enable-eplb (and its prerequisites: --enable-expert-parallel, TP/PCP/DP > 1, CUDA/ROCm).","Or drop --enable-elastic-ep if dynamic EP rescaling is not required."],"exampleFix":"# before\nvllm serve model --enable-elastic-ep\n# after\nvllm serve model --enable-expert-parallel --enable-eplb --enable-elastic-ep","handlingStrategy":"validation","validationCode":"def elastic_ep_valid(enable_elastic_ep: bool, enable_eplb: bool) -> bool:\n    return not enable_elastic_ep or enable_eplb\n\nassert elastic_ep_valid(True, True)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat --enable-eplb as mandatory prefix for any elastic-EP flag group.","Automate the prerequisite chain: EP -> EPLB -> elastic EP, asserting each layer in the launcher."],"tags":["elastic-ep","eplb","moe","configuration"],"backgroundTag":null,"analyzedSha":"c794754062d49a8fdb63ab3c5215b488b865030c","analyzedAt":"2026-08-14T21:17:39.825Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}