Skip to content

Commit 0102777

Browse files
Fixes the kernel property of Dense and EinsumDense to return unpacked int4 kernels (#21684)
* fixes property to return unpacked representation of packed 4-bit integer quantized kernels * Update keras/src/layers/core/einsum_dense_test.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * fix torch failures by increasing error threshold for problematic test --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 10f8f64 commit 0102777

File tree

4 files changed

+42
-9
lines changed

4 files changed

+42
-9
lines changed

keras/src/layers/core/dense.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,14 @@ def kernel(self):
152152
and self.quantization_mode == "gptq"
153153
):
154154
return self.quantized_kernel
155+
kernel = self._kernel
156+
if self.quantization_mode == "int4":
157+
kernel = quantizers.unpack_int4(kernel, self._orig_input_dim)
155158
if self.lora_enabled:
156-
return self._kernel + (
157-
self.lora_alpha / self.lora_rank
158-
) * ops.matmul(self.lora_kernel_a, self.lora_kernel_b)
159-
return self._kernel
159+
return kernel + (self.lora_alpha / self.lora_rank) * ops.matmul(
160+
self.lora_kernel_a, self.lora_kernel_b
161+
)
162+
return kernel
160163

161164
def call(self, inputs, training=None):
162165
x = ops.matmul(inputs, self.kernel)

keras/src/layers/core/dense_test.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from keras.src import models
1212
from keras.src import ops
1313
from keras.src import optimizers
14+
from keras.src import quantizers
1415
from keras.src import random
1516
from keras.src import saving
1617
from keras.src import testing
@@ -976,3 +977,13 @@ def test_gptq_serialization(self):
976977
new_layer = layers.Dense.from_config(config)
977978
new_layer.build((None, 8))
978979
self.assertEqual(new_layer.quantization_mode, "gptq")
980+
981+
def test_int4_kernel_returns_unpacked_form(self):
982+
"""Test that the `kernel` property returns the unpacked int4 kernel."""
983+
layer = layers.Dense(units=2)
984+
layer.build((None, 2))
985+
layer.quantize("int4")
986+
packed_kernel = layer._kernel
987+
self.assertAllClose(
988+
layer.kernel, quantizers.unpack_int4(packed_kernel, 2)
989+
)

keras/src/layers/core/einsum_dense.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,16 @@ def kernel(self):
214214
and self.quantization_mode == "gptq"
215215
):
216216
return self.quantized_kernel
217+
kernel = self._kernel
218+
if self.quantization_mode == "int4":
219+
kernel = quantizers.unpack_int4(
220+
kernel, self._orig_length_along_pack_axis, self._int4_pack_axis
221+
)
217222
if self.lora_enabled:
218-
return self._kernel + (
219-
self.lora_alpha / self.lora_rank
220-
) * ops.matmul(self.lora_kernel_a, self.lora_kernel_b)
221-
return self._kernel
223+
return kernel + (self.lora_alpha / self.lora_rank) * ops.matmul(
224+
self.lora_kernel_a, self.lora_kernel_b
225+
)
226+
return kernel
222227

223228
def compute_output_shape(self, _):
224229
return self.full_output_shape

keras/src/layers/core/einsum_dense_test.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from keras.src import models
1212
from keras.src import ops
1313
from keras.src import optimizers
14+
from keras.src import quantizers
1415
from keras.src import random
1516
from keras.src import saving
1617
from keras.src import testing
@@ -552,7 +553,7 @@ def test_quantize(self, quantization_mode):
552553
"btd,df->btf",
553554
(None, 4),
554555
(1, 2, 4),
555-
2e-3,
556+
3e-3,
556557
),
557558
)
558559
def test_quantize_with_specific_equations(
@@ -1036,3 +1037,16 @@ def test_gptq_serialization(self):
10361037
new_layer = layers.EinsumDense.from_config(config)
10371038
new_layer.build((None, 3))
10381039
self.assertEqual(new_layer.quantization_mode, "gptq")
1040+
1041+
def test_int4_kernel_returns_unpacked_form(self):
1042+
"""Test that the `kernel` property returns the unpacked int4 kernel."""
1043+
layer = layers.EinsumDense(
1044+
equation="ab,bc->ac",
1045+
output_shape=(2,),
1046+
)
1047+
layer.build((None, 2))
1048+
layer.quantize("int4")
1049+
packed_kernel = layer._kernel
1050+
self.assertAllClose(
1051+
layer.kernel, quantizers.unpack_int4(packed_kernel, 2)
1052+
)

0 commit comments

Comments
 (0)