游乐游手机版
首页/AI热点日报/热点详情

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

类型:热点整理2026-07-20
TPU-MLIR的敏感层搜索功能遍历模型所有算子及KL、MAX、Percentile三种量化方法,精准定位对精度影响最大的层并优化量化阈值,生成混精度模型。以mobilenet-v2为例,仅将单层保留为浮点类型即可使Top1精度提升1 5%,Top5精度提升约1%。

背景介绍

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提供的敏感层搜索功能,能够逐一计算网络中每一层由浮点数类型转换为定点数类型后,对整体网络输出所产生的损失(loss)。此外,考虑到量化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。

算法流程

敏感层搜索算法的完整流程如下图所示:

  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日志中。用户可通过查看日志,手动调整qtable文件以实现更精细的优化。

使用方法

使用敏感层搜索功能,需要输入来自model_transform步骤生成的mlir文件、run_calibration步骤得到的量化表以及推理所用的数据集等。命令示例如下:

run_sensitive_layer.py mobilenet.mlir 
    --dataset ../ILSVRC2012 
    --input_num 100 
    --inference_num 30 
    --max_float_layers 5 
    --expected_cos 0.99 
    --post_process postprocess.py 
    --calibration_table mobilenet_cali_table 
    --chip bm1684 
    -o mobilenet_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暂未考虑✓ 以单层layer_cos为入口
考虑网络输出的余弦相似度✓ 用于计算loss✓ 作为停止条件
手动修改qtable支持使用程序生成的qtable即可
支持用户自定义后处理暂不支持
遍历所有op✓ 遍历全部有skip规则,达到预设cos后直接停止
op类型转换规则从FLOAT变为INT8,计算loss从INT8变回FLOAT,计算cos

混精度搜索从网络输入开始,持续寻找对网络输出相似度有提升的层,并将其加入qtable,直至网络输出相似度达到预设值后终止。该方法可能会遗漏靠近网络输出部分的敏感层,而敏感层搜索方法会遍历所有op,不存在此类遗漏,这正是敏感层搜索的显著优势。在实际应用中,用户可先尝试速度较快的混精度搜索,若效果未达预期,再使用敏感层搜索功能进行全局遍历,以获得更优的精度表现。

常见问题

  1. 问:敏感层搜索需要多少张图片?
    答:推荐使用100张图片进行量化,30张图片进行推理(如示例所示)。实际应用中可根据模型大小和数据集情况灵活调整,建议使用bad case(精度较差的图片)作为数据集,效果更佳。
  2. 问:生成的qtable中最多可以包含多少个敏感层?
    答:通过--max_float_layers参数控制,默认值为5。若希望更多层转回FLOAT,可适当增大该数值,但需注意会增加推理时的计算量。
  3. 问:混精度搜索和敏感层搜索哪个更好?
    答:两者各有优劣。混精度搜索速度较快(仅搜索部分层),但可能遗漏靠近输出端的敏感层;敏感层搜索遍历所有层及三种量化方法,精度提升更彻底,但耗时更长。建议先使用混精度搜索,若精度不满足要求,再采用敏感层搜索进行深度优化。
  4. 问:为什么MIX(newcali)比MIX(oricali)精度更高?
    答:因为敏感层搜索不仅找出了需要转回FLOAT的层,还利用三种量化方法为每个op选择了最优的threshold,生成了新量化表,从而进一步提升了模型精度。

结语

敏感层搜索功能通过遍历模型中的所有op及三种量化方法,精准定位对精度影响最大的层,并为其选择最优的量化threshold,最终生成高性能的混精度模型。在mobilenet-v2网络上,仅将loss最大的单层保留为FLOAT,即可获得1.5%的Top1精度提升,效果十分显著。与混精度搜索相比,虽然耗时更长,但敏感层搜索不会遗漏任何敏感层,尤其适用于对精度要求较高的应用场景。未来可通过结合邻近层影响、动态确定qtable层数以及并行化遍历等方式,进一步优化该功能的效率与效果。

来源:https://m.elecfans.com/article/2266715.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。