
英語| 簡體中文
要編輯ONNX模型,一種常見的方法是可視化模型圖,並使用ONNX Python API進行編輯。這很好。但是,我們必須編碼進行編輯,然後可視化以進行檢查。這兩個過程可能會迭代多次,這很耗時。
如果我們有一個工具,該工具使我們能夠以完全可視化的方式編輯和預覽編輯效果怎麼辦?
然後onnx-modifier來了。有了它,我們可以專注於在可視化平台中編輯模型圖。所有編輯信息將終於會自動匯總和處理。然後我們的時間可以節省!
onnx-modifier是基於流行的網絡查看器Netron和輕量級Web應用程序框架瓶構建的。
目前,支持以下編輯操作:
✅刪除節點
✅添加新節點
✅重命名節點輸入和輸出
✅重命名模型輸入和輸出
✅添加新的型號輸出
✅添加新模型輸入
✅編輯模型輸入形狀
✅節點的編輯屬性
✅編輯模型初始化器
這是更新日誌和待辦事項列表。這是設計概述,這可能對想要為該項目做出貢獻的人有幫助。
希望它有幫助!
我們現在有三種啟動onnx-modifier方法。
克隆回購併通過
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txt然後運行
python app.py單擊燒瓶生成的輸出信息中的URL(默認為http://127.0.0.1:5000/ ),然後將在Web瀏覽器中啟動onnx-modifier 。
我記錄瞭如何在
app_desktop.py中製作可執行文件。其他平台的可執行文件將供將來的工作。
我們創建一個像這樣的碼頭容器:
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifier構建容器後,我們通過映射Docker端口和本地文件夾modified_onnx運行ONNX模型
mkdir -p modified_onnx
docker run -d -t
--name onnx-modifier
-u $( id -u ${USER} ) : $( id -g ${USER} )
-v $( pwd ) /modified_onnx:/modified_onnx
-p 5000:5000
onnx-modifier然後,我們可以從URL http://127.0.0.1:5000訪問ONNX-Modifer。預計修改後的ONX型號將在本地文件夾modified_onnx內找到。
單擊Open Model...上傳ONNX模型進行編輯。該模型將被解析並顯示在頁面上。
圖級操作元素放在頁面的左上角上。當前,有三個按鈕: Reset , Download和Add node 。他們可以做:
Reset :將整個模型圖重置為其初始狀態;Download :將修改的模型保存到磁盤中。注意右側的兩個複選框shape inference以進行形狀推斷。shape inference功能建立在Onnx-Tool上,這是一個強大的ONNX第三方工具。clean up以刪除未使用的節點和張量(例如Onnx GraphSurgeon)。Add node :在模型中添加一個新節點。節點級操作元素都在側邊欄中,可以通過單擊特定節點來調用。
讓我們仔細看一下。
有兩種模式用於刪除節點: Delete With Children和Delete Single Node 。 Delete Single Node僅刪除單擊節點,而Delete With Children也刪除了紮根於單擊節點上的所有節點,如果我們想刪除長節點的長路徑,這很方便且自然。
Delete With Children的實施是基於回溯算法。
為了預覽,刪除的節點首先處於灰色模式。如果錯誤刪除了節點, Recover Node按鈕可以幫助我們將其恢復回圖。單擊Enter按鈕將刪除操作生效,然後更新的圖將在頁面上自動顯示。
下圖顯示了一個典型的刪除過程:

有時,我們希望將新節點添加到現有的模型中。 onnx-modifier現在實驗支持此功能。
請注意,有一個Add node按鈕,然後在索引頁面的左上方帶有選擇器元素。為此,我們需要做的是3個步驟一樣容易:
選擇選擇器中的節點類型,然後單擊Add node按鈕。然後,所選類型的空節點將在圖表上出現。
選擇器包含
ai.onnx(171),ai.onnx.preview.training(4),ai.onnx.ml(18)和com.microsoft(1)的域中的所有受支持的操作員類型。
單擊新節點,然後在調用的Siderbar中進行編輯。我們需要填充的是節點屬性(默認情況下undefined )及其輸入/輸出(它們決定將節點插入在圖中的位置)。
我們完成了。

以下是此功能的一些註釋:
通過單擊?在NODE PROPERTIES -> type元素或每個Attribute元素中的+中,我們可以獲取一些參考來幫助我們填寫節點信息。
建議填充所有Attribute ,而不會使其undefined 。在當前版本中,默認值可能不受很好的支持。
對於帶有類型list的Attribute ,項目用, '(逗號)分開。請注意,不需要[] 。
對於帶有類型list的Inputs/Outputs ,當前版本中它最多是8個元素。如果實際輸入/輸出數量小於8,則可以將未使用的項目留下以list_custom開頭的名稱,並且將自動省略。
通過更改節點的輸入/輸出名稱,我們可以更改模型向前路徑。如果我們要重命名模型輸出,也可能會有所幫助。
使用onnx-modifier ,我們可以通過在其相應的輸入佔位符中輸入節點輸入/輸出的新名稱來實現這一目標。根據新名稱,將自動,立即更新圖形拓撲。
例如,現在我們要刪除下圖中顯示的預處理操作員( Sub->Mul->Sub->Transpose )。我們可以
Conv節點,將其輸入(X)重命名為serving_default_input:0 (node data_0的輸出)。Conv鏈接。此外,預處理操作員已從主要例程分開。刪除它們。Download ,然後我們可以獲取修改後的ONNX模型)。注意:要鏈接節點
$ a $ (在上面示例中的data_0)到節點$ b $ (上面示例中的第一個Conv),建議編輯節點的輸入$ b $ 到節點A的輸出,而不是編輯節點的輸出$ a $ 到節點B的輸入。因為$ b $ 也可以是其他節點的輸出(在上面的示例Transpose),並且會發生意外結果。
該過程如下圖所示:

