{"record":{"id":"6ab697eaa863f2f7","repo":"sgl-project/sglang","slug":"no-striding-allowed-for-non-symmetric-convolutions","errorCode":null,"errorMessage":"No striding allowed for non-symmetric convolutions!","messagePattern":"No striding allowed for non-symmetric convolutions!","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/models/phi4mm_utils.py","lineNumber":939,"sourceCode":"        in_channels: int,\n        out_channels: int,\n        kernel_size: int,\n        stride: int = 1,\n        padding: Union[str, int] = 0,\n        dilation: int = 1,\n        groups: int = 1,\n        bias: bool = True,\n        padding_mode: str = \"zeros\",\n        device=None,\n        dtype=None,\n    ) -> None:\n        self.cache_drop_size = None\n        if padding is None:\n            self._left_padding = kernel_size - 1\n            self._right_padding = stride - 1\n        else:\n            if stride != 1 and padding != kernel_size - 1:\n                raise ValueError(\"No striding allowed for non-symmetric convolutions!\")\n            if isinstance(padding, int):\n                self._left_padding = padding\n                self._right_padding = padding\n            elif (\n                isinstance(padding, list)\n                and len(padding) == 2\n                and padding[0] + padding[1] == kernel_size - 1\n            ):\n                self._left_padding = padding[0]\n                self._right_padding = padding[1]\n            else:\n                raise ValueError(f\"Invalid padding param: {padding}!\")\n\n        self._max_cache_len = self._left_padding\n\n        super().__init__(\n            in_channels=in_channels,\n            out_channels=out_channels,","sourceCodeStart":921,"sourceCodeEnd":957,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/models/phi4mm_utils.py#L921-L957","documentation":"CausalConv1D rejects configurations where a custom padding is combined with stride > 1 unless the padding is exactly kernel_size - 1 (fully causal padding). Strided non-symmetric convolutions would misalign the causal cache, so __init__ fails fast with this ValueError.","triggerScenarios":"Constructing CausalConv1D with padding != None and stride > 1 where padding != kernel_size - 1 — e.g. stride=2, kernel_size=4, padding=1.","commonSituations":"Building custom downsampling conformer encoders (e.g. dw_striding subsampling) with hand-tuned padding; porting conv configs from non-causal codebases where 'same' padding is common.","solutions":["Set padding=None to let the module compute causal padding (_left=kernel_size-1, _right=stride-1)","Or keep stride=1 if you must pass custom padding","Or use padding exactly equal to kernel_size - 1 when striding"],"exampleFix":"# before\nCausalConv1D(in_ch, out_ch, kernel_size=4, stride=2, padding=1)  # ValueError\n# after\nCausalConv1D(in_ch, out_ch, kernel_size=4, stride=2, padding=None)","handlingStrategy":"validation","validationCode":"if padding is not None:\n    assert stride == 1 or padding == kernel_size - 1, \"causal conv forbids custom padding with stride>1\"","typeGuard":"def is_valid_causal_conv1d_padding(kernel_size: int, stride: int, padding) -> bool:\n    if padding is None:\n        return True\n    if stride != 1:\n        return padding == kernel_size - 1\n    return padding is not None","tryCatchPattern":null,"preventionTips":["Prefer padding=None for causal convs","Compute asymmetric padding against kernel_size - 1, never use 'same'"],"tags":["convolution","causal","stride","padding","phi4"],"backgroundTag":"invalid-convolution-padding","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}