
英語| 简体中文
ONNXモデルを編集するには、1つの一般的な方法は、モデルグラフを視覚化し、ONNX Python APIを使用して編集することです。これは正常に機能します。ただし、編集するためにコーディングし、視覚化して確認する必要があります。 2つのプロセスは何度も繰り返される可能性がありますが、これは時間がかかります。
完全に視覚化された方法で編集効果を編集およびプレビューできるツールがある場合はどうなりますか?
その後、 onnx-modifier登場します。それを使用すると、視覚化パネルのモデルグラフの編集に焦点を当てることができます。すべての編集情報は、ついにPython Onnx APIによって要約および処理されます。その後、私たちの時間を節約できます!
onnx-modifierは、人気のあるネットワークビューアーNetronと軽量Webアプリケーションフレームワークフラスコに基づいて構築されています。
現在、次の編集操作がサポートされています。
nodeノードを削除します
new新しいノードを追加します
nodeノード入力と出力の名前を変更します
modelモデルの入力と出力の名前を変更します
bew新しいモデル出力を追加します
bew新しいモデル入力を追加します
modelモデルの入力形状を編集します
nodesノードの属性を編集します
model Model Initializersを編集します
これが更新ログとTODOリストです。デザインの概要は次のとおりです。これは、このプロジェクトに貢献したい人に役立つかもしれません。
それが役立つことを願っています!
現在、 onnx-modifier起動する3つの方法があります。
リポジトリをクローンし、必要なPythonパッケージをインストールします
git clone https://github.com/ZhangGe6/onnx-modifier.git
cd onnx-modifier
pip install -r requirements.txtその後、実行します
python app.py Flaskによって生成された出力情報のURLをクリックします(デフォルトはhttp://127.0.0.1:5000/ onnx-modifier Webブラウザーで起動されます。
app_desktop.pyで実行可能ファイルをどのように作成したかを記録しました。他のプラットフォームの実行可能ファイルは、将来の作業のために残されています。
このようなDockerコンテナを作成します。
git clone [email protected]:ZhangGe6/onnx-modifier.git
cd onnx-modifier
docker build --file Dockerfile . -t onnx-modifierコンテナを構築した後、dockerポートとローカルフォルダーmodified_onnxをマッピングしてonnx-modifierを実行します
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にアクセスできます。変更されたONNXモデルは、ローカルフォルダーmodified_onnx内に見つかると予想されます。
Open Model... ONNXモデルをアップロードして編集します。モデルは解析され、ページに表示されます。
グラフレベルの操作要素は、ページの左上に配置されます。現在、3つのボタンがあります: Reset 、 Download 、 Add node 。彼らはできる:
Reset :モデルグラフ全体を初期状態にリセットします。Download :変更されたモデルをディスクに保存します。右側の2つのチェックボックスに注意してくださいshape inferenceを選択します。shape inference機能は、強力なONNXサードパーティツールであるOnnx-Toolの上に構築されています。clean upします。Add node :新しいノードをモデルに追加します。ノードレベルの操作要素はすべてサイドバーにあり、特定のノードをクリックして呼び出すことができます。
よく見てみましょう。
ノードを削除するための2つのモードがあります。 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要素の+で、ノード情報を入力するのに役立つ参照を取得できます。
属性をundefinedのままにすることなく、すべてのAttributeを埋めることが提案されています。デフォルト値は、現在のバージョンではうまくサポートされていない場合があります。
タイプlistのAttributeの場合、アイテムは ' , '(comma)で分割されます。 []は必要ないことに注意してください。
タイプlistのInputs/Outputsの場合、現在のバージョンの最大8つの要素になることを余儀なくされています。実際の入力/出力番号が8未満の場合、 list_customで始まる名前の未使用のアイテムを残すことができ、それらは自動的に省略されます。
ノードの入力/出力名を変更することにより、モデルフォワードパスを変更できます。モデル出力の名前を変更する場合にも役立ちます。
onnx-modifierを使用して、対応する入力プレースホルダーにノード入力/出力の新しい名前を入力するだけでこれを実現できます。新しい名前に従って、グラフトポロジは自動的に即座に更新されます。
たとえば、次の図に示すように、プリプロレス演算子( Sub->Mul->Sub->Transpose )を削除する必要があります。我々はできる
Convノードをクリックし、入力(x)をsurving_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つの新しいモデル出力を追加します。これは、それぞれ1番目のConvノードと2番目のConvノードの出力です。

モデルに入力を追加する必要がある場合があります(元のモデルから抽出されたサブモデルなど)。 onnx-modifierでは、次のことを達成できます。

注:入力形状は、「dtype [dim0、dim1、...]」で想定されています。それ以外の場合は、警告表示と「確認」ボタンが無効になっています。さらに、モデルを分析することで入力形状を事前に満たすことができる場合があります(信頼できます)。そうでない場合は、手動で設定する必要があります。
元の属性を新しい値に変更すると、完了します。
プレースホルダーの右側で
+クリックすると、役立つ参照を取得できます。

onnx-modifier 、入力型の編集をサポートしています。ターゲットモデルの入力をクリックし、 Change input shape (static)ボタンをクリックします。ポップされたダイアログで、入力の新しい形状を設定し、[確認]をクリックします。 DownSRTEAMテンソルの形状は、「ダウンロード」がクリックされた後に形状推論プロセスが適用されるため、ダウンロードされた変更モデルではなく、パネルではなく即座に更新されます)。
onnx-modifier 、入力の変更も動的になるようにサポートしています。現在、バッチディメンションのみがサポートされています。 Set dynamic batch sizeボタンをクリックするだけで、動的バッチサイズの推論をサポートするモデルを取得します。
時には、畳み込み層の重み/バイアスやReshapeノードの形状パラメーターなど、モデル初期化装置に保存されている値を編集することがあります。 onnx-modifier今、この機能をサポートしています!呼び出されたサイドバーの初期イザーの新しい値を入力し、[ダウンロード]をクリックしてから、完了します。

注:新しく追加されたノードの場合、初期化のデータ型も入力する必要があります。 (データタイプが何であるかわからない場合は、
NODE PROPERTIES->type->?をクリックして、手がかりが得られる場合があります。)
最新バージョン(2023.12.10以降)は、numpyファイルからの初期化値の読み取り値をサポートしています! 「開く *.npy」ボタンをクリックして、numpyファイルを選択するだけで、値が解析され、上記のプレースホルダーに表示されます。値はさらに編集できます。

迅速なテストのために、いくつかの典型的なサンプルモデルが次のように提供されます。それらのほとんどは、ONNXモデル動物園からのものです
onnx-modifierアクティブな開発中ですか?使用、問題を作成し、リクエストをプルすることができます! ?