From 11cd90994dea305fe4ababf95f7691a72643e2a7 Mon Sep 17 00:00:00 2001 From: Avigyan Sinha Date: Tue, 11 Mar 2025 07:00:48 +0530 Subject: [PATCH 1/4] [OpenVINO Backend] numpy.empty implementation --- .../backend/openvino/excluded_concrete_tests.txt | 1 - keras/src/backend/openvino/numpy.py | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/keras/src/backend/openvino/excluded_concrete_tests.txt b/keras/src/backend/openvino/excluded_concrete_tests.txt index 89a5511c6502..0f11a1a0d12d 100644 --- a/keras/src/backend/openvino/excluded_concrete_tests.txt +++ b/keras/src/backend/openvino/excluded_concrete_tests.txt @@ -22,7 +22,6 @@ NumpyDtypeTest::test_diag NumpyDtypeTest::test_diff NumpyDtypeTest::test_digitize NumpyDtypeTest::test_einsum -NumpyDtypeTest::test_empty NumpyDtypeTest::test_exp2 NumpyDtypeTest::test_expm1 NumpyDtypeTest::test_eye diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index f07d7d8a6114..4d36dcfd1ae1 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -362,7 +362,7 @@ def average(x, axis=None, weights=None): x_type = x.get_element_type() weights_type = weights.get_element_type() if (weights_type.is_integral() or weights_type == Type.boolean) and ( - x_type.is_integral() or x_type == Type.boolean + x_type.is_integral() or x_type == Type.boolean ): x = ov_opset.convert(x, Type.f32).output(0) weights = ov_opset.convert(weights, Type.f32).output(0) @@ -565,7 +565,16 @@ def dot(x, y): def empty(shape, dtype=None): - raise NotImplementedError("`empty` is not supported with openvino backend") + if dtype is not None: + ov_type = OPENVINO_DTYPES[standardize_dtype(dtype)] + else: + ov_type = Type.f32 + if isinstance(shape, tuple): + shape = list(shape) + elif isinstance(shape, int): + shape = [shape] + empty_tensor = ov_opset.parameter(shape, ov_type).output(0) + return OpenVINOKerasTensor(empty_tensor) def equal(x1, x2): @@ -712,7 +721,7 @@ def less_equal(x1, x2): def linspace( - start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0 + start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0 ): raise NotImplementedError( "`linspace` is not supported with openvino backend" From 22208ac984a45b2d3e6a4c66d0e9701648ef2dca Mon Sep 17 00:00:00 2001 From: Avigyan Sinha Date: Tue, 11 Mar 2025 07:14:32 +0530 Subject: [PATCH 2/4] fix: reformatted --- keras/src/backend/openvino/numpy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 4d36dcfd1ae1..f4d33539de39 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -362,7 +362,7 @@ def average(x, axis=None, weights=None): x_type = x.get_element_type() weights_type = weights.get_element_type() if (weights_type.is_integral() or weights_type == Type.boolean) and ( - x_type.is_integral() or x_type == Type.boolean + x_type.is_integral() or x_type == Type.boolean ): x = ov_opset.convert(x, Type.f32).output(0) weights = ov_opset.convert(weights, Type.f32).output(0) @@ -721,8 +721,8 @@ def less_equal(x1, x2): def linspace( - start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0 -): + start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0 + ): raise NotImplementedError( "`linspace` is not supported with openvino backend" ) From 98b25f1875c785a3240ac74bb0a3d04eb8f13448 Mon Sep 17 00:00:00 2001 From: Avigyan Sinha Date: Tue, 11 Mar 2025 07:20:42 +0530 Subject: [PATCH 3/4] fix: fixed final lint issues --- keras/src/backend/openvino/numpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index f4d33539de39..3047a8c4a031 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -722,7 +722,7 @@ def less_equal(x1, x2): def linspace( start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0 - ): +): raise NotImplementedError( "`linspace` is not supported with openvino backend" ) From 1e1262bb42284737503693d883be007e58f5b0bc Mon Sep 17 00:00:00 2001 From: Avigyan Sinha Date: Wed, 12 Mar 2025 18:22:51 +0530 Subject: [PATCH 4/4] fix: updated empty logic --- keras/src/backend/openvino/numpy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keras/src/backend/openvino/numpy.py b/keras/src/backend/openvino/numpy.py index 3047a8c4a031..cbefa0b71f9e 100644 --- a/keras/src/backend/openvino/numpy.py +++ b/keras/src/backend/openvino/numpy.py @@ -565,15 +565,15 @@ def dot(x, y): def empty(shape, dtype=None): - if dtype is not None: - ov_type = OPENVINO_DTYPES[standardize_dtype(dtype)] - else: - ov_type = Type.f32 + dtype = standardize_dtype(dtype) or config.floatx() + ov_type = OPENVINO_DTYPES[dtype] if isinstance(shape, tuple): shape = list(shape) elif isinstance(shape, int): shape = [shape] - empty_tensor = ov_opset.parameter(shape, ov_type).output(0) + shape_node = ov_opset.constant(shape, Type.i32).output(0) + const_zero = ov_opset.constant(0, dtype=ov_type).output(0) + empty_tensor = ov_opset.broadcast(const_zero, shape_node).output(0) return OpenVINOKerasTensor(empty_tensor)