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

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

3天内不再提示

TPU-MLIR之量化感知训练

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-08-21 10:47 次阅读

Hello大家好,在之前的视频中我们的讲解主要集中在训练后量化,也就是PTQ,那么这期视频我们就再来讲一下另一种主要的量化类型,量化感知训练,我们暂且不会涉及到QAT在TPU-MLIR中的应用,只是先停留在理论层面进行一个介绍。

我们在学习PTQ的时候知道了量化其实就是一个寻找合适的量化参数,将高位数据流映射为低位数据流的过程,实现模型轻量化并且提高推理效率,但在这个过程中模型的精度不可避免地会下降。

wKgaomTeygOAOMSWAAIpcf5KceA393.jpg

造成精度下降的原因有很多,其中主要有:

量化误差的引入,就像右边这张信号图所示,我们在量化时做的取整操作其实就是用有限的离散取值去近似无限的连续取值,会不可避免的导致量化后的信号与量化前的信号有一定的偏差,当这种偏差越大时量化误差往往也就越大。

而且Weight 与activation tensor用INT8来表示则不可避免地也会出现一定的信息损失,例如我们之前提到的截断误差,并且模型在进行Multiply-Accumulate操作中会采用INT32来接收累加的结果,然后将累加的结果再转换回INT8,这个过程可能也会导致一定的截断误差。上一期视频中我们介绍的校准方法只能在截断误差与量化误差之间做一个权衡,而不能完全消除它们。

还有就是我们量化推导那期视频中提到过的用Multiplier与rShift代替Scale的表示也会产生些许误差

wKgaomTeygWATqy0AAMmYISJkLs868.jpg

QAT就是通过end-to-end training微调训练后的模型参数,让模型对量化的鲁棒性更强,从而缓和造成的精度下降问题,而且通过QAT,我们也能够达成更低位,例如INT4的量化,从而进一步轻量化模型与提高推理效率

实现方式就是在训练过程中进行模拟量化,或者说是插入FakeQuant伪量化算子,对weight与activation tensor进行量化,然后再做反量化引入量化误差进行训练,所以在fine-tune的过程中模型还是以FP32精度进行运算的,并不是像推理过程中的低位运算。之后我们通过反向传播与梯度下降的方式微调模型权重。

对于量化参数的确定,weight tensor的量化参数通常采用绝对最大值除以127的方式确定,而activation tensor量化参数则根据QAT算法的不同可能也有所不同。早期的QAT算法采用滑动平均的方式在训练过程中对量化取值范围进行统计更新,而近些年来主流的QAT算法直接将量化参数定位可学习参数在反向传播过程中通过梯度下降进行更新。

这样的做法在实际实现过程中我们主要会遇到一个问题,就是伪量化算子中的round函数梯度要怎么计算,我们既然在原模型插入了伪量化算子,又要对模型进行重新训练,就不得不考虑反向传播时怎么计算它的梯度。

首先我们之前有看过量化后的信号波形图其实是一个离散的阶梯函数,这样的函数是不可导的,或者说它们的梯度是处处为0的,这就导致权重无法得到更新。所以我们需要想办法去对它做近似操作。

一种传统的方式是用Straight-Through Estimator在反向传播过程中让伪量化算子输入的梯度等于输出的梯度,或者说使他梯度为1。

由这种方法延伸出了一系列的QAT算法,例如DoReFaNet,这个算法将activation和weight都压缩在0,1之间进行量化,后面会继续讲解基于STE的QAT算法,敬请期待。
审核编辑:彭菁

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

    关注

    3

    文章

    4329

    浏览量

    62590
  • 模型
    +关注

    关注

    1

    文章

    3239

    浏览量

    48830
  • 数据流
    +关注

    关注

    0

    文章

    119

    浏览量

    14356
收藏 人收藏

    评论

    相关推荐

    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,图像识别

    BModel混合精度量化 ├── yolov8s_qtable_fp32 # TPU-MLIR编译时,用于BM1684的INT8 BModel混合精度量化
    发表于 07-14 23:36

    YOLOv6中的用Channel-wise Distillation进行的量化感知训练

    1、YOLOv6中的用Channel-wise Distillation进行的量化感知训练来自哪里  知识蒸馏 (KD)已被证明是一种用于训练紧凑密集预测模型的简单有效的工具。轻量级学
    发表于 10-09 16:25

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

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

    Pytorch量化感知训练的详解

    量化感知训练(Quantization Aware Training )是在模型中插入伪量化模块(fake\_quant module)模拟量化
    的头像 发表于 12-08 22:57 2424次阅读

    适配PyTorch FX让量化感知训练更简单

    近年来,量化感知训练是一个较为热点的问题,可以大大优化量化训练造成精度损失的问题,使得训练过程
    的头像 发表于 03-08 09:45 1176次阅读

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

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

    TPU-MLIR中的融合处理

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

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

    背景介绍TPU-MLIR的CodeGen是BModel生成的最后一步,该过程目的是将MLIR文件转换成最终的Bmodel。本文介绍了CodeGen的基本原理和流程,并记录了针对BM1684X等新架构
    的头像 发表于 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次阅读
    如何高效处理LMEM中的数据?这篇文章带你学会!