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

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

3天内不再提示

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

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

众所周知,一个完整的模型实际上是由一系列算子组成的,所以如果我们想让编译器更通用,那么支持尽可能多的算子就是一个绕不开的工作。

wKgZomTeybWAcNOYAAHzDXqnsac585.jpg

这样无论算子是来自onnx、Caffe、PyTorch中的哪个框架,我们都可以在TPU-MLIR中找到对应的算子来表达。

首先,要添加一个新的算子,我们就需要像前端转换那一集里提到的先进行算子定义。

wKgaomTeybiAVK57AANInlDchHo291.jpg

在 MLIR 中,您可以直接使用 TableGen 工具来完成定义工作,而不是自己实现所有包含每个算子的输入、输出和属性的 cpp 模板。

在 TPU-MLIR 中,不同 dialect 的算子定义在不同的 td 文件中,这些算子将在编译器 build 时注册在相应的 Dialect 下。

但是定义部分只是生成了模板,也就是说,我们的编译器还不知道这个算子会对输入张量做什么处理,所以我们需要通过实现相应目录下的 inference 方法来完成这部分工作。

wKgZomTeybqAM-D5AALgO5YwdwA540.jpg

在 Top dialect 中,除了 inference 接口,我们还需要为每个算子实现是 FLOPs 和 Shape 接口。 前者用于计算浮点运算量,后者用于在输出 shape 未知的情况下推理出输出 shape。

在 MLIR 中,我们有 RankedTensorType 和 UnRankedTensorType。

这些接口的声明是在 td 文件中被要求的,所以所有从 Top_Op 类派生的算子都需要声明这些接口。

同样,我们还必须为每个 Tpu 算子实现 inference 接口。 由于我们可以直接从 Top 算子获取 FLOPs 和 Shape 信息,所以这里不需要再实现这些接口。

wKgaomTeybuAIERzAAJkc8XaXlA185.jpg

由于 Top 和 Tpu 算子是在 CPU 上做推理工作,所以有时我们会把推理工作交给 oneDNN,一个跨平台的神经网络库,主要用于提高 CPU 上的推理性能。 不过这部分我就不再细说,如果大家有兴趣的话,我们可以再做一个视频来介绍一下。

所以如果大家想了解 oneDNN 的话,记得在视频底下留言让我们知道。

我们知道,TPU 算子最终会被用于不同硬件的代码生成,所以对于这个 Dialect 中的算子,需要为每个硬件实现额外的接口。

wKgZomTeyb2ACf7TAAI_YVs7gmE203.jpg

其中 LocalGenInterface 用于应用了 LayerGroup 的算子,而 没有应用 LayerGroup 的算子则会使用 GlobalGenInterface。 所以你会看到所有的算子中都有 GlobalGenInterface,但只有其中一部分算子实现了 LocalGen。

在 GlobalGen 中,张量在 Global Memory 里,因此我们需要做的是准备后端 API 所需的所有参数,例如算子的属性以及输入和输出张量的 Global 地址。

对于 LocalGen,张量位于 Local Memory 中,这意味着它已经完成了将 tensor 从 Global 到 Local Mmeory 的搬运,因此我们需要调用 local 的后端 API。 此外,在量化的情况下,有时我们需要计算缓冲区大小以存储中间结果。 这是因为中间结果通常以更高位的数据类型存储。 比如在 int8 量化中,我们需要先将计算结果存储为 int16 或者 int32 数据,然后再重新量化回 int8。

完成定义和接口实现工作后,还有一件需要完成的事情就是 lowering。

在 TopToTpu pass 中,我们需要应用算子转换的 Pattern set,这需要我们为每个硬件中的每个算子实现转换 Pattern。

wKgZomTeyb-AKahuAAOVTr0hooM046.jpg

一共要做 3 步,首先,在头文件中声明 Lowering pattern。 接着,实现该 Pattern, 然后将其添加到 Pattern set 中。

如本例所示,我们在实现 Pattern 部分主要要做的是将当前的 Top op 替换为对应的 Tpu op,并根据指定的量化模式设置该 op 的 Type。

至此,添加新算子的工作就完成了。

审核编辑:汤梓红

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

    关注

    1

    文章

    2706

    浏览量

    47701
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48626
  • 算子
    +关注

    关注

    0

    文章

    15

    浏览量

    7239
  • pytorch
    +关注

    关注

    2

    文章

    763

    浏览量

    12836
收藏 人收藏

    评论

    相关推荐

    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

    FP16转换报错的原因?

    /tpu-mlir_v1.2.8-g32d7b3ec-20230802/lib/libbackend_1684x.so(+0x3194f3) [0x7fafc50964f3] /workspace
    发表于 01-10 08:01

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

    清源塑胶经营. 供应TPU塑胶原料.副牌.再生颗粒料.TPU塑胶.TPU透明副牌. 再生粒子.白色.黑色.透明. 注塑料.挤出料. 压延等等..聚醚. 脂肪料. 聚酯料.硬度70A--98A.
    发表于 11-21 17:21

    供应TPU抽粒工厂.TPU再生工厂.TPU聚醚料.TPU聚酯料.TPU副牌透明.TPU副牌.TPU中低温料

    清源塑胶经营.进口.国内.供应TPU原料.副牌TPU塑胶.TPU透明副牌. 再生粒子.白色.黑色.透明. 注塑料.挤出料. 压延等等..聚醚. 脂肪料. 聚酯料.硬度70A--98A. 高硬度
    发表于 11-21 17:47

    在“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 312次阅读
    <b class='flag-5'>TPU-MLIR</b>中的融合处理

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

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

    基于STE的QAT算法

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

    TPU-MLIR之量化感知训练

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

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

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

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

    背景介绍TPU-MLIR的CodeGen是BModel生成的最后一步,该过程目的是将MLIR文件转换成最终的Bmodel。本文介绍了CodeGen的基本原理和流程,并记录了针对BM1684X等新架构
    的头像 发表于 11-02 08:34 852次阅读
    如何适配新架构?<b class='flag-5'>TPU-MLIR</b>代码生成CodeGen全解析!

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

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

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

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

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

    EinSum介绍EinSum(爱因斯坦求和)是一个功能强大的算子,能够简洁高效地表示出多维算子的乘累加过程,对使用者非常友好。本质上,EinSum是一个算子族,可以表示多种基础操作,如矩阵乘法
    的头像 发表于 02-19 13:08 163次阅读
    基于<b class='flag-5'>TPU-MLIR</b>:详解EinSum的完整处理过程!