{"record":{"id":"9fbd9707e8c5561c","repo":"sgl-project/sglang","slug":"lm-head-is-not-available-in-encoder-only-mode","errorCode":null,"errorMessage":"lm_head is not available in encoder-only mode","messagePattern":"lm_head is not available in encoder-only mode","errorType":"exception","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/models/kimi_k3.py","lineNumber":3319,"sourceCode":"    def precompile_kernels_after_loading(self) -> None:\n        if self.config.language_only:\n            return\n        if self.vision_tower.precompile_fused_rope():\n            logger.info(\"Precompiled dynamic-token fused K3 vision RoPE kernel\")\n        if self.vision_tower.precompile_attention_backend():\n            logger.info(\"Precompiled Kimi-K3 vision FA4 kernel\")\n\n    def get_input_embeddings(self):\n        if self.language_model is None:\n            raise AttributeError(\n                \"get_input_embeddings() is not available in encoder-only mode\"\n            )\n        return self.language_model.model.embed_tokens\n\n    @property\n    def lm_head(self):\n        if self.language_model is None:\n            raise AttributeError(\"lm_head is not available in encoder-only mode\")\n        return self.language_model.lm_head\n\n    def set_dspark_layers_to_capture(self, layer_ids: list[int]) -> None:\n        if self.language_model is None:\n            raise AttributeError(\n                \"DSPARK layer capture is not available in encoder-only mode\"\n            )\n        self.language_model.set_dspark_layers_to_capture(layer_ids)\n\n    def preprocess_mm_for_encoder(\n        self,\n        mm_data,\n        modality,\n        config,\n        *,\n        image_processor=None,\n        use_gpu_preprocessing=False,\n    ):","sourceCodeStart":3301,"sourceCodeEnd":3337,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/models/kimi_k3.py#L3301-L3337","documentation":"The lm_head property raises AttributeError when the Kimi-K3 model is in encoder-only mode, because there is no language model and therefore no output head. Code that reads lm_head for logits-related metadata, tied-weight detection, or sampling setup will fail on an encoder-only instance.","triggerScenarios":"Accessing model.lm_head on an encoder-only Kimi-K3 build (language_model is None), e.g. during weight loading, tied-weight checks, or logit setup in generic paths.","commonSituations":"EPD encoder deployment where only the vision tower is loaded; shared utilities assuming every model exposes lm_head.","solutions":["Guard access with model.language_model is not None before reading lm_head","Mark encoder-only instances and branch generic logit/weight logic away from them","Confirm the deployment actually intended encoder-only mode"],"exampleFix":"// before\nhead = model.lm_head\n\n// after\nhead = model.lm_head if model.language_model is not None else None","handlingStrategy":"type-guard","validationCode":"assert model.language_model is not None, \"encoder-only instance has no lm_head\"","typeGuard":"def has_lm_head(m) -> bool:\n    return getattr(m, \"language_model\", None) is not None","tryCatchPattern":"try:\n    head = model.lm_head\nexcept AttributeError:\n    head = None","preventionTips":["Gate tied-weight/logit logic on presence of a language model","Test generic harness paths against an encoder-only build"],"tags":["kimi-k3","encoder-only","lm-head","attribute-error"],"backgroundTag":"attribute-not-available-in-mode","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}