Skip to content

Commit 174b78b

Browse files
cleaning causal_lm and avoid keras.src imports
1 parent 9491573 commit 174b78b

File tree

2 files changed

+71
-52
lines changed

2 files changed

+71
-52
lines changed

keras_hub/src/models/causal_lm.py

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -133,55 +133,11 @@ def make_generate_function(self):
133133

134134
self.generate_function = self.generate_step
135135
if keras.config.backend() == "openvino":
136-
import numpy as np
137136
import openvino as ov
138137
import openvino.runtime.opset14 as ov_opset
139-
from keras.src.backend.openvino.core import OPENVINO_DTYPES
140-
from keras.src.backend.openvino.core import OpenVINOKerasTensor
141-
142-
def unpack_singleton(x):
143-
if isinstance(x, (list, tuple)) and len(x) == 1:
144-
return x[0]
145-
return x
146-
147-
def parameterize_inputs(inputs):
148-
if isinstance(inputs, (list, tuple)):
149-
return [parameterize_inputs(e) for e in inputs]
150-
elif isinstance(inputs, dict):
151-
return {
152-
k: parameterize_inputs(v) for k, v in inputs.items()
153-
}
154-
elif isinstance(inputs, np.ndarray):
155-
ov_type = OPENVINO_DTYPES[str(inputs.dtype)]
156-
ov_shape = list(inputs.shape)
157-
param = ov_opset.parameter(shape=ov_shape, dtype=ov_type)
158-
return OpenVINOKerasTensor(param.output(0))
159-
elif isinstance(inputs, (int, np.integer)):
160-
param = ov_opset.parameter(shape=[], dtype=ov.Type.i32)
161-
return OpenVINOKerasTensor(param.output(0))
162-
elif isinstance(inputs, (float, np.floating)):
163-
param = ov_opset.parameter(shape=[], dtype=ov.Type.f32)
164-
return OpenVINOKerasTensor(param.output(0))
165-
else:
166-
raise TypeError(f"Unknown input type: {type(inputs)}")
167-
168-
def get_struct_outputs(inputs, stop_token_ids, fn):
169-
struct_params = parameterize_inputs(inputs)
170-
struct_outputs = fn(struct_params, stop_token_ids)
171-
return struct_params, struct_outputs
172-
173-
def get_outputs_from_model(
174-
inputs, struct_outputs, compile_ov_model
175-
):
176-
flatten_inputs = tree.flatten(inputs)
177-
assert OpenVINOKerasTensor not in inputs, (
178-
"inputs should be numpy arrays"
179-
)
180-
outputs = compile_ov_model(flatten_inputs)
181-
outputs = unpack_singleton(
182-
tree.pack_sequence_as(struct_outputs, outputs.to_tuple())
183-
)
184-
return outputs
138+
139+
from keras_hub.src.utils.openvino_utils import get_outputs
140+
from keras_hub.src.utils.openvino_utils import get_struct_outputs
185141

186142
def ov_infer(inputs, stop_token_ids, fn):
187143
struct_params, struct_outputs = get_struct_outputs(
@@ -220,14 +176,11 @@ def ov_infer(inputs, stop_token_ids, fn):
220176
)
221177

222178
compile_ov_model = ov_infer._compiled_models[model_hash]
223-
return get_outputs_from_model(
224-
inputs, struct_outputs, compile_ov_model
225-
)
179+
return get_outputs(inputs, struct_outputs, compile_ov_model)
226180

227181
def wrapped_generate_function(inputs, stop_token_ids=None):
228182
for k, v in inputs.items():
229-
if isinstance(v, OpenVINOKerasTensor):
230-
inputs[k] = ops.array(v)
183+
inputs[k] = ops.array(v)
231184
return ov_infer(inputs, stop_token_ids, self.generate_step)
232185

233186
self.generate_function = wrapped_generate_function

keras_hub/src/utils/openvino_utils.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import numpy as np
2+
import openvino as ov
3+
import openvino.runtime.opset14 as ov_opset
4+
from keras import tree
5+
from keras.src.backend.openvino.core import OpenVINOKerasTensor
6+
7+
OPENVINO_DTYPES = {
8+
"float16": ov.Type.f16,
9+
"float32": ov.Type.f32,
10+
"float64": ov.Type.f64,
11+
"uint8": ov.Type.u8,
12+
"uint16": ov.Type.u16,
13+
"uint32": ov.Type.u32,
14+
"uint64": ov.Type.u64,
15+
"int8": ov.Type.i8,
16+
"int16": ov.Type.i16,
17+
"int32": ov.Type.i32,
18+
"int64": ov.Type.i64,
19+
"bfloat16": ov.Type.bf16,
20+
"bool": ov.Type.boolean,
21+
"float8_e4m3fn": ov.Type.f8e4m3,
22+
"float8_e5m2": ov.Type.f8e5m2,
23+
"string": ov.Type.string,
24+
}
25+
26+
27+
def unpack_singleton(x):
28+
if isinstance(x, (list, tuple)) and len(x) == 1:
29+
return x[0]
30+
return x
31+
32+
33+
def parameterize_inputs(inputs):
34+
if isinstance(inputs, (list, tuple)):
35+
return [parameterize_inputs(e) for e in inputs]
36+
elif isinstance(inputs, dict):
37+
return {k: parameterize_inputs(v) for k, v in inputs.items()}
38+
elif isinstance(inputs, np.ndarray):
39+
ov_type = OPENVINO_DTYPES[str(inputs.dtype)]
40+
ov_shape = list(inputs.shape)
41+
param = ov_opset.parameter(shape=ov_shape, dtype=ov_type)
42+
return OpenVINOKerasTensor(param.output(0))
43+
elif isinstance(inputs, (int, np.integer)):
44+
param = ov_opset.parameter(shape=[], dtype=ov.Type.i32)
45+
return OpenVINOKerasTensor(param.output(0))
46+
elif isinstance(inputs, (float, np.floating)):
47+
param = ov_opset.parameter(shape=[], dtype=ov.Type.f32)
48+
return OpenVINOKerasTensor(param.output(0))
49+
else:
50+
raise TypeError(f"Unknown input type: {type(inputs)}")
51+
52+
53+
def get_struct_outputs(inputs, stop_token_ids, fn):
54+
struct_params = parameterize_inputs(inputs)
55+
struct_outputs = fn(struct_params, stop_token_ids)
56+
return struct_params, struct_outputs
57+
58+
59+
def get_outputs(inputs, struct_outputs, compile_ov_model):
60+
flatten_inputs = tree.flatten(inputs)
61+
assert OpenVINOKerasTensor not in inputs, "inputs should be numpy arrays"
62+
outputs = compile_ov_model(flatten_inputs)
63+
outputs = unpack_singleton(
64+
tree.pack_sequence_as(struct_outputs, outputs.to_tuple())
65+
)
66+
return outputs

0 commit comments

Comments
 (0)