OpenVINO モデルパス¶
ov::pass::ModelPass
は、ov::Model
全体を入力として受け取って処理する変換に使用されます。
ModelPass 変換クラスのテンプレート
// 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 OpenVINO transformation 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 the OpenVINO transformation function
return false;
}
ov::pass::ModelPass
を使用するには、変換コードを記述する run_on_model
メソッドをオーバーライドする必要があります。変換中に元のモデルが変更された場合 (新しい操作が追加されたか、操作の置換が行われたか、ノード属性が変更された場合)、戻り値は true
です。それ以外は false
です。また、ov::pass::ModelPass
ベースの変換は ov::pass::Manager
経由でも実行できます。