sgl-project/sglang · error · RuntimeError

SANA-WM Triton camera GDN backend unavailable: {precheck_rea

Error message

SANA-WM Triton camera GDN backend unavailable: {precheck_reason}

What it means

The camera-GDN Triton path runs prechecks (eval/inference mode, CUDA tensor). With gdn_backend='triton' forced, failing a precheck raises this RuntimeError; with auto it falls back by returning None.

Source

Thrown at python/sglang/multimodal_gen/runtime/models/dits/sana_wm_components.py:2254

        beta: torch.Tensor,
        decay: torch.Tensor,
        HW: Tuple[int, int, int],
    ) -> Optional[torch.Tensor]:
        global _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON

        precheck_reason = None
        if self.gdn_backend == "torch":
            precheck_reason = "gdn_backend=torch"
        elif _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON is not None:
            precheck_reason = _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON
        elif self.training or torch.is_grad_enabled():
            precheck_reason = "requires eval/inference mode"
        elif not q.is_cuda:
            precheck_reason = "requires CUDA tensor"

        if precheck_reason is not None:
            if self.gdn_backend == "triton":
                raise RuntimeError(
                    "SANA-WM Triton camera GDN backend unavailable: "
                    f"{precheck_reason}"
                )
            return None

        q = q.float().contiguous()
        k = k.float().contiguous()
        v = v.float().contiguous()
        reason = self._triton_cam_gdn_unavailable_reason(q, k, v, beta, decay, HW)
        if reason is not None:
            if self.gdn_backend == "triton":
                raise RuntimeError(
                    f"SANA-WM Triton camera GDN backend unavailable: {reason}"
                )
            return None

        try:
            from sglang.kernels.ops.diffusion import cam_scan_bidi_chunkwise

View on GitHub (pinned to 0132848349)

Solutions

  1. Use gdn_backend='auto' to get automatic torch fallback
  2. Wrap inference in torch.no_grad() and call .eval(); move tensors to CUDA
  3. Verify q/k/v/beta/decay are CUDA tensors before calling

Example fix

# before
model.gdn.gdn_backend = "triton"
out = model(latent, t, ehs, camera_conditions=cam)
# after
model.eval()
with torch.no_grad():
    out = model(latent.to("cuda"), t, ehs, camera_conditions=cam.to("cuda"))
Defensive patterns

Strategy: fallback

Validate before calling

model.eval(); assert q.is_cuda; run under torch.no_grad() before forcing triton

Try / catch

try:
    out = cam_gdn(...)
except RuntimeError as e:
    if "camera GDN backend unavailable" in str(e) and "eval" in str(e):
        model.eval(); out = cam_gdn(...)
    else: raise

Prevention

When it happens

Trigger: Setting gdn_backend='triton' and invoking the camera GDN with grad enabled, model in train mode, or CPU tensors.

Common situations: Running the camera branch under autograd/training; unit tests that forget eval(); forcing triton on a CPU-only box.

Related errors


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