通常,模型的输入是 预处理过的nchw 格式的张量,但有时我们可能希望直接将原始图像输入模型。 在这种情况下,我们需要将预处理操作作为模型的一部分。我们目前支持这些类型的图像输入,它们对应不同的像素和通道格式。 其中一些是专门针对 cv 系列芯片的,所以这部分我们暂且先不深入探讨。
对于预处理类型,我们目前可以做一些典型的预处理操作,包括中心裁剪、转置、像素格式变换和归一化,更多类型的操作会在未来完成。
那么,我们怎样才能得到一个包含预处理操作的bmodel呢?
首先,我们像往常一样进行 model_transform 以获得top层的mlir 文件。但是在 model_deploy 步骤中,我们需要指定 fuse-preprocess 参数。 一旦指定了这个参数,test_input 应该是一个图像而不是 numpy 数组。对于自定义格式,如果不指定,它会被默认设置为和preprocesse infor一致。
在我们将它提供给模型之前,我们仍然需要对图像数据做一些工作,包括:
调整图像到指定尺寸。
将数据扩展为4维。
并转换为ui8 numpy 数组。这里数据格式是 unsinged int8,因为像素值范围是0到255的整数值。
通过运行带有 fuse-preprocess 参数的 model_deploy 接口,tpu-mlir 将从 inputop 收集所有必要的预处理和校准信息,然后将它们保存在 inputop 之后的 preprocessop 中。
如果没有提供校准表,这意味着我们得到一个不需要任何校准信息的纯浮点型bmodel,在这种情况下我们实际上也不需要任何校准信息。
接下来,我们会对inputop进行修改,特别是type,由于模型的输入是unsigned int8张量,所以我们需要将其设置为ui8的均匀量化类型。 您会发现量化参数只是单纯设置为 1,因为我们将真实的校准信息保存在preprocessop中了。接着,func type也要修改,以保证其和inputop的type一致。完成所有这些工作后,该模型的输入现在已修改为图像。
这里我们便可以开始lower到 tpu dialect。
在这个阶段,如果我们处于f32等浮点量化模式,在 inputop 之后会插入一个 castop,将数据从整数转换为浮点数,以确保类型的一致性。由于 inputop 的量化参数已经被设置为 1。对于 f32,我们就相当于只是单纯进行类型转换。
接下来,我们将开始插入算子,首先在模型中设置插入点,然后在输入图像为nhwc格式时插入permuteop。当resize_dim与模型输入形状不同时,sliceop 会被用来进行裁剪的工作。
之后我们会在castop后设置一个新的插入点,scaleop在这里会被用来完成归一化操作。然后,我们还将添加 swapchannelop 以进行 rgb 和 bgr之间的转换。完成所有算子插入工作后,我们将删除 preprocessop,它就像一个占位符一样,利用完后就该跟它说再见了。
但是预处理融合工作还没有完成,这里我们还可以做一些优化。
如果模型原本的第一个算子是conv2d,那么其filter的输入通道一定是3,对应输入图像数据的3个颜色通道。
所以我们可以通过简单地转换filter的输入通道来替换swapchannelop。至此,预处理工作结束。
在int8 量化模式下,情况就有点不同了,
首先,因为所有操作都是int8类型,所以不会有castop被插入。
其次,因为我们想对int8数据进行归一化操作,并且结果仍然是 int8,所以我们将插入 scalelutop 而不是 scaleop。
scalelutop 就像我们在用查找表的方式进行均匀量化,也就是说我们预先计算出所有 256 个可能的量化结果并保存在表中,然后我们可以在推理时直接从表中得到结果。
但是由于我们有 3 对mean和scale,所以我们必须创建3个表来对每个通道的元素分别进行量化。
需要注意的一点是,当所有均值为零时,我们假设它是unsigned int8量化,否则我们就做signed int8量化。
当然,有时候我们会遇到所有scales_new都等于1,所有means都为0的情况。 在这种情况下,scalelutop 实际上对输入数据什么都不做,所以我们将跳过这个插入部分。
另外,在tpu-mlir中我们也可能会使用mix precision模式,比如在int8量化模式下对原始的首个op做浮点运算或者在fp量化模式下对原始的首个op做int8运算。
在前者中,将在 preprocessop 和原始第一个 op 之间插入一个 castop,以将 int8 数据转换为fp,对于这种情况,fuse preprocess步骤将与 int8 量化模式下相同。
但是对于后者,我们可以看到两个castop的作用其实相互抵消了,所以我们可以将它们删除并再次像 int8量化模式一样进行fuse preprocess操作。
dfrobotM1 Dock AI开发套件简介
第三类储存技术 比U盘快一万倍
计算机主板诊断卡单芯片——CH311
rumqttc模块应用实践
研究机构合作开发新的高温聚合物电解质膜燃料电池技术
TPU-MLIR中的融合处理
解读索尼电视DLNA/屏幕镜像功能怎么使用
人工智能在日常生活中的十大应用
执法记录仪移动监控调度指挥管理平台的建设及及应用功能实现
48万节废旧电池被弃104团蔬菜大棚附近
如何合理设计家居灯具
人工智能叩开智能化战争大门
绿色节能,恩智浦助你完成低功耗电源设计
资本看好工业机器人 看配天机器人如何解决需求问题
家里路由器信号不好穿墙不行 影响因素由实际情况而定
交流接触器选大了会怎样_交流接触器声音大怎么处理
针对5GtoB的行业数字化机会,正式发布了华为5GtoB解决方案
电动牙刷好吗?给牙齿做个SPA吧
MS90C386芯片概述、主要特点及典型应用
A3CUBE发布数据中心存储系统及网络接口卡