@@ -48,49 +48,85 @@ const char* NPU_PLUGIN_LIB_NAME = "openvino_intel_npu_plugin";
48
48
* @returns The dummy "ov::Model" composed of "parameter" and "result" nodes built using the given descriptors.
49
49
*/
50
50
std::shared_ptr<ov::Model> create_dummy_model (const std::vector<IODescriptor>& inputDescriptors,
51
- const std::vector<IODescriptor>& outputDescriptors) {
51
+ const std::vector<IODescriptor>& outputDescriptors,
52
+ const bool benchmarkInit = false ) {
52
53
ov::ParameterVector parameters;
53
54
ov::NodeVector results;
54
55
55
56
for (const IODescriptor& inputDescriptor : inputDescriptors) {
56
- if (inputDescriptor.isStateInput || inputDescriptor.isStateOutput || inputDescriptor.isShapeTensor ||
57
- inputDescriptor.isInitInputWeights || inputDescriptor.isMainInputWeights ) {
58
- continue ;
59
- }
57
+ if (!benchmarkInit) {
58
+ if (inputDescriptor.isStateInput || inputDescriptor.isStateOutput || inputDescriptor.isShapeTensor ||
59
+ inputDescriptor.isInitInputWeights || inputDescriptor.isMainInputWeights ) {
60
+ continue ;
61
+ }
60
62
61
- std::shared_ptr<ov::op::v0::Parameter> parameter = std::make_shared<ov::op::v0::Parameter>(
62
- inputDescriptor.precision ,
63
- inputDescriptor.shapeFromIRModel .has_value () ? *inputDescriptor.shapeFromIRModel
64
- : inputDescriptor.shapeFromCompiler );
63
+ std::shared_ptr<ov::op::v0::Parameter> parameter = std::make_shared<ov::op::v0::Parameter>(
64
+ inputDescriptor.precision ,
65
+ inputDescriptor.shapeFromIRModel .has_value () ? *inputDescriptor.shapeFromIRModel
66
+ : inputDescriptor.shapeFromCompiler );
67
+ parameter->set_friendly_name (inputDescriptor.nodeFriendlyName );
68
+ parameter->output (0 ).get_tensor ().set_names (inputDescriptor.outputTensorNames );
69
+ parameters.push_back (parameter);
70
+ } else {
71
+ if (inputDescriptor.isStateInput || inputDescriptor.isStateOutput || inputDescriptor.isShapeTensor ||
72
+ inputDescriptor.isMainInputWeights ) {
73
+ continue ;
74
+ }
65
75
66
- parameter->set_friendly_name (inputDescriptor.nodeFriendlyName );
67
- parameter->output (0 ).get_tensor ().set_names (inputDescriptor.outputTensorNames );
68
- parameters.push_back (parameter);
76
+ std::shared_ptr<ov::op::v0::Parameter> parameter = std::make_shared<ov::op::v0::Parameter>(
77
+ inputDescriptor.precision ,
78
+ inputDescriptor.shapeFromIRModel .has_value () ? *inputDescriptor.shapeFromIRModel
79
+ : inputDescriptor.shapeFromCompiler );
80
+ parameter->set_friendly_name (inputDescriptor.nameFromCompiler );
81
+ parameter->output (0 ).get_tensor ().set_names (
82
+ std::unordered_set<std::string>{inputDescriptor.nameFromCompiler });
83
+ parameters.push_back (parameter);
84
+ }
69
85
}
70
86
71
87
// The "result" nodes require a parent node in order to satisfy the API conventions. Additionally, a dummy shape for
72
88
// the "Constant" node was required since the specific constructor does not accept "ov::PartialShape" values (a
73
89
// constant can't have dynamic shape). The dummy tensor was also brought in order to register the correct,
74
90
// potentially dynamic, output shape.
75
91
for (const IODescriptor& outputDescriptor : outputDescriptors) {
76
- if (outputDescriptor.isStateInput || outputDescriptor.isStateOutput || outputDescriptor.isShapeTensor ||
77
- outputDescriptor.isInitOutputWeights ) {
78
- continue ;
79
- }
92
+ if (!benchmarkInit) {
93
+ if (outputDescriptor.isStateInput || outputDescriptor.isStateOutput || outputDescriptor.isShapeTensor ||
94
+ outputDescriptor.isInitOutputWeights ) {
95
+ continue ;
96
+ }
97
+
98
+ std::shared_ptr<ov::Node> constantDummy =
99
+ std::make_shared<ov::op::v0::Constant>(outputDescriptor.precision , CONSTANT_NODE_DUMMY_SHAPE);
80
100
81
- std::shared_ptr<ov::Node> constantDummy =
82
- std::make_shared<ov::op::v0::Constant>(outputDescriptor.precision , CONSTANT_NODE_DUMMY_SHAPE);
101
+ const std::shared_ptr<ov::descriptor::Tensor>& tensorDummy =
102
+ std::make_shared<ov::descriptor::Tensor>(outputDescriptor.precision ,
103
+ outputDescriptor.shapeFromCompiler ,
104
+ outputDescriptor.outputTensorNames );
83
105
84
- const std::shared_ptr<ov::descriptor::Tensor>& tensorDummy = std::make_shared<ov::descriptor::Tensor>(
85
- outputDescriptor.precision ,
86
- outputDescriptor.shapeFromIRModel .has_value () ? *outputDescriptor.shapeFromIRModel
87
- : outputDescriptor.shapeFromCompiler ,
88
- outputDescriptor.outputTensorNames );
106
+ std::shared_ptr<ov::Node> result = std::make_shared<ov::op::v0::Result>(constantDummy);
107
+ result->output (0 ).set_tensor_ptr (tensorDummy);
108
+
109
+ result->set_friendly_name (outputDescriptor.nodeFriendlyName );
110
+ results.push_back (result);
111
+ } else {
112
+ if (outputDescriptor.isStateInput || outputDescriptor.isStateOutput || outputDescriptor.isShapeTensor ) {
113
+ continue ;
114
+ }
89
115
90
- std::shared_ptr<ov::Node> result = std::make_shared<ov::op::v0::Result>(constantDummy);
91
- result->output (0 ).set_tensor_ptr (tensorDummy);
92
- result->set_friendly_name (outputDescriptor.nodeFriendlyName );
93
- results.push_back (result);
116
+ std::shared_ptr<ov::Node> constantDummy =
117
+ std::make_shared<ov::op::v0::Constant>(outputDescriptor.precision , CONSTANT_NODE_DUMMY_SHAPE);
118
+
119
+ const std::shared_ptr<ov::descriptor::Tensor>& tensorDummy = std::make_shared<ov::descriptor::Tensor>(
120
+ outputDescriptor.precision ,
121
+ outputDescriptor.shapeFromCompiler ,
122
+ std::unordered_set<std::string>{outputDescriptor.nameFromCompiler });
123
+
124
+ std::shared_ptr<ov::Node> result = std::make_shared<ov::op::v0::Result>(constantDummy);
125
+ result->output (0 ).set_tensor_ptr (tensorDummy);
126
+
127
+ result->set_friendly_name (outputDescriptor.nameFromCompiler );
128
+ results.push_back (result);
129
+ }
94
130
}
95
131
96
132
return std::make_shared<ov::Model>(results, parameters);
@@ -589,6 +625,12 @@ Plugin::Plugin()
589
625
[](const Config& config) {
590
626
return config.getString <SEPARATE_WEIGHTS>();
591
627
}}},
628
+ {ov::intel_npu::benchmark_init.name (),
629
+ {false ,
630
+ ov::PropertyMutability::RW,
631
+ [](const Config& config) {
632
+ return config.getString <BENCHMARK_INIT>();
633
+ }}},
592
634
};
593
635
594
636
for (auto & property : _properties) {
@@ -860,16 +902,22 @@ std::shared_ptr<ov::ICompiledModel> Plugin::import_model(std::istream& stream, c
860
902
auto graph = compiler->parse (std::move (blob), localConfig);
861
903
graph->update_network_name (" net" + std::to_string (_compiledModelLoadCounter++));
862
904
863
- const std::shared_ptr<ov::Model> modelDummy =
864
- create_dummy_model (graph->get_metadata ().inputs , graph->get_metadata ().outputs );
865
-
866
- compiledModel = std::make_shared<CompiledModel>(modelDummy,
867
- shared_from_this (),
868
- device,
869
- graph,
870
- localConfig,
871
- initGraph,
872
- initModel);
905
+ if (!localConfig.get <BENCHMARK_INIT>()) {
906
+ const std::shared_ptr<ov::Model> modelDummy =
907
+ create_dummy_model (graph->get_metadata ().inputs , graph->get_metadata ().outputs );
908
+ compiledModel = std::make_shared<CompiledModel>(modelDummy,
909
+ shared_from_this (),
910
+ device,
911
+ graph,
912
+ localConfig,
913
+ initGraph,
914
+ initModel);
915
+ } else {
916
+ const std::shared_ptr<ov::Model> modelDummy =
917
+ create_dummy_model (initGraph->get_metadata ().inputs , initGraph->get_metadata ().outputs , true );
918
+ compiledModel =
919
+ std::make_shared<CompiledModel>(modelDummy, shared_from_this (), device, initGraph, localConfig);
920
+ }
873
921
}
874
922
} catch (const std::exception & ex) {
875
923
OPENVINO_THROW (" Can't import network: " , ex.what ());
0 commit comments