{"record":{"id":"f972b9b8ba2753f4","repo":"sgl-project/sglang","slug":"sinusoidspositionembedding-needs-even-channels-inp","errorCode":null,"errorMessage":"SinusoidsPositionEmbedding needs even channels input","messagePattern":"SinusoidsPositionEmbedding needs even channels input","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/models/qwen3_omni_moe.py","lineNumber":169,"sourceCode":"        hidden_states, _ = self.fc2(hidden_states)\n        hidden_states = residual + hidden_states\n\n        if hidden_states.dtype == torch.float16:\n            clamp_value = torch.finfo(hidden_states.dtype).max - 1000\n            hidden_states = torch.clamp(\n                hidden_states, min=-clamp_value, max=clamp_value\n            )\n\n        outputs = (hidden_states,)\n\n        return outputs\n\n\nclass SinusoidsPositionEmbedding(nn.Module):\n    def __init__(self, length, channels, max_timescale=10000):\n        super().__init__()\n        if channels % 2 != 0:\n            raise ValueError(\"SinusoidsPositionEmbedding needs even channels input\")\n        log_timescale_increment = np.log(max_timescale) / (channels // 2 - 1)\n        inv_timescales = torch.exp(\n            -log_timescale_increment * torch.arange(channels // 2).float()\n        )\n        scaled_time = (\n            torch.arange(length)[:, np.newaxis] * inv_timescales[np.newaxis, :]\n        )\n        self.register_buffer(\n            \"positional_embedding\",\n            torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], dim=1),\n            persistent=False,\n        )\n\n    def forward(self, seqlen: int):\n        return self.positional_embedding[:seqlen, :]\n\n\ndef _get_feat_extract_output_lengths(input_lengths):","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/models/qwen3_omni_moe.py#L151-L187","documentation":"SinusoidsPositionEmbedding builds sin/cos pairs, so the channel count must be even; odd channels make channels//2 arithmetic invalid.","triggerScenarios":"Constructing Qwen3-Omni MoE (audio encoder) with a config whose embedding channels value (e.g. audio hidden size) is odd.","commonSituations":"Custom or fine-tuned Qwen3-Omni config with an odd audio/vision embedding dimension.","solutions":["Correct config.json so the corresponding hidden size is even","Use the official Qwen3-Omni config values"],"exampleFix":"# before\nSinusoidsPositionEmbedding(length=1500, channels=767)\n# after\nSinusoidsPositionEmbedding(length=1500, channels=768)","handlingStrategy":"validation","validationCode":"assert channels % 2 == 0, f\"channels must be even, got {channels}\"","typeGuard":"def is_even(n: int) -> bool: return n % 2 == 0","tryCatchPattern":null,"preventionTips":["Keep embedding dims even in custom configs"],"tags":["qwen3-omni","embedding","shape-validation"],"backgroundTag":"odd-dimension-shape-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}