From 520567794308a12d8cd581cf7248257b7104c101 Mon Sep 17 00:00:00 2001 From: p3achyjr Date: Tue, 12 Sep 2023 16:20:27 +0000 Subject: [PATCH 1/3] [TFLite][Frontend] Support quantized floor_mod --- python/tvm/relay/frontend/tflite.py | 6 +----- tests/python/frontend/tflite/test_forward.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/python/tvm/relay/frontend/tflite.py b/python/tvm/relay/frontend/tflite.py index b33fd57b10ec..524b80d091ff 100644 --- a/python/tvm/relay/frontend/tflite.py +++ b/python/tvm/relay/frontend/tflite.py @@ -2690,11 +2690,7 @@ def convert_floor_div(self, op): def convert_floor_mod(self, op): """Convert TFLite FLOOR_MOD""" - if self.is_quantized(op): - raise tvm.error.OpNotImplemented( - "TFlite quantized FLOOR MOD operator is not supported yet." - ) - return self._convert_elemwise(_op.floor_mod, op) + return self._convert_elemwise(_op.floor_mod, op, self.is_quantized(op)) def convert_mirror_pad(self, op): """Convert TFLite MIRROR_PAD""" diff --git a/tests/python/frontend/tflite/test_forward.py b/tests/python/frontend/tflite/test_forward.py index 283514a6a3df..c07f24612da4 100644 --- a/tests/python/frontend/tflite/test_forward.py +++ b/tests/python/frontend/tflite/test_forward.py @@ -2764,9 +2764,16 @@ def _test_floor_divide(data, fused_activation_function=None, quantized=False, qn # --------- -def _test_floor_mod(data): +def _test_floor_mod(data, fused_activation_function=None, quantized=False, qnn_op=None): """One iteration of floor_mod""" - return _test_elemwise(math_ops.floormod, data) + return _test_elemwise( + math_ops.floormod, + data, + fused_activation_function, + quantized, + qnn_op, + same_qnn_params=True, + ) def _test_forward_elemwise(testop): @@ -2816,6 +2823,7 @@ def _test_elemwise_qnn_out_range(qnn_op): _test_greater: (-150, 150), _test_squared_difference: (0, 65025), _test_floor_divide: (-150, 150), + _test_floor_mod: (-150, 150), } return qnn_out_range[qnn_op] @@ -2859,6 +2867,7 @@ def test_all_elemwise(): _test_forward_elemwise(_test_floor_divide) _test_forward_elemwise_quantized(_test_floor_divide) _test_forward_elemwise(_test_floor_mod) + _test_forward_elemwise_quantized(_test_floor_mod) ####################################################################### From 7e27b92e36a2bec8092088a7a26ae702b8d87101 Mon Sep 17 00:00:00 2001 From: p3achyjr Date: Wed, 27 Sep 2023 00:48:47 +0000 Subject: [PATCH 2/3] [TVM][Frontend] Fix zero-point issues in quantized div/floor_div --- tests/python/frontend/tflite/test_forward.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/python/frontend/tflite/test_forward.py b/tests/python/frontend/tflite/test_forward.py index 4e86633b79da..d0ed2eb57e12 100644 --- a/tests/python/frontend/tflite/test_forward.py +++ b/tests/python/frontend/tflite/test_forward.py @@ -2452,6 +2452,7 @@ def _test_elemwise( qnn_op=None, same_qnn_params=False, comparison_op=False, + exclude_zero_point=False, ): """One iteration of elemwise""" @@ -2480,6 +2481,16 @@ def __test_elemwise(in_data): inq0_min, inq0_max = (out_min, out_max) inq1_min, inq1_max = (out_min, out_max) + if exclude_zero_point: + if inq1_max == inq1_min: + raise ZeroDivisionError('Input range is 0.') + + # only compute for rhs. + quant_scale = 255 / (inq1_max - inq1_min) + zero_point = int(round(-inq1_min * quant_scale)) + data[1][data[1] == zero_point] += 1 + data[1][data[1] == 0] += 1 + # fake_quant will keep the tensors in float32 until the conversion in the session inq_data = [ tf.quantization.fake_quant_with_min_max_args( @@ -2619,6 +2630,7 @@ def _test_div(data, fused_activation_function=None, quantized=False, qnn_op=None quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2795,6 +2807,7 @@ def _test_floor_divide(data, fused_activation_function=None, quantized=False, qn quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2812,6 +2825,7 @@ def _test_floor_mod(data, fused_activation_function=None, quantized=False, qnn_o quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2874,7 +2888,7 @@ def _test_elemwise_qnn_out_range(qnn_op): def test_all_elemwise(): - """All_elewise""" + """All_elemwise""" _test_forward_elemwise(_test_add) _test_forward_elemwise_quantized(_test_add) _test_forward_elemwise(partial(_test_add, fused_activation_function="RELU")) From 08c6d0afb1ff8c89ebd5d4cd68af5b2619c891f5 Mon Sep 17 00:00:00 2001 From: p3achyjr Date: Wed, 27 Sep 2023 00:48:47 +0000 Subject: [PATCH 3/3] [TVM][Frontend] Fix zero-point issues in quantized div/floor_div --- tests/python/frontend/tflite/test_forward.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/python/frontend/tflite/test_forward.py b/tests/python/frontend/tflite/test_forward.py index 4e86633b79da..d0ed2eb57e12 100644 --- a/tests/python/frontend/tflite/test_forward.py +++ b/tests/python/frontend/tflite/test_forward.py @@ -2452,6 +2452,7 @@ def _test_elemwise( qnn_op=None, same_qnn_params=False, comparison_op=False, + exclude_zero_point=False, ): """One iteration of elemwise""" @@ -2480,6 +2481,16 @@ def __test_elemwise(in_data): inq0_min, inq0_max = (out_min, out_max) inq1_min, inq1_max = (out_min, out_max) + if exclude_zero_point: + if inq1_max == inq1_min: + raise ZeroDivisionError('Input range is 0.') + + # only compute for rhs. + quant_scale = 255 / (inq1_max - inq1_min) + zero_point = int(round(-inq1_min * quant_scale)) + data[1][data[1] == zero_point] += 1 + data[1][data[1] == 0] += 1 + # fake_quant will keep the tensors in float32 until the conversion in the session inq_data = [ tf.quantization.fake_quant_with_min_max_args( @@ -2619,6 +2630,7 @@ def _test_div(data, fused_activation_function=None, quantized=False, qnn_op=None quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2795,6 +2807,7 @@ def _test_floor_divide(data, fused_activation_function=None, quantized=False, qn quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2812,6 +2825,7 @@ def _test_floor_mod(data, fused_activation_function=None, quantized=False, qnn_o quantized, qnn_op, same_qnn_params=True, + exclude_zero_point=True, ) @@ -2874,7 +2888,7 @@ def _test_elemwise_qnn_out_range(qnn_op): def test_all_elemwise(): - """All_elewise""" + """All_elemwise""" _test_forward_elemwise(_test_add) _test_forward_elemwise_quantized(_test_add) _test_forward_elemwise(partial(_test_add, fused_activation_function="RELU"))