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

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

3天内不再提示

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

算能开发者社区 2023-10-10 10:17 次阅读


背景介绍

TPU-MLIR编译器可以将机器学习模型转换成算能芯片上运行的bmodel模型。由于浮点数的计算需要消耗更多的计算资源和存储空间,实际应用中往往采用量化后的模型(也称定点模型)进行推理。相比于浮点数模型,量化模型的推理精度会有一定程度的损失。当精度损失较大时,需要搜索模型中对精度影响较大的层,即敏感层,将其改回浮点类型,生成混精度模型进行推理。

以mobilenet-v2网络为例,使用ILSVRC-2012数据验证集的5万张图片验证浮点数模型和量化模型(表格中分别记为FLOAT和INT8)的精度,INT8模型的Top1精度降低了3.2%,Top5精度降低了2%。

TypeTop1 (%)Top5 (%)
FLOAT70.7289.81
INT867.5387.84

敏感层搜索

TPU-MLIR的敏感层搜索功能会计算网络模型中的每一层分别由浮点数类型转成定点数类型后,对网络模型输出造成的损失。同时,由于量化threshold值也会影响定点模型的精度,敏感层搜索功能考虑了三种量化方法——KL、MAX和Percentile对精度的影响。KL方法首先统计FLOAT模型tensor绝对值的直方图(2048个bin),得到参考概率分布P,随后用INT8类型去模拟表达这个直方图(128个bin),得到量化概率分布Q,在不同的截取位置计算P和Q的KL散度,最小散度对应的截取位置记为KL方法得到的threshold值。MAX方法是用FLOAT模型tensor绝对值的最大值作为量化threshold。Percentile方法则是通过统计FLOAT模型tensor绝对值的百分位数来确定threshold。

算法流程

敏感层搜索算法的流程图如下:

30f41e20-6713-11ee-9788-92fbcf53809c.png敏感层搜索流程图

  1. 在搜索之前需要先判断FLOAT模型和INT8模型的相似度,用一定数目的图片(比如30张)进行推理,计算两种模型输出结果的余弦相似度的平均值,如果平均值达到预设值,比如0.99,则认为INT8模型与FLOAT模型的相似度较高,不需要进行敏感层搜索。
  2. 对于该模型,生成三种量化方法对应的量化表。
  3. 循环每个op及每种量化方法,将该op改为INT8类型,并采用对应量化方法下的threshold,生成混精度模型,计算其与FLOAT模型网络输出的loss(1减余弦相似度),记录最优threshold,即最低loss值对应的threshold,随后将该op改回FLOAT类型。
  4. 将所有op按照loss从大到小排序,选择排名前五的op生成qtable。

在搜索过程中,对于每个op及其每种threshold值下生成的混精度模型与FLOAT模型的loss,以及最终按照loss排序的所有op信息(包括op的名字、类型和loss),均会记录在log日志中,用户可以通过查看log日志,手动调整qtable文件。

使用方法

敏感层搜索需要输入从model_transform步骤得到的mlir文件,run_calibration步骤得到的量化表,推理用的数据集等,使用命令如下:

run_sensitive_layer.pymobilenet.mlir\
--dataset../ILSVRC2012\
--input_num100\
--inference_num30\
--max_float_layers5\
--expected_cos0.99\
--post_processpostprocess.py\
--calibration_tablemobilenet_cali_table\
--chipbm1684\
-omobilenet_qtable

各项参数的含义如下表所示:

参数名称含义
dataset用于量化和推理的数据集,推荐使用bad case
input_num用于量化的图片数目
inference_num用于推理的图片数目
max_float_layersqtable中的op数目
expected_cosINT8模型和FLOAT模型的余弦相似度阈值,达到阈值则不进行敏感层搜索
post_process用户自定义后处理文件路径,后处理函数需要命名为PostProcess
calibration_tablerun_calibration步骤得到的量化表
chip使用的芯片类型
o生成的qtable名称

