0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TPU-MLIR中的融合处理

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-08-18 11:29 次阅读

通常,模型的输入是 预处理过的NCHW 格式的张量,但有时我们可能希望直接将原始图像输入模型。 在这种情况下,我们需要将预处理操作作为模型的一部分。我们目前支持这些类型的图像输入,它们对应不同的像素和通道格式。 其中一些是专门针对 CV 系列芯片的,所以这部分我们暂且先不深入探讨。

对于预处理类型,我们目前可以做一些典型的预处理操作,包括中心裁剪、转置、像素格式变换和归一化,更多类型的操作会在未来完成。

wKgZomTeycOAUSK6AAIQT2P_8cE172.jpg

那么,我们怎样才能得到一个包含预处理操作的bmodel呢?

首先,我们像往常一样进行 model_transform 以获得Top层的mlir 文件。但是在 model_deploy 步骤中,我们需要指定 fuse-preprocess 参数。 一旦指定了这个参数,test_input 应该是一个图像而不是 numpy 数组。对于自定义格式,如果不指定,它会被默认设置为和preprocesse infor一致。

wKgaomTeycWAPE53AAIHHvI1EpE147.jpg

在我们将它提供给模型之前,我们仍然需要对图像数据做一些工作,包括:

调整图像到指定尺寸。

将数据扩展为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一致。完成所有这些工作后,该模型的输入现在已修改为图像。

wKgZomTeyceAeh7nAALZuYPa_Xw814.jpg

这里我们便可以开始lower到 Tpu Dialect。

在这个阶段,如果我们处于F32等浮点量化模式,在 InputOp 之后会插入一个 CastOp,将数据从整数转换为浮点数,以确保类型的一致性。由于 inputOp 的量化参数已经被设置为 1。对于 f32,我们就相当于只是单纯进行类型转换。

接下来,我们将开始插入算子,首先在模型中设置插入点,然后在输入图像为NHWC格式时插入permuteOp。当resize_dim与模型输入形状不同时,SliceOp 会被用来进行裁剪的工作。

wKgZomTeycmAF4Z_AALBsWTbMWM808.jpg

之后我们会在CastOp后设置一个新的插入点,ScaleOp在这里会被用来完成归一化操作。然后,我们还将添加 swapChannelOp 以进行 RGB 和 BGR之间的转换。完成所有算子插入工作后,我们将删除 preprocessOp,它就像一个占位符一样,利用完后就该跟它说再见了。

但是预处理融合工作还没有完成,这里我们还可以做一些优化。

wKgaomTeycuAeY21AAGNjTzlOzY493.jpg

如果模型原本的第一个算子是Conv2d,那么其filter的输入通道一定是3,对应输入图像数据的3个颜色通道。

所以我们可以通过简单地转换filter的输入通道来替换swapChannelOp。至此,预处理工作结束。

在INT8 量化模式下,情况就有点不同了,

wKgZomTeyc2AbiXDAAIIFKB6ZEE347.jpg

首先,因为所有操作都是int8类型,所以不会有CastOp被插入。

其次,因为我们想对int8数据进行归一化操作,并且结果仍然是 int8,所以我们将插入 scalelutOp 而不是 scaleOp。

ScaleLutOp 就像我们在用查找表的方式进行均匀量化,也就是说我们预先计算出所有 256 个可能的量化结果并保存在表中,然后我们可以在推理时直接从表中得到结果。
但是由于我们有 3 对mean和scale,所以我们必须创建3个表来对每个通道的元素分别进行量化。

wKgaomTeyc-AD49vAAJa5GsK-6w323.jpg

需要注意的一点是,当所有均值为零时,我们假设它是unsigned int8量化,否则我们就做signed int8量化。

当然,有时候我们会遇到所有scales_new都等于1,所有means都为0的情况。 在这种情况下,ScalelutOp 实际上对输入数据什么都不做,所以我们将跳过这个插入部分。

wKgZomTeydGAdt3EAAKM3BIDnS0552.jpg

另外,在TPU-MLIR中我们也可能会使用mix precision模式,比如在int8量化模式下对原始的首个OP做浮点运算或者在FP量化模式下对原始的首个OP做INT8运算。

wKgaomTeydSAVovwAAJz3ae5xSY336.jpg

在前者中,将在 preprocessOp 和原始第一个 op 之间插入一个 CastOp,以将 INT8 数据转换为FP,对于这种情况,fuse preprocess步骤将与 int8 量化模式下相同。

但是对于后者,我们可以看到两个CastOp的作用其实相互抵消了,所以我们可以将它们删除并再次像 int8量化模式一样进行fuse preprocess操作。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    455

    文章

    50784

    浏览量

    423450
  • 预处理
    +关注

    关注

    0

    文章

    33

    浏览量

    10479
  • TPU
    TPU
    +关注

    关注

    0

    文章

    141

    浏览量

    20723
