sgl-project/sglang · error · ValueError

SANA-WM generator list length must match latent batch size;

Error message

SANA-WM generator list length must match latent batch size; got {len(generator)} generators for batch {shape[0]}.

What it means

Raised by _prepare_noise_latents when a list of generators has length > 1 but != latent batch size shape[0]. Per-sample reproducible noise requires one generator per sample.

Source

Thrown at python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/sana_wm/base.py:1171

    def _prepare_noise_latents(
        self,
        shape: tuple,
        dtype: torch.dtype,
        device: torch.device,
        generator: (
            torch.Generator | list[torch.Generator] | tuple[torch.Generator, ...]
        ),
    ) -> torch.Tensor:
        if isinstance(generator, (list, tuple)):
            if not generator:
                raise ValueError("SANA-WM generator list must not be empty.")
            if len(generator) == 1:
                return randn_tensor(
                    shape, generator=generator[0], device=device, dtype=dtype
                )
            if len(generator) != shape[0]:
                raise ValueError(
                    "SANA-WM generator list length must match latent batch size; "
                    f"got {len(generator)} generators for batch {shape[0]}."
                )
            sample_shape = (1, *shape[1:])
            return torch.cat(
                [
                    randn_tensor(
                        sample_shape,
                        generator=sample_generator,
                        device=device,
                        dtype=dtype,
                    )
                    for sample_generator in generator
                ],
                dim=0,
            )
        return randn_tensor(shape, generator=generator, device=device, dtype=dtype)

View on GitHub (pinned to 0132848349)

Solutions

  1. Build exactly one generator per sample: len(generators) == batch_size
  2. Or pass a single generator to share across the whole batch
  3. Derive generators from the same source that determined shape[0]

Example fix

# before
gens = gens[:3]  # batch is 4
# after
gens = [g for _, g in zip(range(batch), gens)]  # match batch size
Defensive patterns

Strategy: validation

Validate before calling

assert not isinstance(generator, (list, tuple)) or len(generator) in (1, shape[0])

Type guard

def generators_match(g, batch: int) -> bool:
    return not isinstance(g, (list, tuple)) or len(g) in (1, batch)

Prevention

When it happens

Trigger: Passing e.g. 3 generators for a latent tensor with batch 4 (or 2 for batch 1, which is not the single-generator shortcut).

Common situations: Request batch size changed after generators were built; seeds list filtered/deduplicated; off-by-one when slicing a generator list.

Related errors


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