{"record":{"id":"8efe91cca2ded7c6","repo":"sgl-project/sglang","slug":"gpu-ids-contains-duplicate-gpu-ids-parsed","errorCode":null,"errorMessage":"--gpu-ids contains duplicate GPU ids: {parsed}","messagePattern":"--gpu-ids contains duplicate GPU ids: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/utils/common.py","lineNumber":109,"sourceCode":"    for value in values:\n        tokens.extend(part for part in str(value).replace(\",\", \" \").split() if part)\n    if not tokens:\n        return []\n\n    parsed: list[int] = []\n    for token in tokens:\n        try:\n            gpu_id = int(token)\n        except ValueError as exc:\n            raise ValueError(\n                f\"--gpu-ids contains a non-integer GPU id: {token}\"\n            ) from exc\n        if gpu_id < 0:\n            raise ValueError(f\"--gpu-ids GPU ids must be non-negative: {gpu_id}\")\n        parsed.append(gpu_id)\n\n    if len(set(parsed)) != len(parsed):\n        raise ValueError(f\"--gpu-ids contains duplicate GPU ids: {parsed}\")\n    return parsed\n\n\ndef parse_size(size: str) -> tuple[int | None, int | None]:\n    try:\n        parts = size.lower().replace(\" \", \"\").split(\"x\")\n        if len(parts) != 2:\n            raise ValueError\n        return int(parts[0]), int(parts[1])\n    except ValueError:\n        return None, None\n\n\ndef parse_tcp_host_port(value: str | None, field_name: str) -> tuple[str, int]:\n    if value is None or not str(value).strip():\n        raise ValueError(f\"{field_name} is required\")\n\n    addr = str(value).strip()","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/utils/common.py#L91-L127","documentation":"Thrown by normalize_gpu_ids when the same GPU id appears more than once in --gpu-ids, detected via len(set(parsed)) != len(parsed). Duplicate ids would otherwise cause double-binding to one device.","triggerScenarios":"Passing --gpu-ids \"0,0,1\" or a duplicated id produced by concatenating config lists.","commonSituations":"Building the gpu list programmatically (e.g. list_a + list_b) without deduplication; shell variable accidentally repeated.","solutions":["Deduplicate the list before passing it: sorted(set(ids))","Check how the --gpu-ids value was assembled (concatenated lists are a common cause)","Pass each GPU exactly once, e.g. --gpu-ids 0,1,2"],"exampleFix":"# before\n--gpu-ids 0,1,0\n# after\n--gpu-ids 0,1","handlingStrategy":"validation","validationCode":"tokens = [t for t in gpu_ids_str.split(\",\")]\nassert len(set(tokens)) == len(tokens), \"duplicate gpu ids\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Deduplicate with sorted(set(...)) whenever building gpu lists programmatically"],"tags":["gpu","cli-arguments","validation","duplicates"],"backgroundTag":"invalid-cli-argument","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}