{"record":{"id":"df5594c138746676","repo":"sgl-project/sglang","slug":"cos-and-sin-must-have-matching-s-d-2-shapes","errorCode":null,"errorMessage":"cos and sin must have matching [S, D/2] shapes","messagePattern":"cos and sin must have matching \\[S, D/2\\] shapes","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/kernels/ops/diffusion/rope/hunyuan_qkv_pack_triton.py","lineNumber":181,"sourceCode":"        raise ValueError(\"QKV tensors must have shape [B, S, H, D]\")\n    if any(not x.is_cuda or x.dtype != torch.bfloat16 for x in tensors):\n        raise ValueError(\"QKV tensors must be CUDA bfloat16 tensors\")\n    if any(x.device != img_q.device for x in tensors):\n        raise ValueError(\"QKV tensors must be on the same CUDA device\")\n    batch, img_tokens, num_heads, head_dim = img_q.shape\n    txt_tokens = txt_q.shape[1]\n    expected_img = (batch, img_tokens, num_heads, head_dim)\n    expected_txt = (batch, txt_tokens, num_heads, head_dim)\n    if any(tuple(x.shape) != expected_img for x in (img_q, img_k, img_v)):\n        raise ValueError(\"image QKV shapes must match\")\n    if any(tuple(x.shape) != expected_txt for x in (txt_q, txt_k, txt_v)):\n        raise ValueError(\"text QKV shapes must match\")\n    if any(x.stride(-1) != 1 for x in tensors):\n        raise ValueError(\"QKV last dimensions must be contiguous\")\n    if head_dim <= 0 or head_dim > 128 or head_dim % 2:\n        raise ValueError(\"head_dim must be positive, even, and <= 128\")\n    if cos.ndim != 2 or sin.ndim != 2 or cos.shape != sin.shape:\n        raise ValueError(\"cos and sin must have matching [S, D/2] shapes\")\n    if cos.shape[0] < img_tokens or cos.shape[1] != head_dim // 2:\n        raise ValueError(\"cos/sin shape does not cover image tokens and head_dim\")\n    if not cos.is_cuda or not sin.is_cuda or cos.stride(-1) != 1 or sin.stride(-1) != 1:\n        raise ValueError(\"cos and sin must be CUDA and last-dim contiguous\")\n    if cos.device != img_q.device or sin.device != img_q.device:\n        raise ValueError(\"QKV and cos/sin tensors must be on the same CUDA device\")\n\n    total_tokens = img_tokens + txt_tokens\n    storage = torch.empty(\n        (3, batch, total_tokens, num_heads, head_dim),\n        device=img_q.device,\n        dtype=img_q.dtype,\n    )\n    args = []\n    for x in tensors:\n        args.extend((x.stride(0), x.stride(1), x.stride(2)))\n    with torch.cuda.device(img_q.device):\n        _hunyuan_qkv_rope_pack_kernel[","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/kernels/ops/diffusion/rope/hunyuan_qkv_pack_triton.py#L163-L199","documentation":"The kernel requires cos and sin RoPE tables to both be 2-D with identical shapes of form [S, head_dim/2]. Mismatched or wrong-rank tables indicate a RoPE frequency table that doesn't match the packed layout the kernel expects.","triggerScenarios":"Passing cos/sin of different shapes, 1-D precomputed freqs, or 3-D broadcast tables to hunyuan_qkv_rope_pack.","commonSituations":"Reusing a half-split RoPE table (shape [S, head_dim]) meant for a different kernel, or cos built with head_dim columns instead of head_dim/2.","solutions":["Regenerate cos/sin as 2-D [max_seq, head_dim//2] tensors.","Ensure cos and sin come from the same computation so shapes match.","Check ndim: squeeze any leading batch dims if the table is [1, S, D/2]."],"exampleFix":"// before\ncos = freqs_cos.unsqueeze(0)  # [1, S, D/2], ndim=3\n// after\ncos = freqs_cos.squeeze(0)  # [S, D/2]\nsin = freqs_sin.squeeze(0)","handlingStrategy":"validation","validationCode":"assert cos.ndim == 2 and sin.ndim == 2 and cos.shape == sin.shape, (cos.shape, sin.shape)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build cos and sin from the same computation.","Keep RoPE tables 2-D [S, D/2]."],"tags":["rope","cos-sin","shape-validation"],"backgroundTag":"rope-frequency-table-shape-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}