
英语| 简体中文
要编辑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正在积极开发中?欢迎使用,创建问题并提取请求! ?