{"record":{"id":"19023d52c82ee020","repo":"sgl-project/sglang","slug":"routed-dp-rank-routed-dp-rank-out-of-range-0","errorCode":null,"errorMessage":"routed_dp_rank={routed_dp_rank} out of range [0, {dp_size})","messagePattern":"routed_dp_rank=(.+?) out of range \\[0, (.+?)\\)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/entrypoints/engine.py","lineNumber":354,"sourceCode":"            import warnings\n\n            warnings.warn(\n                \"'data_parallel_rank' is deprecated, use 'routed_dp_rank' instead.\",\n                DeprecationWarning,\n                stacklevel=3,\n            )\n            if routed_dp_rank is None:\n                routed_dp_rank = data_parallel_rank\n\n        if routed_dp_rank is not None:\n            dp_size = get_parallel().dp_size\n            if dp_size <= 1 and routed_dp_rank == 0:\n                logger.debug(\n                    f\"routed_dp_rank={routed_dp_rank} is ignored because dp_size={dp_size}\"\n                )\n                return None\n            if routed_dp_rank < 0 or routed_dp_rank >= dp_size:\n                raise ValueError(\n                    f\"routed_dp_rank={routed_dp_rank} out of range [0, {dp_size})\"\n                )\n\n        logger.debug(f\"routed_dp_rank: {routed_dp_rank}\")\n        return routed_dp_rank\n\n    def generate(\n        self,\n        # The input prompt. It can be a single prompt or a batch of prompts.\n        prompt: Optional[Union[List[str], str]] = None,\n        sampling_params: Optional[Union[List[Dict], Dict]] = None,\n        # The token ids for text; one can either specify text or input_ids.\n        input_ids: Optional[Union[List[List[int]], List[int]]] = None,\n        # The image input. It can be an image instance, file name, URL, or base64 encoded string.\n        # Can be formatted as:\n        # - Single image for a single request\n        # - List of images (one per request in a batch)\n        # - List of lists of images (multiple images per request)","sourceCodeStart":336,"sourceCodeEnd":372,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/engine.py#L336-L372","documentation":"When data-parallel routing is enabled (dp_size > 1), each generate call may pin a request to a specific DP rank via routed_dp_rank. The rank must fall in [0, dp_size); anything else is rejected with ValueError before dispatch. routed_dp_rank=None or 0 with dp_size<=1 is silently ignored.","triggerScenarios":"Passing routed_dp_rank=N to engine.generate(...) or engine.async_generate(...) with N < 0 or N >= server_args.dp_size (e.g. routed_dp_rank=2 with --dp-size 2).","commonSituations":"Hard-coding a DP rank from a previous deployment with different dp_size; computing ranks modulo the wrong parallel dimension (tp_size or ep_size instead of dp_size); loop off-by-one generating range(dp_size+1).","solutions":["Clamp/modulo the rank against dp_size at the call site: routed_dp_rank = user_rank % server_args.dp_size.","Read the rank from the engine's actual config (engine.server_args.dp_size) rather than a stale constant.","Pass routed_dp_rank=None (or omit it) when you don't need explicit rank pinning — the scheduler load-balances automatically."],"exampleFix":"# before\nout = engine.generate(prompts, sampling_params, routed_dp_rank=4)  # dp_size=2\n\n# after\ndp = engine.server_args.dp_size\nout = engine.generate(prompts, sampling_params, routed_dp_rank=4 % dp)","handlingStrategy":"validation","validationCode":"dp = engine.server_args.dp_size\nif routed_dp_rank is not None and not (0 <= routed_dp_rank < max(dp, 1)):\n    routed_dp_rank = routed_dp_rank % dp  # or raise your own clear error\nout = engine.generate(prompts, sampling_params, routed_dp_rank=routed_dp_rank)","typeGuard":"def valid_dp_rank(rank: int | None, dp_size: int) -> bool:\n    return rank is None or (isinstance(rank, int) and 0 <= rank < max(dp_size, 1))","tryCatchPattern":"try:\n    engine.generate(prompts, sp, routed_dp_rank=r)\nexcept ValueError as e:\n    if \"out of range\" in str(e):\n        r %= engine.server_args.dp_size\n        engine.generate(prompts, sp, routed_dp_rank=r)\n    else:\n        raise","preventionTips":["Derive ranks from engine.server_args.dp_size, never hard-code.","Always generate ranks with range(dp_size).","Treat rank pinning as optional; omit routed_dp_rank unless you need locality."],"tags":["sglang","data-parallel","argument-validation"],"backgroundTag":"index-out-of-range","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}