敏感层搜索程序会生成如下文件:

  1. 用于生成混精度模型的qtable,每行记录了需要转回FLOAT的op及转换类型,例如:input3.1 F32;
  2. 经过调优后的新量化表new_cali_table,在原始量化表的基础上,更新了每个op的threshold值为三种量化方法中最优的threshold;
  3. 搜索日志SensitiveLayerSearch,记录整个搜索过程中,每个op在每种量化方法下,混精度模型与FLOAT模型的loss;

注意,在model_deploy步骤生成混精度模型时,需要使用qtable和新量化表。

精度测试结果

仍以前述精度测试采用的mobilenet-v2网络为例,使用ILSVRC2012数据集中的100张图片做量化,30张图片做推理,敏感层搜索总共耗时402秒,占用内存800M,输出结果信息如下:

the layer input3.1 is 0 sensitive layer, loss is 0.008808857469573828, type is top.Conv
the layer input11.1 is 1 sensitive layer, loss is 0.0016958347875666302, type is top.Conv
the layer input128.1 is 2 sensitive layer, loss is 0.0015641432811860367, type is top.Conv
the layer input130.1 is 3 sensitive layer, loss is 0.0014325751094084183, type is top.Scale
the layer input127.1 is 4 sensitive layer, loss is 0.0011817314259702227, type is top.Add
the layer input13.1 is 5 sensitive layer, loss is 0.001018420214596527, type is top.Scale
the layer 787 is 6 sensitive layer, loss is 0.0008603856180608993, type is top.Scale
the layer input2.1 is 7 sensitive layer, loss is 0.0007558935451825732, type is top.Scale
the layer input119.1 is 8 sensitive layer, loss is 0.000727441637624282, type is top.Add
the layer input0.1 is 9 sensitive layer, loss is 0.0007138056757098887, type is top.Conv
the layer input110.1 is 10 sensitive layer, loss is 0.000662179506136229, type is top.Conv
......
run result:
int8 outputs_cos:0.978847 old
mix model outputs_cos:0.989741
Output mix quantization table to mobilenet_qtable
total time:402.15848112106323

观察可知,input3.1的loss最大,且值为其他op的至少5倍。尝试只将input3.1加进qtable,其他层都保持INT8类型不变,生成混精度模型,在ILSVRC2012验证集上进行推理,精度如下:

TypeTop1 (%)Top5 (%)
FLOAT70.7289.81
INT867.5387.84
MIX(oricali)68.1988.33
MIX(newcali)69.0788.73

上表中,MIX(oricali)代表使用原始量化表的混精度模型,MIX(newcali)代表使用新量化表的混精度模型,可以看出,基于三种量化方法的threshold调优,也对模型的精度起到了正向影响。相比于INT8模型,混精度模型的Top1精度提升1.5%,Top5精度提升约1%。

对比混精度搜索

混精度搜索是TPU-MLIR中的另一个量化调优搜索功能,它的核心思想是先寻找到layer_cos不满足要求的层,再将该层及其下一层均从INT8转回FLOAT,生成混精度模型,计算其与FLOAT模型输出的余弦相似度,如果余弦相似度达到预设值,则停止搜索。注意,混精度搜索只有在op表现较差,即混精度模型与FLOAT模型输出相似度低于INT8模型与FLOAT模型输出相似度时,才会将op类型从FLOAT置回INT8,否则不会改变op的精度类型。所以混精度搜索不需要从头进行推理,耗时较短。这两种方法的对比如下:

对比情况敏感层搜索混精度搜索
核心思想循环所有op,找对网络输出影响最大的层以单层layer的相似度为入口,网络输出的相似度为停止条件
考虑多种量化方法只考虑KL方法
修改量化表使用原始量化表
考虑相邻两层只考虑单层
考虑layer_cos暂未考虑
考虑网络输出的余弦相似度
手动修改qtable使用程序生成的qtable即可
支持用户自定义后处理暂不支持
遍历所有op有skip规则,并且达到预设cos后直接停止
op类型转换规则从FLOAT变为INT8,算loss从INT8变回FLOAT,算cos

混精度搜索从网络输入开始,不断搜索对网络输出相似度有提升的层加入qtable,直到网络输出相似度达到预设值后终止搜索。该方法可能会漏掉靠近网络输出部分的敏感层,而敏感层搜索方法会遍历所有op,不会出现这种遗漏,这也是敏感层搜索的优势之处。在实际应用中,用户可以先使用速度较快的混精度搜索,如果没能达到预期效果,再使用敏感层搜索功能进行全局遍历。

