{"record":{"id":"5da7742e039833ed","repo":"sgl-project/sglang","slug":"sana-wm-triton-camera-gdn-backend-unavailable-pr","errorCode":null,"errorMessage":"SANA-WM Triton camera GDN backend unavailable: {precheck_reason}","messagePattern":"SANA-WM Triton camera GDN backend unavailable: (.+?)","errorType":"error_code","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/models/dits/sana_wm_components.py","lineNumber":2254,"sourceCode":"        beta: torch.Tensor,\n        decay: torch.Tensor,\n        HW: Tuple[int, int, int],\n    ) -> Optional[torch.Tensor]:\n        global _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON\n\n        precheck_reason = None\n        if self.gdn_backend == \"torch\":\n            precheck_reason = \"gdn_backend=torch\"\n        elif _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON is not None:\n            precheck_reason = _SANA_WM_TRITON_CAM_GDN_DISABLED_REASON\n        elif self.training or torch.is_grad_enabled():\n            precheck_reason = \"requires eval/inference mode\"\n        elif not q.is_cuda:\n            precheck_reason = \"requires CUDA tensor\"\n\n        if precheck_reason is not None:\n            if self.gdn_backend == \"triton\":\n                raise RuntimeError(\n                    \"SANA-WM Triton camera GDN backend unavailable: \"\n                    f\"{precheck_reason}\"\n                )\n            return None\n\n        q = q.float().contiguous()\n        k = k.float().contiguous()\n        v = v.float().contiguous()\n        reason = self._triton_cam_gdn_unavailable_reason(q, k, v, beta, decay, HW)\n        if reason is not None:\n            if self.gdn_backend == \"triton\":\n                raise RuntimeError(\n                    f\"SANA-WM Triton camera GDN backend unavailable: {reason}\"\n                )\n            return None\n\n        try:\n            from sglang.kernels.ops.diffusion import cam_scan_bidi_chunkwise","sourceCodeStart":2236,"sourceCodeEnd":2272,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/models/dits/sana_wm_components.py#L2236-L2272","documentation":"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.","triggerScenarios":"Setting gdn_backend='triton' and invoking the camera GDN with grad enabled, model in train mode, or CPU tensors.","commonSituations":"Running the camera branch under autograd/training; unit tests that forget eval(); forcing triton on a CPU-only box.","solutions":["Use gdn_backend='auto' to get automatic torch fallback","Wrap inference in torch.no_grad() and call .eval(); move tensors to CUDA","Verify q/k/v/beta/decay are CUDA tensors before calling"],"exampleFix":"# before\nmodel.gdn.gdn_backend = \"triton\"\nout = model(latent, t, ehs, camera_conditions=cam)\n# after\nmodel.eval()\nwith torch.no_grad():\n    out = model(latent.to(\"cuda\"), t, ehs, camera_conditions=cam.to(\"cuda\"))","handlingStrategy":"fallback","validationCode":"model.eval(); assert q.is_cuda; run under torch.no_grad() before forcing triton","typeGuard":null,"tryCatchPattern":"try:\n    out = cam_gdn(...)\nexcept RuntimeError as e:\n    if \"camera GDN backend unavailable\" in str(e) and \"eval\" in str(e):\n        model.eval(); out = cam_gdn(...)\n    else: raise","preventionTips":["Always eval()+no_grad in inference wrappers; use auto backend"],"tags":["sana-wm","gdn","triton","camera-branch","no-grad"],"backgroundTag":"kernel-backend-unavailable","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}