單擊模型輸入/輸出節點,在側邊欄中鍵入新名稱,然後我們完成。

有時,我們想將某個節點的輸出設置為模型輸出。例如,我們想提取中間層輸出以進行細粒分析。在onnx-modifier中,我們可以通過單擊相應節點的側邊欄中的Add Output按鈕來實現這一目標。然後,我們可以按照相應的節點獲得一個新的模型輸出節點。它的名稱與相應節點的輸出相同。
在下面的示例中,我們添加了2個新的模型輸出,它們分別是第一個Conv節點和第二個Conv節點的輸出。

有時,我們需要將輸入添加到模型(例如從原始模型中提取的子模型)。在onnx-modifier中,我們可以通過:

注意:輸入形狀在“ dtype [dim0,dim1,...]”格式中假定,例如“ float32 [1,3,224,224]”。否則警告顯示,“確認”按鈕將被禁用。此外,有時可以通過分析模型(我們可以信任)預先填充輸入形狀。如果沒有,我們應該手動設置它。
將原始屬性更改為新值,然後我們完成了。
通過單擊佔位符右側的
+,我們可以獲得一些有用的參考。

onnx-modifier現在支持編輯輸入形狀。單擊目標模型輸入,然後單擊Change input shape (static)按鈕。在彈出對話框中,為輸入設置一個新形狀,然後單擊“確認”。下載的修改模型將更新DownsRteam Tensor形狀(而不是立即在Pannel中進行更新,因為單擊“下載”後將應用形狀推理過程)。
onnx-modifier還支持更改輸入為動態。目前,僅支持批處理維度。只需單擊Set dynamic batch size按鈕,我們就會獲得一個支持動態批處理大小推理的模型。
有時,我們想編輯存儲在模型初始化器中的值,例如卷積層的重量/偏差或Reshape節點的形狀參數。 onnx-modifier現在支持此功能!在調用的側邊欄中輸入一個初始化器的新值,然後單擊下載,然後我們完成。

注意:對於新添加的節點,我們還應輸入初始化器的數據類型。 (如果我們不確定數據類型是什麼,請單擊
NODE PROPERTIES->type->?我們可能會得到一些線索。)
最新版本(2023.12.10之後)支持從Numpy文件讀取初始化器值!只需單擊“打開 *.npy”按鈕,然後選擇numpy文件,該值將在上述佔位符中解析並顯示。可以進一步編輯這些值。

為了進行快速測試,提供了一些典型的樣本模型如下。其中大多數來自ONNX模型動物園
onnx-modifier正在積極開發中?歡迎使用,創建問題並提取請求! ?