结语

敏感层搜索功能旨在寻找模型量化时对精度影响较大的层,它会遍历模型中的所有op及三种量化方法,选择最优的量化threshold,记录所有op的loss。将搜索到的敏感层设定为浮点数类型,其余层设定为定点数类型,生成混合精度模型,可以提升模型推理的精度。目前的敏感层搜索功能在mobilenet-v2网络中表现优异,只需要将loss最大的一层置为FLOAT,就可以获得1.5%的精度提升。与混精度搜索方法相比,敏感层搜索虽然耗时更久,但它考虑了所有op和三种量化方法,不会遗漏靠近网络输出部分的敏感层。未来可以考虑从三个方面对敏感层搜索功能进行优化:1) 结合混精度搜索的优点,在搜索时考虑每层及其邻近层对网络输出的综合影响;2) 在生成qtable时,不是根据用户设定的数目,选择loss最大的前N层,而是通过计算,将能让网络输出相似度达到预设值的op均加入qtable;3) 在遍历op的过程中考虑并行,缩短搜索时间。

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

    关注

    1

    文章

    2706

    浏览量

    47697
  • 机器学习
    +关注

    关注

    66

    文章

    8132

    浏览量

    130574
  • TPU
    TPU
    +关注

    关注

    0

    文章

    132

    浏览量

    20548
收藏 人收藏

    评论

    相关推荐

    Groq推出大模型推理芯片 超越了传统GPU和谷歌TPU

    Groq推出了大模型推理芯片,以每秒500tokens的速度引起轰动,超越了传统GPU和谷歌TPU
    的头像 发表于 02-26 10:24 389次阅读
    Groq推出大<b class='flag-5'>模型</b><b class='flag-5'>推理</b>芯片 超越了传统GPU和谷歌<b class='flag-5'>TPU</b>

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

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

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

    想要的容器的名字注意TPU-MLIR工程在docker中的路径应该是/workspace/tpu-mlir 2.3. ModelZoo(可选) TPU-MLIR中自带yolov5s模型
    发表于 01-10 08:02

    yolov5量化INT8出错怎么处理?

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

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

    快速定位BModel与原始模型推理结果不一致的问题,进而修复TPU-MLIR的编译或模型出错点。下图是TDB工具集的框架。TDB主要是基于Python开发的,其核心功能
    的头像 发表于 12-22 08:33 260次阅读
    深入学习和掌握<b class='flag-5'>TPU</b>硬件架构有困难?TDB助力你快速上手!

    解读大模型FP量化的解决方案

    在 LLaMA, BERT 以及 ViTs 模型上,4-bit 量化皆取得了远超 SOTA 的结果。特别是,这篇文章展示了 4-bit 量化的 LLaMA-13B 模型,在零样本
    发表于 11-24 11:15 360次阅读
    解读大<b class='flag-5'>模型</b>FP<b class='flag-5'>量化</b>的解决方案

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

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

    探索ChatGLM2在算能BM1684X上INT8量化部署,加速大模型商业落地

    |探索ChatGLM2-6B模型TPU部署》。为了进一步提升模型推理效率与降低存储空间,我们对模型
    的头像 发表于 10-10 10:18 2177次阅读
    探索ChatGLM2在算能BM1684X上INT8<b class='flag-5'>量化</b>部署,加速大<b class='flag-5'>模型</b>商业落地

    INT8量化常见问题的解决方案

    一、int8的输出和fp32模型输出差异比较大 解决方案: 检查前后处理是否有问题,int8网络输入输出一般需要做scale处理,看看是否遗漏? 通过量化可视化工具分析int8的输出和fp32
    发表于 09-19 06:09

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

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

    TPU-MLIR量化感知训练

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

    基于STE的QAT算法

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

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

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

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

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

    TPU-MLIR中的融合处理

    TPU-MLIR中的融合处理
    的头像 发表于 08-18 11:29 312次阅读
    <b class='flag-5'>TPU-MLIR</b>中的融合处理