{"record":{"id":"b692645f174ab30d","repo":"sgl-project/sglang","slug":"rank-must-be-positive-got-self-rank","errorCode":null,"errorMessage":"Rank must be positive, got {self.rank}","messagePattern":"Rank must be positive, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/layers/quantization/configs/nunchaku_config.py","lineNumber":147,"sourceCode":"\n    def __post_init__(self):\n        if self.group_size is None:\n            if self.precision == \"nvfp4\":\n                self.group_size = 16\n            elif self.precision == \"int4\":\n                self.group_size = 64\n            else:\n                raise ValueError(\n                    f\"Invalid precision: {self.precision}. Must be 'int4' or 'nvfp4'\"\n                )\n\n        if self.precision not in [\"int4\", \"nvfp4\"]:\n            raise ValueError(\n                f\"Invalid precision: {self.precision}. Must be 'int4' or 'nvfp4'\"\n            )\n\n        if self.rank <= 0:\n            raise ValueError(f\"Rank must be positive, got {self.rank}\")\n\n    @classmethod\n    def from_dict(cls, config_dict: dict) -> \"NunchakuConfig\":\n        \"\"\"Create configuration from dictionary.\"\"\"\n        return cls(**config_dict)\n\n    def to_dict(self) -> dict:\n        \"\"\"Convert configuration to dictionary.\"\"\"\n        return {\n            \"precision\": self.precision,\n            \"rank\": self.rank,\n            \"group_size\": self.group_size,\n            \"act_unsigned\": self.act_unsigned,\n            \"transformer_weights_path\": self.transformer_weights_path,\n        }\n\n    @classmethod\n    def from_pretrained(cls, model_path: str) -> Optional[\"NunchakuConfig\"]:","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/layers/quantization/configs/nunchaku_config.py#L129-L165","documentation":"NunchakuConfig.__post_init__ requires rank to be a positive integer; rank <= 0 (including 0 or negatives, and None comparisons depending on type) raises immediately.","triggerScenarios":"NunchakuConfig(precision='int4', rank=0) or rank=-1, typically when rank is taken from an unset env var / CLI default of 0.","commonSituations":"rank computed as world_size - 1 for single-process runs (0); forgetting to initialize a distributed rank; passing device index instead of rank.","solutions":["Pass the actual distributed rank (>= 1 for this config, or 1 for single-GPU)","Default rank to 1 when running without torch.distributed initialization"],"exampleFix":"# before\ncfg = NunchakuConfig(precision=\"int4\", rank=dist.get_rank() - 1)\n\n# after\nimport os\ncfg = NunchakuConfig(precision=\"int4\", rank=int(os.environ.get(\"RANK\", \"1\")) or 1)","handlingStrategy":"validation","validationCode":"rank = int(os.environ.get(\"RANK\", \"1\"))\nif rank <= 0:\n    rank = 1\ncfg = NunchakuConfig(precision=\"int4\", rank=rank)","typeGuard":"def is_valid_rank(rank: object) -> bool:\n    return isinstance(rank, int) and not isinstance(rank, bool) and rank > 0","tryCatchPattern":null,"preventionTips":["Never derive rank as world_size - 1 for single process","Default rank to 1 when torch.distributed is not initialized"],"tags":["distributed","config-validation","nunchaku"],"backgroundTag":"invalid-config-value","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}