{"record":{"id":"f97fbf7007db9ce3","repo":"sgl-project/sglang","slug":"the-original-encoder-only-has-num-hidden-layers-f97fbf","errorCode":null,"errorMessage":"The original encoder only has {num_hidden_layers} layers, but you requested {len(self.encoder.layers)} layers.","messagePattern":"The original encoder only has (.+?) layers, but you requested (.+?) layers\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/models/clip.py","lineNumber":457,"sourceCode":"\n        self.config = config\n        embed_dim = config.hidden_size\n\n        self.embeddings = CLIPVisionEmbeddings(config)\n\n        # NOTE: This typo of \"layrnorm\" is not fixed on purpose to match\n        # the original transformers code and name of the model weights.\n        self.pre_layrnorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)\n\n        self.encoder = CLIPEncoder(\n            config=config,\n            quant_config=quant_config,\n            prefix=add_prefix(\"encoder\", prefix),\n        )\n\n        num_hidden_layers = config.num_hidden_layers\n        if len(self.encoder.layers) > config.num_hidden_layers:\n            raise ValueError(\n                f\"The original encoder only has {num_hidden_layers} \"\n                f\"layers, but you requested {len(self.encoder.layers)} layers.\"\n            )\n\n        self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)\n\n    @property\n    def device(self) -> torch.device:\n        return self.encoder.layers[0].layer_norm1.weight.device\n\n    def forward(\n        self,\n        pixel_values: torch.Tensor,\n    ) -> torch.Tensor:\n        hidden_states = self.embeddings(pixel_values.to(self.device))\n        hidden_states = self.pre_layrnorm(hidden_states)\n\n        return_all_hidden_states = False","sourceCodeStart":439,"sourceCodeEnd":475,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/models/clip.py#L439-L475","documentation":"CLIPVisionModel can optionally build fewer encoder layers than the config declares, but constructing MORE layers than config.num_hidden_layers is inconsistent and rejected. Typically raised when num_hidden_layers was reduced in config but layer construction ignored it.","triggerScenarios":"Loading a CLIP vision config with a reduced num_hidden_layers while the encoder still builds the original layer count (e.g. mismatched config after editing layer counts).","commonSituations":"Pruning or truncating CLIP vision layers by editing config.json without updating every layer-construction parameter.","solutions":["Ensure the encoder builds at most config.num_hidden_layers layers (align num_hidden_layers with layer construction params)","Restore the original num_hidden_layers if you did not intend to prune"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"assert len(encoder.layers) <= config.num_hidden_layers","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When pruning CLIP layers, update both the layer count param and num_hidden_layers consistently"],"tags":["clip","vision-encoder","config-validation"],"backgroundTag":"config-layer-count-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}