{"record":{"id":"90661fd787b5b607","repo":"keras-team/keras","slug":"unsupported-quantization-mode-self-quantization","errorCode":null,"errorMessage":"Unsupported quantization mode: {self.quantization_mode}","messagePattern":"Unsupported quantization mode: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"keras/src/layers/core/dense.py","lineNumber":1376,"sourceCode":"                )\n            else:\n                # Sub-channel: scale/zero are [n_groups, out]\n                float_kernel = dequantize_with_sz_map(\n                    unpacked_kernel,\n                    kernel_scale,\n                    self.kernel_zero,\n                    self.g_idx,\n                    group_axis=0,\n                )\n                float_kernel = ops.cast(float_kernel, self.compute_dtype)\n            quant_range = (-8, 7)\n        elif self.quantization_mode == \"int8\":\n            float_kernel = ops.divide(\n                ops.cast(kernel_value, self.compute_dtype), kernel_scale\n            )\n            quant_range = (-127, 127)\n        else:\n            raise ValueError(\n                f\"Unsupported quantization mode: {self.quantization_mode}\"\n            )\n\n        # Step 2: Merge LoRA weights in float domain\n        lora_delta = (self.lora_alpha / self.lora_rank) * ops.matmul(\n            self.lora_kernel_a, self.lora_kernel_b\n        )\n        merged_float_kernel = ops.add(float_kernel, lora_delta)\n\n        # Step 3: Re-quantize the merged kernel\n        if (\n            self.quantization_mode == \"int4\"\n            and block_size is not None\n            and block_size != -1\n        ):\n            # Sub-channel: returns kernel [in, out], scale [n_groups, out]\n            requantized_kernel, kernel_scale, kernel_zero = (\n                quantizers.abs_max_quantize_grouped_with_zero_point(","sourceCodeStart":1358,"sourceCodeEnd":1394,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/layers/core/dense.py#L1358-L1394","documentation":"When saving a LoRA-enabled quantized layer, Keras dequantizes and merges LoRA into a float kernel via _get_kernel_with_merged_lora; it handles the known quantization modes (int4/gptq, awq, int8) and raises on any unrecognized quantization_mode string.","triggerScenarios":"Calling model.save()/save_own_variables on a Dense layer with lora_enabled=True whose quantization_mode is not one of the handled modes — e.g. a custom or unexpected mode string.","commonSituations":"Custom quantization modes from subclasses or version skew where the merge path wasn't updated; programmatic quantization_config construction producing an unexpected mode.","solutions":["Only enable_lora on modes the save path supports (int8/int4-gptq/awq); check layer.quantization_mode first.","Save the base quantized weights without LoRA merged if the mode is unsupported.","For a custom mode, implement the dequantize branch in a subclass."],"exampleFix":"# before\ndense.enable_lora(8)  # quantization_mode is an unhandled custom mode\nmodel.save('m.keras')  # raises Unsupported quantization mode\n\n# after\nassert dense.quantization_mode in (None, 'int8', 'int4', 'gptq', 'awq')\ndense.enable_lora(8)\nmodel.save('m.keras')","handlingStrategy":"validation","validationCode":"SUPPORTED = {None, 'int8', 'int4', 'gptq', 'awq'}\nfor layer in model.layers:\n    if getattr(layer, 'quantization_mode', None) in SUPPORTED:\n        layer.enable_lora(rank)","typeGuard":"def merge_supported(layer) -> bool:\n    return getattr(layer, 'quantization_mode', None) in {None, 'int8', 'int4', 'gptq', 'awq'}","tryCatchPattern":"try:\n    model.save(path)\nexcept ValueError as e:\n    if 'Unsupported quantization mode' in str(e):\n        disable_lora_or_exclude_layer()\n        model.save(path)","preventionTips":["Only enable LoRA on documented quantization modes","Test save paths in CI for quantized+LoRA models"],"tags":["keras","lora","quantization","model-saving","unsupported-operation"],"backgroundTag":"lora-quantization-incompatible","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}