[PyOV] Missed variable API in Model class (#21434)

* [PyOV] Missed variable API in Model class

* fixes in model docstr and codestyle

* add test

* fix ci

* fix ci
This commit is contained in:
Anastasia Kuporosova 2023-12-04 15:44:23 +01:00 committed by GitHub
parent fcbb80d372
commit ca87784a29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 117 additions and 37 deletions

View File

@ -17,6 +17,12 @@ OpenVINO Python API
openvino.runtime.op
.. autosummary::
:toctree: _autosummary
:template: custom-module-template.rst
openvino.runtime.op.util
.. autosummary::
:toctree: _autosummary
:template: custom-module-template.rst

View File

@ -111,7 +111,7 @@ void regclass_graph_Model(py::module m) {
Create user-defined Model which is a representation of a model.
:param results: List of results.
:type results: List[op.Result]
:type results: List[openvino.runtime.Node]
:param sinks: List of Nodes to be used as Sinks (e.g. Assign ops).
:type sinks: List[openvino.runtime.Node]
:param parameters: List of parameters.
@ -221,7 +221,7 @@ void regclass_graph_Model(py::module m) {
Create user-defined Model which is a representation of a model
:param results: List of results.
:type results: List[op.Result]
:type results: List[openvino.runtime.Node]
:param sinks: List of Nodes to be used as Sinks (e.g. Assign ops).
:type sinks: List[openvino.runtime.Node]
:param parameters: List of parameters.
@ -274,7 +274,7 @@ void regclass_graph_Model(py::module m) {
Create user-defined Model which is a representation of a model
:param results: List of results.
:type results: List[op.Result]
:type results: List[openvino.runtime.Node]
:param parameters: List of parameters.
:type parameters: List[op.Parameter]
:param variables: List of variables.
@ -521,33 +521,33 @@ void regclass_graph_Model(py::module m) {
R"(
Return the model parameters.
:return: ParameterVector containing model parameters.
:rtype: ParameterVector
:return: a list of model's parameters.
:rtype: List[op.Parameter]
)");
model.def_property_readonly("parameters",
&ov::Model::get_parameters,
R"(
Return the model parameters.
:return: ParameterVector containing model parameters.
:rtype: ParameterVector
:return: a list of model's parameters.
:rtype: List[op.Parameter]
)");
model.def("get_results",
&ov::Model::get_results,
R"(
Return a list of model outputs.
:return: ResultVector containing model parameters.
:rtype: ResultVector
)");
:return: a list of model's result nodes.
:rtype: List[openvino.runtime.Node]
)");
model.def_property_readonly("results",
&ov::Model::get_results,
R"(
Return a list of model outputs.
Return a list of model outputs.
:return: ResultVector containing model parameters.
:rtype: ResultVector
)");
:return: a list of model's result nodes.
:rtype: List[openvino.runtime.Node]
)");
model.def("get_result",
&ov::Model::get_result,
R"(
@ -555,7 +555,7 @@ void regclass_graph_Model(py::module m) {
:return: Node object representing result.
:rtype: openvino.runtime.Node
)");
)");
model.def_property_readonly("result",
&ov::Model::get_result,
R"(
@ -747,6 +747,7 @@ void regclass_graph_Model(py::module m) {
Delete Result node from the list of results. Method will not delete node from graph.
:param result: Result node to delete.
:type result: openvino.runtime.Node
)");
model.def("remove_parameter",
@ -765,6 +766,7 @@ void regclass_graph_Model(py::module m) {
* call graph validation to check all changes
:param parameter: Parameter node to delete.
:type parameter: op.Parameter
)");
model.def(
@ -785,8 +787,20 @@ void regclass_graph_Model(py::module m) {
Delete sink node from the list of sinks. Method doesn't delete node from graph.
:param sink: Sink to delete.
:type sink: openvino.runtime.Node
)");
model.def("remove_variable",
&ov::Model::remove_variable,
py::arg("variable"),
R"(
Delete variable from the list of variables.
Method doesn't delete nodes that used this variable from the graph.
:param variable: Variable to delete.
:type variable: op.util.Variable
)");
model.def("add_parameters",
&ov::Model::add_parameters,
py::arg("parameters"),
@ -813,8 +827,8 @@ void regclass_graph_Model(py::module m) {
Method doesn't validate graph, it should be done manually after all changes.
:param results: new Result nodes.
:type results: List[op.Result]
)");
:type results: List[openvino.runtime.Node]
)");
model.def(
"add_sinks",
@ -830,13 +844,54 @@ void regclass_graph_Model(py::module m) {
},
py::arg("sinks"),
R"(
Add new sink nodes to the list.
Add new sink nodes to the list.
Method doesn't validate graph, it should be done manually after all changes.
:param sinks: new sink nodes.
:type sinks: List[openvino.runtime.Node]
)");
model.def("add_variables",
&ov::Model::add_variables,
py::arg("variables"),
R"(
Add new variables to the list.
Method doesn't validate graph, it should be done manually after all changes.
:param sinks: new sink nodes.
:type sinks: List[openvino.runtime.Node]
)");
:param variables: new variables to add.
:type variables: List[op.util.Variable]
)");
model.def("get_variables",
&ov::Model::get_variables,
R"(
Return a list of model's variables.
:return: a list of model's variables.
:rtype: List[op.util.Variable]
)");
model.def_property_readonly("variables",
&ov::Model::get_variables,
R"(
Return a list of model's variables.
:return: a list of model's variables.
:rtype: List[op.util.Variable]
)");
model.def("get_variable_by_id",
&ov::Model::get_variable_by_id,
R"(
Return a variable by specified variable_id.
:param variable_id: a variable id to get variable node.
:type variable_id: str
:return: a variable node.
:rtype: op.util.Variable
)");
model.def(
"get_sinks",
@ -858,10 +913,10 @@ void regclass_graph_Model(py::module m) {
return cast_to_node_vector(sinks);
},
R"(
Return a list of model outputs.
Return a list of model's sinks.
:return: ResultVector containing model parameters.
:rtype: ResultVector
:return: a list of model's sinks.
:rtype: List[openvino.runtime.Node]
)");
model.def(

View File

@ -27,17 +27,7 @@ from openvino.runtime import ProfilingInfo
from openvino.preprocess import PrePostProcessor
from tests import skip_need_mock_op
from tests.utils.helpers import generate_image, get_relu_model
def create_model_with_memory(input_shape, data_type):
input_data = ops.parameter(input_shape, name="input_data", dtype=data_type)
rv = ops.read_value(input_data, "var_id_667", data_type, input_shape)
add = ops.add(rv, input_data, name="MemoryAdd")
node = ops.assign(add, "var_id_667")
res = ops.result(add, "res")
model = Model(results=[res], sinks=[node], parameters=[input_data], name="name")
return model
from tests.utils.helpers import generate_image, get_relu_model, generate_model_with_memory
def create_simple_request_and_inputs(device):
@ -677,7 +667,7 @@ def test_query_state_write_buffer(device, input_shape, data_type, mode):
from openvino import Tensor
from openvino.runtime.utils.types import get_dtype
model = create_model_with_memory(input_shape, data_type)
model = generate_model_with_memory(input_shape, data_type)
model.validate_nodes_and_infer_types()
compiled_model = core.compile_model(model=model, device_name=device)
request = compiled_model.create_infer_request()

View File

@ -23,8 +23,9 @@ from openvino import (
serialize,
)
from openvino.runtime import Output
from openvino.runtime.op.util import VariableInfo, Variable
from tests.utils.helpers import generate_add_model, create_filename_for_test
from tests.utils.helpers import generate_add_model, generate_model_with_memory, create_filename_for_test
def test_descriptor_tensor():
@ -547,3 +548,21 @@ def test_model_get_raw_address():
assert model._get_raw_address() == model_with_same_addr._get_raw_address()
assert model._get_raw_address() != model_different._get_raw_address()
def test_model_add_remove_variable():
model = generate_model_with_memory(input_shape=Shape([2, 1]), data_type=Type.f32)
var_info = VariableInfo()
var_info.data_shape = PartialShape([2, 1])
var_info.data_type = Type.f32
var_info.variable_id = "v1"
variable_1 = Variable(var_info)
assert len(model.get_variables()) == 1
model.add_variables([variable_1])
assert len(model.get_variables()) == 2
variable_by_id = model.get_variable_by_id("var_id_667")
assert variable_by_id.info.variable_id == "var_id_667"
model.remove_variable(variable_1)
assert len(model.get_variables()) == 1

View File

@ -209,6 +209,16 @@ def generate_add_model() -> openvino._pyopenvino.Model:
return Model(add, [param1, param2], "TestModel")
def generate_model_with_memory(input_shape, data_type) -> openvino._pyopenvino.Model:
input_data = ops.parameter(input_shape, name="input_data", dtype=data_type)
rv = ops.read_value(input_data, "var_id_667", data_type, input_shape)
add = ops.add(rv, input_data, name="MemoryAdd")
node = ops.assign(add, "var_id_667")
res = ops.result(add, "res")
model = Model(results=[res], sinks=[node], parameters=[input_data], name="TestModel")
return model
def create_filename_for_test(test_name, tmp_path, is_xml_path=False, is_bin_path=False):
"""Return a tuple with automatically generated paths for xml and bin files.