OpenVINO Model Pass¶
ov::pass::ModelPass
is used for transformations that take entire ov::Model
as an input and process it.
Template for ModelPass transformation class
// template_model_transformation.hpp
class ov::pass::MyModelTransformation : public ov::pass::ModelPass {
public:
OPENVINO_RTTI("MyModelTransformation", "0");
bool run_on_model(const std::shared_ptr<ov::Model>& f) override;
};
// template_function_transformation.cpp
bool ov::pass::MyModelTransformation::run_on_model(const std::shared_ptr<ov::Model>& f) {
RUN_ON_MODEL_SCOPE(MyModelTransformation);
// Example transformation code
NodeVector nodes;
// Traverse nGraph Function in topological order
for (auto& node : f->get_ordered_ops()) {
// Check that number of input and output ports are equal to 1
if (node->inputs().size() == 1 && node->outputs().size() == 1) {
// Check that input and output shape a fully defined (not dynamic) and number of consumers equal to 1
Input<Node> input = node->input(0);
Output<Node> output = node->output(0);
if (input.get_partial_shape().is_static() && output.get_partial_shape().is_static() &&
output.get_target_inputs().size() == 1) {
nodes.push_back(node);
}
}
}
// Print types and names for collected nodes
for (auto& node : nodes) {
std::cout << "Type: " << node->get_type_info().name << std::endl
<< "Name: " << node->get_friendly_name() << std::endl;
}
// Return false because we didn't change nGraph Function
return false;
}
Using ov::pass::ModelPass
, you need to override the run_on_model
method where you will write the transformation code. Return value is true
if the original model has changed during transformation (new operation was added, or operations replacement was made, or node attributes were changed); otherwise, it is false
. Also ov::pass::ModelPass
based transformations can be executed via ov::pass::Manager
.