{"record":{"id":"08ef7525ed84e3ac","repo":"invoke-ai/InvokeAI","slug":"unsupported-submodel-type-for-gemma2-encoder-sub","errorCode":null,"errorMessage":"Unsupported submodel type for Gemma2 encoder: {submodel_type!r}. Expected Tokenizer or TextEncoder.","messagePattern":"Unsupported submodel type for Gemma2 encoder: (.+?)\\. Expected Tokenizer or TextEncoder\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/load/model_loaders/gemma2_encoder.py","lineNumber":110,"sourceCode":"                target_device = TorchDevice.choose_torch_device()\n                model_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device)\n                causal_lm = AutoModelForCausalLM.from_pretrained(\n                    model_path,\n                    torch_dtype=model_dtype,\n                    low_cpu_mem_usage=True,\n                    local_files_only=True,\n                )\n                # PiD only ever uses the decoder block — the transformer stack\n                # without the LM head. Upstream calls `.get_decoder()`, but\n                # transformers 4.56 returns None for Gemma2, so we reach for\n                # `.model` (the underlying Gemma2Model) directly and let the\n                # rest of `causal_lm` (lm_head etc.) be garbage-collected.\n                inner = getattr(causal_lm, \"get_decoder\", lambda: None)() or causal_lm.model\n                inner.eval()\n                inner.requires_grad_(False)\n                return inner\n\n        raise ValueError(\n            f\"Unsupported submodel type for Gemma2 encoder: {submodel_type!r}. Expected Tokenizer or TextEncoder.\"\n        )\n\n\n@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.Gemma2Encoder, format=ModelFormat.GGUFQuantized)\nclass Gemma2EncoderGGUFLoader(ModelLoader):\n    \"\"\"Loads a single-file GGUF Gemma-2-2b encoder and exposes its decoder + tokenizer.\n\n    Unlike a naive `from_pretrained(gguf_file=...)` (which dequantizes every weight into RAM/VRAM at load,\n    giving no memory saving over the unquantized model), this keeps the large 2D projection weights as\n    InvokeAI ``GGMLTensor`` — the model cache's custom linear handling dequantizes them on demand. Only the\n    embedding and the RMSNorm weights are materialized eagerly. The tokenizer is still read from the GGUF\n    metadata. Mirrors the Qwen3 GGUF encoder loader in ``z_image.py``.\n    \"\"\"\n\n    def _load_model(\n        self,\n        config: AnyModelConfig,","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/load/model_loaders/gemma2_encoder.py#L92-L128","documentation":"Gemma2EncoderLoader only supports loading SubModelType.Tokenizer (via AutoTokenizer) and SubModelType.TextEncoder (the causal LM's decoder). Any other submodel request — or the whole-model path when the match falls through — raises this ValueError.","triggerScenarios":"Requesting submodel_type=None, SubModelType.Vae, Scheduler, Main, or any value other than Tokenizer/TextEncoder from a Gemma2Encoder-format model; passing None because the caller treats it as a single-file model rather than a submodel container.","commonSituations":"Generic code paths that always pass submodel_type=None; pipeline assembly code requesting a Vae/Scheduler from a text-encoder-only model; tests or scripts probing unsupported submodel types.","solutions":["Request only SubModelType.Tokenizer or SubModelType.TextEncoder for Gemma2 encoder models","Do not pass submodel_type=None; the loader requires an explicit Tokenizer/TextEncoder","Fix the calling code so Gemma2 models are not asked for VAE/scheduler submodels"],"exampleFix":"# before\nmodel = loader._load_model(config, submodel_type=None)\n# after\nmodel = loader._load_model(config, submodel_type=SubModelType.TextEncoder)","handlingStrategy":"validation","validationCode":"SUPPORTED = {SubModelType.Tokenizer, SubModelType.TextEncoder}\ndef gemma2_submodel_supported(submodel_type):\n    return submodel_type in SUPPORTED","typeGuard":"def is_gemma2_submodel(st: SubModelType | None) -> bool:\n    return st in (SubModelType.Tokenizer, SubModelType.TextEncoder)","tryCatchPattern":"try:\n    model = loader._load_model(config, submodel_type)\nexcept ValueError as e:\n    if \"Unsupported submodel type for Gemma2 encoder\" in str(e):\n        print(f\"{submodel_type} not provided by Gemma2 encoder; use Tokenizer or TextEncoder\")\n    else:\n        raise","preventionTips":["Only request Tokenizer/TextEncoder from Gemma2 encoder models","Never pass submodel_type=None to this loader","Branch on model type before requesting VAE/scheduler submodels"],"tags":["model-loader","submodel-type","gemma2"],"backgroundTag":"unsupported-submodel-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}