內容來源| 曹慧燕
內容排版| 張洺瑄
*music by audionautix.com
今天我們一起來學習MO Extension中的Graph Transformation。在模型轉換的Pipeline中,有Front Phrase, Middle Phrase 以及 Back Phrase的Graph Transformation。MO中提供了不同的基類來實現這些Transformation,這些基類都有一些共同的屬性和方法。
●enabled屬性指定該Transformation是否開啟。在模型轉換的過程中,該值可以在運行期動態修改。默認值為True。
●id屬性唯一標識每個Transformation。除了可以通過enabled屬性來設置Transforamtion是否開啟以外,還可以通過以逗號分隔的id列表來設置環境變量MO_ENABLED_TRANSFORMS (MO_DISABLED_TRANSFORMS),從而決定這些Transformation是否開啟。環境變量的值會覆蓋enabled屬性。id屬性是Optional屬性。
●run_not_recursively屬性指定該Transformation是否在sub-graphs中被執行,比如TensorIterator 和 Loop 的body。默認值為 True。
●force_clean_up屬性指定在該Transformation之後是否立即清理graph。清理graph會移除graph中所有從model inputs到達不了的節點。默認值為False。
●force_shape_inference屬性指定在該Transformation之後,need_shape_inference屬性值為True的節點是否需要重新執行shape inference。模型優化器為在轉換過程中inputs發生改變的節點自動設置此屬性,或者開發人員可以在轉換過程中為特定節點手動設置此屬性。默認值為False。
●graph_condition 屬性指定一組函數,改組函數都只有一個參數 - Graph對象。只有所有的函數都返回True以後該Transformation才會執行。如果這個屬性沒有設置值,則不做任何check。
●run_before()方法返回一組該Transformation必須在其之前執行Transformations。
●run_after()方法返回一組該Transformation必須在其之後執行的Transformations。
為了保證不同階段的Transformation的執行順序,模型優化器定義了一些Anchor Transformation,這些Anchor Transformation並沒有任何實際的操作。用戶自定義的transformations默認在對應的Start 和Finish anchor transformations之間執行(如果run_before() 和run_after()沒有被重寫的話 )。Front Phase Transformations
●Pattern-Defined Front Phase Transformations – 當sub-graph匹配定義的Pattern時會觸發。
●Specific Operation Front Phase Transformations – 當節點匹配指定op 屬性值時會觸發。
●Generic Front Phase Transformations
●在JSON配置文件中定義Transformation,並通過命令行參數 --transformations_config指定,從而手動開啟Transformation。(僅支持TensorFlow*, ONNX* 和MXNet*模型)
○Node Name Pattern Front Phase Transformations○Front Phase Transformations Using Start and End Points○Generic Front Phase Transformations Enabled with Transformations Configuration FilePattern-Defined Front Phase Transformations
模型優化器中定義了mo.front.common.replacement.FrontReplacementSubgraph 和mo.front.common.replacement.FrontReplacementPattern 作為該類Transformation 的基類,工作方式如下:1. 開發者定義一個需要被轉換的sub-graph pattern,該sub-graph由一組節點和邊組成。
2. 模型優化器會在原始圖中查找所有匹配的sub-graph。
3. 模型優化器執行開發者自定義的函數對每個匹配到的sub-graph進行graph transformation。開發者可以重載基類中不同的函數:
a. 重載replace_sub_graph(self, graph, match)方法。這種情況下,模型優化器僅執行重載函數,傳入graph對象及描述sub-graph pattern的dictionary。開發者需要自己實現transformation並將新生成的節點連接到graph中。
b. 重載generate_sub_graph(self, graph, match) 方法。該方式太複雜,不推薦使用。
要匹配的sub-graph的pattern在pattern()函數中定義,該函數返回一個dictionary,dictionary中包含兩個key:nodes 和edges:●Nodes的value是一組包含兩個elements的tuples
○第一個element是node的別名,在定義edges及transformation函數中會使用。
○第二個element是一個node屬性的dictionary。Key是屬性的名稱,value是屬性的值,可以是一個要匹配的特定的值,或者是一個以屬性值為參數的函數,該函數返回屬性是否匹配。
●Edges的value是一組包含兩個或三個elements的tuples
○第一個element是生成tensor的node的別名
○第二個element是使用該tensor的node的別
○第三個element(可選)是edge屬性的dictionary。通常,該dictionary包含類似in 和out 之類的定義input和output ports的屬性。
看一個front phrase transformation的例子:extensions/front/Mish_fusion.py,該轉換將定義Mish 激活函數的sub-graph融合為單個操作:https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_customize_model_optimizer_Customize_Model_Optimizer.html----
*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.
----
OpenVINO 中文社區
微信號 : openvinodev
B站:OpenVINO中文社區
OSCHINA:OpenVINO 中文社區
「開放、開源、共創」
致力於通過定期舉辦線上與線下的沙龍、動手實踐及開發者交流大會等活動,促進人工智慧開發者之間的交流學習。
點擊閱讀原文立即體驗OpenVINO