onnx-modifier:ONNX可视化编辑

请添加图片描述
欢迎转载。转载请注明原文链接

本文可能未及时更新,请点击onnx-modifier github仓库查看最新版本和特性。

ONNX(Open Neural Network Exchange) 是一种针对机器学习所设计的开放式的文件格式,经常作为不同框架模型转化的中间文件。有时我们拿到ONNX文件,想将它进行一些修改,比如:

  • 删除部分节点。 比如,ONNX文件中一些前后处理的算子节点,以方便后续部署。
  • 修改节点输入输出名。 比如修改某一节点的输入输出名称,更改模型拓扑结构。
  • 编辑节点属性值
  • 增加新节点

目前常用的方法是,先可视化模型图结构,然后基于ONNX的Python API编写脚本,对模型图结构进行编辑。但这可能需要我们在可视化-脚本-可视化-…之间反复横跳。而且在一张庞大的图上搜集想要修改的节点,也比较繁琐耗时。👋

能不能有一个工具,可以实时预览编辑后的可视化效果,从而更方便,快捷,直观地实现ONNX模型的编辑呢?🚀 这便是onnx-modifier (github)开发的动机。所有的编辑信息将最终汇总,统一送由ONNX Python API处理,得到编辑后的ONNX模型文件。

目前已支持下列操作:

  • 删除/恢复节点
    • 删除单个节点
    • 删除一个节点及所有以该节点为根节点的子节点
    • 恢复误删的节点
  • 修改节点输入输出名
  • 编辑节点属性值
  • 增加新节点(beta)

onnx-modifier基于流行的模型可视化工具 Netron 和轻量级Web应用框架 flask 开发。希望它能给社区带来一些贡献~

安装与运行

  • 拉取onnx-modifier,安装所需要的Python库

    git clone git@github.com:ZhangGe6/onnx-modifier.git
    cd onnx-modifier
    
    pip install onnx
    pip install flask
    
  • 运行

    python app.py
    

    点击输出中的url(如http://127.0.0.1:5000/),即可在浏览器中进入onnx-modifier界面。点击Open Model...,上传所需要编辑的模型文件,上传完毕后,网络可视化结构会自动显示。

用法

图结构层级的操作按钮放置在可视化页面的左上角,目前有四个:RefreshResetDownloadAdd node. 它们的功能分别为:

  • Refresh:刷新界面,预览当前编辑得到的模型图结构;

    在当前版本里,模型图结构会在每次编辑操作后即时自动更新,无需手动刷新。所以该按钮用到的次数会比之前的版本里少上不少(解放双手🙌)。

  • Reset:重置模型图结构为导入时的初始状态;

  • Download:保存编辑后的模型文件到本地。

  • Add node:向当前模型中,添加新节点。

节点层级的操作都在节点侧边栏里,点击某一节点后即可弹出。

一起来详细康康。

删除/恢复节点

删除节点有两种模式:Delete With ChildrenDelete Single Node. 后者只删除当前单个节点;而前者还会自动删除以这个节点为根节点的所有子节点,当我们需要删除一长串节点时,这个功能会比较有用。

Delete With Children基于回溯算法实现。

执行删除操作后,被删除的节点首先会变灰显示,以供预览。如果某一个节点被误删了,在该节点的侧边栏点击Recover Node即可以将其恢复到图中。预览确认删除操作无误后,点击Enter,图结构会刷新,显示节点删除后的状态。

一个典型的删除操作如下图所示:请添加图片描述

修改节点输入输出名

通过修改节点的输出输出名,我们可以对模型拓扑结构进行修改(如删除一些预处理/后处理节点)。该功能同样可以用在更改模型的输出的名称(即修改模型叶子节点的输出名)。

那在onnx-modifer中要怎么做呢?很简单,找到节点侧边栏的输入输出对应的输入框,键入新的名称就可以啦。图结构会根据键入的名称即时自动刷新。

举个栗子,在下图所示的模型中,我们想要删除预处理对应的节点(Sub->Mul->Sub->Transpose),可以这样做:

  1. 点击第一个Conv节点,在弹出的属性栏中,将输入名称改为serving_default_input:0 (data_0节点的输出名);
  2. 图结构自动刷新,可以发现,输入节点已经和第一个Conv节点直接相连,几个预处理节点也已经从前向图中分离出来,将它们删除;
  3. 完工(点击Download就可以获得编辑后的ONNX模型啦)。

如果我们希望通过修改,让节点 A A A(比如上例中的data_0节点)连向节点 B B B(比如上例中的第一个Conv节点),建议的方式是:将节点 B B B的输入名称修改为节点 A A A的输出名称,而不是把 A A A的输出名称修改为节点 B B B的输入名称。 因为节点 B B B的输入名称可能同时为其他节点(比如上例中的Transpose节点)的输出名称,会导致一些预料外的结果。

上例的修改过程如下图所示:
请添加图片描述

编辑节点属性值

在节点侧边栏对应的属性值输入框中,键入新的属性值即可。

点击属性值输入框右侧的+,可显示该属性的参考信息。
请添加图片描述

增加新节点(beta)

有时候我们希望向模型中添加新节点。onnx-modifier已开始支持该功能。

在主页面的左上方,有一个Add node按钮和一个selector选择器,我们可以通过这二者的配合,完成节点的添加,只需3步:

  1. 在selector中选择要添加的节点类型,在点击Add node按钮后,一个对应类型的新节点将自动出现在图上。

    selector中包含来自ai.onnx(171), ai.onnx.preview.training(4), ai.onnx.ml(18) 和 com.microsoft(1)的所有节点类型。

  2. 点击这个新节点,在弹出的侧边栏中进行节点的编辑:

    • 节点属性:初始化为null (显示为undefined)。同上节,在对应的属性框中输入新值即可。
    • 修改节点输入输出名。输入输出名决定了节点将插入在图结构中的位置。
  3. 完工(点击Download即可获得编辑后的ONNX模型)。
    请添加图片描述

以下是该功能的一些提醒和小tip:

  1. 在当前版本中,是不支持添加含有参数的节点的(比如Conv, BatchNormalization)。其他大多数节点,在我的测试中,可正确添加(比如Flatten, ArgMax, Concat)。
  2. 点击selector,输入要添加的节点的首字母(比如Flattenf),可帮我们定位到以该字母开头的节点列表区域,加快检索速度。
  3. 点击节点侧边栏的NODE PROPERTIEStype框右侧的?,和节点属性框右侧的+,可以显示关于当前节点类型/属性值的参考信息。
  4. 为确保正确性,节点的各属性值建议全部填写(而不是留着undefined)。默认值在当前版本可能支持得还不够好。
  5. 如果一个属性值是列表类型,则各元素之间使用‘,’分隔。
  6. 在当前版本中,如果一个节点的输入/输出是一个列表类型(如Concat),限制最多显示8个。如果一个节点实际输入/输出小于8个,则填写对应数目的输入输出即可,多出来的应以list_custom开头,它们会在后续处理中自动被忽略。
  7. 这个功能还处在开发中,可能会不够鲁棒。所以如果大家在实际使用时碰到问题,非常欢迎提issue!

onnx-modifer正在活跃地更新中🛠。 欢迎使用,提issue,如果有帮助的话,感谢给个⭐️~

示例模型文件

为方便测试,以下提供一些典型的样例模型文件,主要来自于onnx model zoo

参考资料

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值