{"record":{"id":"abf71a600bca75c4","repo":"sgl-project/sglang","slug":"unexpected-a-shape-for-dense-a-shape","errorCode":null,"errorMessage":"Unexpected a shape for dense: {a.shape}","messagePattern":"Unexpected a shape for dense: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/kernels/ops/attention/cutedsl_kda.py","lineNumber":1382,"sourceCode":"    \"\"\"\n    if is_varlen_decode:\n        # Target: (N, HV, K) -- 3D\n        if a.dim() == 2 and a.shape == (N, HV * K):\n            return a.view(N, HV, K)\n        if a.dim() == 3 and a.shape == (N, HV, K):\n            return a  # already correct\n        if a.dim() == 4 and a.shape == (1, N, HV, K):\n            return a.squeeze(0)  # remove leading dim\n        raise ValueError(f\"Unexpected a shape for varlen: {a.shape}\")\n    else:\n        # Target: (N, 1, HV, K) -- 4D\n        if a.dim() == 2 and a.shape == (N, HV * K):\n            return a.view(N, 1, HV, K)\n        if a.dim() == 3 and a.shape == (N, HV, K):\n            return a.unsqueeze(1)\n        if a.dim() == 4 and a.shape == (N, 1, HV, K):\n            return a\n        raise ValueError(f\"Unexpected a shape for dense: {a.shape}\")\n\n\ndef cutedsl_fused_sigmoid_gating_kda_update(\n    A_log: torch.Tensor,\n    dt_bias: torch.Tensor,\n    q: torch.Tensor,\n    k: torch.Tensor,\n    v: torch.Tensor,\n    a: torch.Tensor,\n    b: torch.Tensor,\n    initial_state_source: torch.Tensor,\n    initial_state_indices: torch.Tensor,\n    cu_seqlens: Optional[torch.Tensor] = None,\n    scale: Optional[float] = None,\n    use_qk_l2norm_in_kernel: bool = True,\n    softplus_beta: float = 1.0,\n    softplus_threshold: float = 20.0,\n) -> torch.Tensor:","sourceCodeStart":1364,"sourceCodeEnd":1400,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/kernels/ops/attention/cutedsl_kda.py#L1364-L1400","documentation":"For dense (non-varlen) decode, _normalize_kda_a accepts `a` only as (N, HV*K) 2D, (N, HV, K) 3D (unsqueezed to (N,1,HV,K)), or exactly (N, 1, HV, K) 4D. Other shapes raise ValueError('Unexpected a shape for dense: ...').","triggerScenarios":"Calling the KDA fused update in dense mode with a varlen-style tensor like (1, N, HV, K) (extra leading batch dim), or an N dimension that doesn't match the declared token/batch count.","commonSituations":"Reusing a varlen-prepared `a` tensor in the dense path; batch schedulers that prepend a size-1 dimension during scheduling; head-count mismatch between `a` layout (HV*K fused vs HV,K) and the passed HV/K values.","solutions":["If a is (1, N, HV, K), squeeze dim 0 to get (N, HV, K)","Verify a.shape == (N, HV, K) or (N, HV*K) with the same N, HV, K passed to the kernel","Centralize the reshape in one helper so dense and varlen paths can't diverge"],"exampleFix":"# before (dense): a shape (1, N, HV, K) -> ValueError\n# after\na = a.squeeze(0)  # -> (N, HV, K), then kernel unsqueezes to (N,1,HV,K)\nupdate = cutedsl_fused_sigmoid_gating_kda_update(..., a=a, ...)","handlingStrategy":"validation","validationCode":"assert a.shape in [(N, HV*K), (N, HV, K), (N, 1, HV, K)], f'a shape {a.shape}'","typeGuard":"def is_valid_dense_a(a, N: int, HV: int, K: int) -> bool:\n    return a.shape in [(N, HV*K), (N, HV, K), (N, 1, HV, K)]","tryCatchPattern":null,"preventionTips":["Squeeze size-1 leading dims from scheduler outputs before the dense path","Assert a.shape[0] == N right before the kernel call"],"tags":["kda","dense-decode","shape-validation","cutedsl"],"backgroundTag":"tensor-rank-validation","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}