sgl-project/sglang · error · ValueError

rollout_noise_level must be non-negative, got {noise!r}

Error message

rollout_noise_level must be non-negative, got {noise!r}

What it means

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.

Source

Thrown at python/sglang/multimodal_gen/configs/post_training/rl_rollout.py:34

@dataclass
class RLRolloutArgs:
    """Rollout (log-prob trajectory) options used by SamplingParams and APIs."""

    rollout: bool = False
    rollout_sde_type: str = "sde"
    rollout_noise_level: float = 0.7
    rollout_log_prob_no_const: bool = False
    rollout_debug_mode: bool = False

    def validate(self) -> None:
        noise = self.rollout_noise_level
        if isinstance(noise, bool) or not isinstance(noise, (int, float)):
            raise ValueError(f"rollout_noise_level must be a number, got {noise!r}")
        if not math.isfinite(float(noise)):
            raise ValueError(f"rollout_noise_level must be finite, got {noise!r}")
        if float(noise) < 0.0:
            raise ValueError(f"rollout_noise_level must be non-negative, got {noise!r}")

        if self.rollout_sde_type not in _VALID_ROLLOUT_SDE_TYPES:
            raise ValueError(
                f"rollout_sde_type must be one of {_VALID_ROLLOUT_SDE_TYPES}, "
                f"got {self.rollout_sde_type!r}"
            )

    @classmethod
    def validate_sampling_params(cls, params: Any) -> None:
        """Validate rollout fields on a duck-typed object (e.g. ``SamplingParams``).

        Mirrors how ``ServerArgs`` runs ``NunchakuSVDQuantArgs.validate()`` from
        ``_adjust_quant_config`` instead of inlining checks in a large validator.
        """
        cls(
            rollout=params.rollout,
            rollout_sde_type=params.rollout_sde_type,
            rollout_noise_level=params.rollout_noise_level,

View on GitHub (pinned to 0132848349)

Solutions

  1. Set a non-negative value: 0.0 disables the noise, larger values increase it
  2. In sweep code, clamp: max(0.0, computed_noise)
  3. Re-read the field's semantics: to reduce noise, lower the value toward 0 rather than below it

Example fix

# before
params.rollout_noise_level = base - delta  # can go negative

# after
params.rollout_noise_level = max(0.0, base - delta)
Defensive patterns

Strategy: validation

Validate before calling

assert params.rollout_noise_level >= 0.0, "rollout_noise_level must be >= 0"

Type guard

def is_nonneg_noise(v) -> bool:
    return isinstance(v, (int, float)) and not isinstance(v, bool) and v >= 0

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of sgl-project/sglang@0132848349 (2026-08-28). Data as JSON: /api/errors/898067bbd04e6a52. Report an issue: GitHub.