收藏 人收藏

    评论

    相关推荐

    yolov5量化INT8出错怎么处理

    [Success]: tpuc-opt yolov5l_bm1684_int8_sym_tpu.mlir --mlir-disable-threading --strip-io-quant=\"
    发表于 01-10 06:40

    TPU-MLIR开发环境配置时出现的各种问题求解

    按照 TPU-MLIR 开发指南进行环境配置: 2.1. 代码下载 代码路径: https://github.com/sophgo/tpu-mlir 克隆该代码后, 需要在Docker编译
    发表于 01-10 08:02

    【算能RADXA微服务器试用体验】+ GPT语音与视觉交互:2,图像识别

    /download.sh 下载完成后,应该可以看到文件夹中出现以下模型: ./models ├── BM1684 │├── yolov8s_fp32_1b.bmodel# 使用TPU-MLIR编译,用于
    发表于 07-14 23:36

    TPU透明副牌.TPU副牌料.TPU抽粒厂.TPU塑胶副牌.TPU再生料.TPU低温料

    粒子.油杯透明料.TPU低温.温副牌.再生改性颗粒. 透明. 白色. 港宝料.留延产品.温度70--100度. 110-130度. 1.TPU透明:高透明手机套TPU料、导光
    发表于 11-21 17:21

    TPU副牌低温料.TPU热熔料.TPU温料.TPU低温塑胶.TPU低温抽粒.TPU温塑料

    .油杯透明料.TPU低温.温副牌.再生改性颗粒. 透明. 白色. 港宝料.留延产品.温度70--100度. 110-130度.长期仓库2000吨. 稳定供应客户.合作共赢. 另外采购进口.国内.TPU废薄膜.副牌粒子.***
    发表于 11-21 17:33

    在“model_transform.py”添加参数“--resize_dims 640,640”是否表示tpu会自动resize的?

    resize和letterbox的处理,在“TPU-MLIR入门快速指南.pdf”里的“使用TPU做前处理”里提到了“图像裁剪”,没看明白,能详细解释下的吗?
    发表于 09-18 07:56

    如何给TPU-MLIR添加新的算子

    如何给TPU-MLIR添加新的算子
    的头像 发表于 08-18 11:29 700次阅读
    如何给<b class='flag-5'>TPU-MLIR</b>添加新的算子

    如何使用TPU-MLIR进行模型转换

    TPU-MLIR之精度验证
    的头像 发表于 08-21 10:41 717次阅读
    如何使用<b class='flag-5'>TPU-MLIR</b>进行模型转换

    基于STE的QAT算法

    TPU-MLIR之量化感知训练(下)
    的头像 发表于 08-21 10:46 658次阅读
    基于STE的QAT算法

    TPU-MLIR之量化感知训练

    TPU-MLIR之量化感知训练(上)
    的头像 发表于 08-21 10:47 804次阅读
    <b class='flag-5'>TPU-MLIR</b>之量化感知训练

    TPU-MLIR量化敏感层分析,提升模型推理精度

    背景介绍TPU-MLIR编译器可以将机器学习模型转换成算能芯片上运行的bmodel模型。由于浮点数的计算需要消耗更多的计算资源和存储空间,实际应用往往采用量化后的模型(也称定点模型)进行推理。相比
    的头像 发表于 10-10 10:17 1376次阅读
    <b class='flag-5'>TPU-MLIR</b>量化敏感层分析,提升模型推理精度

    如何适配新架构?TPU-MLIR代码生成CodeGen全解析!

    的CodeGen重构过程。与后端的关系由于一些历史的因素,MLIR文件的每个OP对应的指令并不直接在TPU-MLIR工程中生成,而是需要调用后端的函数完成最终指
    的头像 发表于 11-02 08:34 1715次阅读
    如何适配新架构?<b class='flag-5'>TPU-MLIR</b>代码生成CodeGen全解析!

    深入学习和掌握TPU硬件架构有困难?TDB助力你快速上手!

    TDB介绍TDB(TPUDeBugger)是针对TPU-MLIR编译出来的BModel设计的一系列调试工具集合,可以支持对BModel反汇编、结构可视化、单步执行仿真等功能,使用方法灵活。能够
    的头像 发表于 12-22 08:33 716次阅读
    深入学习和掌握<b class='flag-5'>TPU</b>硬件架构有困难?TDB助力你快速上手!

    如何高效处理LMEM的数据?这篇文章带你学会!

    WeightReorder是TPU-MLIR的一个pass(参考TPU-MLIR编译流程图),其完成了对部分常量数据的Layout变化和合并。本文介绍其中ConvlotionKernel
    的头像 发表于 01-19 08:33 825次阅读
    如何高效<b class='flag-5'>处理</b>LMEM<b class='flag-5'>中</b>的数据?这篇文章带你学会!

    基于TPU-MLIR:详解EinSum的完整处理过程!

    、Reduce。EinSum支持任意多的输入,只要计算只包含点乘(element-wise)、广播(broadcast)、归约求和(reductionsum)都可以使
    的头像 发表于 02-19 13:08 687次阅读
    基于<b class='flag-5'>TPU-MLIR</b>:详解EinSum的完整<b class='flag-5'>处理</b>过程!