{"record":{"id":"a6561ac993a31838","repo":"Stability-AI/generative-models","slug":"notimplementederror-a6561a","errorCode":null,"errorMessage":"NotImplementedError","messagePattern":"NotImplementedError","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"sgm/modules/encoders/modules.py","lineNumber":439,"sourceCode":"            arch,\n            device=torch.device(\"cpu\"),\n            pretrained=version,\n        )\n        del model.visual\n        self.model = model\n\n        self.device = device\n        self.max_length = max_length\n        self.return_pooled = always_return_pooled\n        if freeze:\n            self.freeze()\n        self.layer = layer\n        if self.layer == \"last\":\n            self.layer_idx = 0\n        elif self.layer == \"penultimate\":\n            self.layer_idx = 1\n        else:\n            raise NotImplementedError()\n        self.legacy = legacy\n\n    def freeze(self):\n        self.model = self.model.eval()\n        for param in self.parameters():\n            param.requires_grad = False\n\n    @autocast\n    def forward(self, text):\n        tokens = open_clip.tokenize(text)\n        z = self.encode_with_transformer(tokens.to(self.device))\n        if not self.return_pooled and self.legacy:\n            return z\n        if self.return_pooled:\n            assert not self.legacy\n            return z[self.layer], z[\"pooled\"]\n        return z[self.layer]\n","sourceCodeStart":421,"sourceCodeEnd":457,"githubUrl":"https://github.com/Stability-AI/generative-models/blob/e8cd657656fa5d61688191730d0e03242bf4ed44/sgm/modules/encoders/modules.py#L421-L457","documentation":"FrozenOpenCLIPVisualStyleEmbedder (around modules.py:439) accepts layer='last' or layer='penultimate' to select which CLIP transformer output to use; any other string raises NotImplementedError in __init__. Unlike some OpenCLIP wrappers there is no support for indexed/hidden-layer names here.","triggerScenarios":"Constructing the embedder with layer set to something other than 'last' or 'penultimate', e.g. layer='hidden', layer=7, or a config omitting/misspelling the layer param.","commonSituations":"Copying config snippets from the Stable Diffusion (LDM-style) CLIP embedder which used layer='hidden'; typos like 'penultimate ' with whitespace; passing None when the config lacks params.","solutions":["Set layer='last' (layer_idx 0) or layer='penultimate' (layer_idx 1) in the embedder config","Check the exact string in the config YAML for case/whitespace/typos","If you need another layer, patch the class to map your layer string to the right layer_idx"],"exampleFix":"// before\nparams:\n  layer: hidden\n// after\nparams:\n  layer: penultimate","handlingStrategy":"validation","validationCode":"ALLOWED_LAYERS = {'last', 'penultimate'}\nlayer = cfg.model.params.embedder.get('params', {}).get('layer', 'last')\nif layer not in ALLOWED_LAYERS:\n    raise ValueError(f\"layer must be one of {ALLOWED_LAYERS}, got {layer!r}\")","typeGuard":null,"tryCatchPattern":"try:\n    embedder = instantiate_from_config(emb_config)\nexcept NotImplementedError:\n    emb_config['params']['layer'] = 'last'\n    embedder = instantiate_from_config(emb_config)","preventionTips":["Never copy layer='hidden' from LDM FrozenCLIP configs into SGM OpenCLIP embedders","Validate layer strings against the whitelist at config-load time","Note the two supported values map to layer_idx 0 and 1 only"],"tags":["python","not-implemented","clip","config"],"backgroundTag":"unsupported-option-value","analyzedSha":"e8cd657656fa5d61688191730d0e03242bf4ed44","analyzedAt":"2026-08-29T11:23:43.234Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}