From e720362bfc09fd0f55976125bdb855b2f0da7668 Mon Sep 17 00:00:00 2001 From: Prabha14039 Date: Sun, 20 Apr 2025 00:08:53 +0530 Subject: [PATCH 1/5] Support numpy.prod operation --- .../openvino/excluded_concrete_tests.txt | 2 -- keras/src/backend/openvino/numpy.py | 23 ++++++++++++++++++- pytest.ini | 3 +++ requirements.txt | 4 +++- 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 pytest.ini diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index f1ae053e623b..5bf017138efe 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -41,7 +41,6 @@ NumpyDtypeTest::test_multiply NumpyDtypeTest::test_nan NumpyDtypeTest::test_outer_ NumpyDtypeTest::test_power -NumpyDtypeTest::test_prod NumpyDtypeTest::test_quantile NumpyDtypeTest::test_ravel NumpyDtypeTest::test_repeat @@ -104,7 +103,6 @@ NumpyOneInputOpsCorrectnessTest::test_pad_int16_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_uint8_constant_2 NumpyOneInputOpsCorrectnessTest::test_pad_int32_constant_2 -NumpyOneInputOpsCorrectnessTest::test_prod NumpyOneInputOpsCorrectnessTest::test_ravel NumpyOneInputOpsCorrectnessTest::test_real NumpyOneInputOpsCorrectnessTest::test_reciprocal diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index a242a3c8d569..7c0639035995 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1118,7 +1118,28 @@ def pad(x, pad_width, mode="constant", constant_values=None): def prod(x, axis=None, keepdims=False, dtype=None): - raise NotImplementedError("`prod` is not supported with openvino backend") + #raise NotImplementedError("`prod` is not supported with openvino backend") + if axis == () or axis == []: + return x + + x = get_ov_output(x) + x_type = x.get_element_type() + + if axis is None: + flatten_shape = ov_opset.constant([-1], Type.i32).output(0) + x = ov_opset.reshape(x, flatten_shape, False).output(0) + axis = 0 + + if isinstance(axis, tuple): + axis = list(axis) + axis = ov_opset.constant(axis, Type.i32).output(0) + + if x_type == Type.boolean: + return OpenVINOKerasTensor( + ov_opset.reduce_logical_or(x, axis, keepdims).output(0) + ) + + return OpenVINOKerasTensor(ov_opset.reduce_prod(x, axis, keepdims).output(0)) def quantile(x, q, axis=None, method="linear", keepdims=False): diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000000..24f5b5f11e3d --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +env = + KERAS_BACKEND=openvino diff --git a/requirements.txt b/requirements.txt index 75f8aed3d434..e8886a6f0424 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,9 @@ torch-xla==2.6.0;sys_platform != 'darwin' # Jax. # Pinned to 0.5.0 on CPU. JAX 0.5.1 requires Tensorflow 2.19 for saved_model_test. # Note that we test against the latest JAX on GPU. -jax[cpu]==0.5.0 + +#removed jax as is not nedded in our case +#jax[cpu]==0.5.0 flax # pre-commit checks (formatting, linting, etc.) From 3449d9c409eb1b4d3670074f0ab7a98b590c3f4b Mon Sep 17 00:00:00 2001 From: Prabha14039 Date: Sun, 20 Apr 2025 20:47:55 +0530 Subject: [PATCH 2/5] fixed the CI issue and made changes to previous issues --- keras/src/backend/openvino/numpy.py | 44 +++++++++++++++++++++++++---- pytest.ini | 3 -- requirements.txt | 3 +- 3 files changed, 39 insertions(+), 11 deletions(-) delete mode 100644 pytest.ini diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 7c0639035995..b496e43c9aaf 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1116,15 +1116,52 @@ def pad(x, pad_width, mode="constant", constant_values=None): ov_opset.pad(x, pads_begin, pads_end, mode, pad_value).output(0) ) +''' +Helper Function to convert the string dtype to ov type +''' +def string_to_ov_type(dtype_str): + from openvino.runtime import Type + mapping = { + "bool": Type.boolean, + "int8": Type.i8, + "int16": Type.i16, + "int32": Type.i32, + "int64": Type.i64, + "uint8": Type.u8, + "uint16": Type.u16, + "uint32": Type.u32, + "uint64": Type.u64, + "float16": Type.f16, + "float32": Type.f32, + "float64": Type.f64, + } + return mapping[dtype_str] + def prod(x, axis=None, keepdims=False, dtype=None): - #raise NotImplementedError("`prod` is not supported with openvino backend") if axis == () or axis == []: return x x = get_ov_output(x) x_type = x.get_element_type() + # Promote dtype if not explicitly specified + if dtype is None: + if x_type == Type.boolean: + promoted_dtype = Type.i32 + elif x_type in (Type.i8, Type.i16): + promoted_dtype = Type.i32 + elif x_type in (Type.u8, Type.u16): + promoted_dtype = Type.u32 + else: + promoted_dtype = x_type + else: + promoted_dtype = string_to_ov_type(dtype) + + # Cast to promoted dtype if necessary + if x_type != promoted_dtype: + x = ov_opset.convert(x, promoted_dtype).output(0) + if axis is None: flatten_shape = ov_opset.constant([-1], Type.i32).output(0) x = ov_opset.reshape(x, flatten_shape, False).output(0) @@ -1134,11 +1171,6 @@ def prod(x, axis=None, keepdims=False, dtype=None): axis = list(axis) axis = ov_opset.constant(axis, Type.i32).output(0) - if x_type == Type.boolean: - return OpenVINOKerasTensor( - ov_opset.reduce_logical_or(x, axis, keepdims).output(0) - ) - return OpenVINOKerasTensor(ov_opset.reduce_prod(x, axis, keepdims).output(0)) diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 24f5b5f11e3d..000000000000 --- a/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -env = - KERAS_BACKEND=openvino diff --git a/requirements.txt b/requirements.txt index e8886a6f0424..22ea591ec059 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,8 +14,7 @@ torch-xla==2.6.0;sys_platform != 'darwin' # Pinned to 0.5.0 on CPU. JAX 0.5.1 requires Tensorflow 2.19 for saved_model_test. # Note that we test against the latest JAX on GPU. -#removed jax as is not nedded in our case -#jax[cpu]==0.5.0 +jax[cpu]==0.5.0 flax # pre-commit checks (formatting, linting, etc.) From 5b1cd2528c75c9bbf5e9580476cb268b28eb1e75 Mon Sep 17 00:00:00 2001 From: Prabha14039 Date: Sun, 20 Apr 2025 23:25:21 +0530 Subject: [PATCH 3/5] precommit to format the files --- keras/src/backend/openvino/numpy.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index b496e43c9aaf..8726562107bd 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1116,11 +1116,15 @@ def pad(x, pad_width, mode="constant", constant_values=None): ov_opset.pad(x, pads_begin, pads_end, mode, pad_value).output(0) ) -''' + +""" Helper Function to convert the string dtype to ov type -''' +""" + + def string_to_ov_type(dtype_str): from openvino.runtime import Type + mapping = { "bool": Type.boolean, "int8": Type.i8, @@ -1171,7 +1175,9 @@ def prod(x, axis=None, keepdims=False, dtype=None): axis = list(axis) axis = ov_opset.constant(axis, Type.i32).output(0) - return OpenVINOKerasTensor(ov_opset.reduce_prod(x, axis, keepdims).output(0)) + return OpenVINOKerasTensor( + ov_opset.reduce_prod(x, axis, keepdims).output(0) + ) def quantile(x, q, axis=None, method="linear", keepdims=False): From 5342879d2f4adca581a025f4a56dd9f16ed5609b Mon Sep 17 00:00:00 2001 From: Prabha14039 Date: Mon, 21 Apr 2025 16:03:35 +0530 Subject: [PATCH 4/5] fixed dtype and requirements.txt --- keras/src/backend/openvino/numpy.py | 18 ------------------ requirements.txt | 1 - 2 files changed, 19 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 8726562107bd..77db4518e83e 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1147,24 +1147,6 @@ def prod(x, axis=None, keepdims=False, dtype=None): return x x = get_ov_output(x) - x_type = x.get_element_type() - - # Promote dtype if not explicitly specified - if dtype is None: - if x_type == Type.boolean: - promoted_dtype = Type.i32 - elif x_type in (Type.i8, Type.i16): - promoted_dtype = Type.i32 - elif x_type in (Type.u8, Type.u16): - promoted_dtype = Type.u32 - else: - promoted_dtype = x_type - else: - promoted_dtype = string_to_ov_type(dtype) - - # Cast to promoted dtype if necessary - if x_type != promoted_dtype: - x = ov_opset.convert(x, promoted_dtype).output(0) if axis is None: flatten_shape = ov_opset.constant([-1], Type.i32).output(0) diff --git a/requirements.txt b/requirements.txt index 22ea591ec059..75f8aed3d434 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,6 @@ torch-xla==2.6.0;sys_platform != 'darwin' # Jax. # Pinned to 0.5.0 on CPU. JAX 0.5.1 requires Tensorflow 2.19 for saved_model_test. # Note that we test against the latest JAX on GPU. - jax[cpu]==0.5.0 flax From a198e045f3d3d53328fd1a2e8dcd3a90a6e90436 Mon Sep 17 00:00:00 2001 From: Prabha14039 Date: Mon, 21 Apr 2025 16:48:49 +0530 Subject: [PATCH 5/5] stil failing some tests --- keras/src/backend/openvino/numpy.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 77db4518e83e..5e4135a9a5d8 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -1157,9 +1157,12 @@ def prod(x, axis=None, keepdims=False, dtype=None): axis = list(axis) axis = ov_opset.constant(axis, Type.i32).output(0) - return OpenVINOKerasTensor( - ov_opset.reduce_prod(x, axis, keepdims).output(0) - ) + result = ov_opset.reduce_prod(x, axis, keepdims).output(0) + + if dtype: + result = ov_opset.convert(result, string_to_ov_type(dtype)).output(0) + + return OpenVINOKerasTensor(result) def quantile(x, q, axis=None, method="linear", keepdims=False):