{"record":{"id":"898067bbd04e6a52","repo":"sgl-project/sglang","slug":"rollout-noise-level-must-be-non-negative-got-noi","errorCode":null,"errorMessage":"rollout_noise_level must be non-negative, got {noise!r}","messagePattern":"rollout_noise_level must be non-negative, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/configs/post_training/rl_rollout.py","lineNumber":34,"sourceCode":"\n@dataclass\nclass RLRolloutArgs:\n    \"\"\"Rollout (log-prob trajectory) options used by SamplingParams and APIs.\"\"\"\n\n    rollout: bool = False\n    rollout_sde_type: str = \"sde\"\n    rollout_noise_level: float = 0.7\n    rollout_log_prob_no_const: bool = False\n    rollout_debug_mode: bool = False\n\n    def validate(self) -> None:\n        noise = self.rollout_noise_level\n        if isinstance(noise, bool) or not isinstance(noise, (int, float)):\n            raise ValueError(f\"rollout_noise_level must be a number, got {noise!r}\")\n        if not math.isfinite(float(noise)):\n            raise ValueError(f\"rollout_noise_level must be finite, got {noise!r}\")\n        if float(noise) < 0.0:\n            raise ValueError(f\"rollout_noise_level must be non-negative, got {noise!r}\")\n\n        if self.rollout_sde_type not in _VALID_ROLLOUT_SDE_TYPES:\n            raise ValueError(\n                f\"rollout_sde_type must be one of {_VALID_ROLLOUT_SDE_TYPES}, \"\n                f\"got {self.rollout_sde_type!r}\"\n            )\n\n    @classmethod\n    def validate_sampling_params(cls, params: Any) -> None:\n        \"\"\"Validate rollout fields on a duck-typed object (e.g. ``SamplingParams``).\n\n        Mirrors how ``ServerArgs`` runs ``NunchakuSVDQuantArgs.validate()`` from\n        ``_adjust_quant_config`` instead of inlining checks in a large validator.\n        \"\"\"\n        cls(\n            rollout=params.rollout,\n            rollout_sde_type=params.rollout_sde_type,\n            rollout_noise_level=params.rollout_noise_level,","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/configs/post_training/rl_rollout.py#L16-L52","documentation":"rollout_noise_level represents noise magnitude and must be >= 0.0; negative values are rejected because negative noise variance is undefined in the rollout SDE.","triggerScenarios":"Setting rollout_noise_level to any negative number (e.g. -0.1, or a negated value from a sign error) in sampling params; validate() runs during validate_sampling_params and raises immediately.","commonSituations":"Sign flips in hyperparameter sweeps; configs generated from subtraction (base - delta) that dip below zero; mirroring a 'noise reduction' semantic that the field does not have.","solutions":["Set a non-negative value: 0.0 disables the noise, larger values increase it","In sweep code, clamp: max(0.0, computed_noise)","Re-read the field's semantics: to reduce noise, lower the value toward 0 rather than below it"],"exampleFix":"# before\nparams.rollout_noise_level = base - delta  # can go negative\n\n# after\nparams.rollout_noise_level = max(0.0, base - delta)","handlingStrategy":"validation","validationCode":"assert params.rollout_noise_level >= 0.0, \"rollout_noise_level must be >= 0\"","typeGuard":"def is_nonneg_noise(v) -> bool:\n    return isinstance(v, (int, float)) and not isinstance(v, bool) and v >= 0","tryCatchPattern":null,"preventionTips":["Clamp sweep-derived values with max(0.0, x)","Remember 0.0 means 'no noise', not negative values"],"tags":["rl-rollout","sampling-params","range-validation"],"backgroundTag":"config-value-out-of-range","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}