定点化的意义
深度学习模型往端侧迁移时通常受限于芯片的计算能力,PC端训练的模型是浮点型,而芯片端是整型计算,此时就需要做模型定点化
定点化流程
第一步:模型转ONNX
第二步:ONNX打包量化
第三步:PC和芯片端对齐
具体如下:
1. 模型转ONNX
通常芯片厂商会有对应的文档指引,主要关注:支持的最大flops,支持的算子,layer类型,量化的API。
1.1 支持的最大flops
根据芯片所支持的flops选择合适的移动端模型,如Mobilenet,shuffleNetv2等。flops即加乘运算数
1.2 支持的算子
选择了合适的模型后,通常有些芯片不支持模型的一些操作,如transpose,此时就需要手动实现这些算子
1.3 layer 类型
NDK文档中会有所支持的层类型,如果选择的模型中有不支持的层,可以选择做一些替换,如pooling可以用1x1卷积,不同的relu类型
1.4 量化API
做完了1,2,3的准备工作后,通常我们需要把模型转onnx,再通过onnx进行模型打包量化,不同框架转onnx可以查阅对应的官网代码
2. ONNX打包量化
2.1 onnx打包
转完onnx后通常芯片厂商为了减小计算量会进行模型的打包,模型打包主要是进行层合并,如果有不支持的层类型,在执行这一步操作的时候也会有对应的报错提示。
2.2 量化
模型打包完之后接下来就是量化,量化的目的是通过统计训练数据分布找到模型参数的小数位,模型在芯片端计算时,是整型和假除小数位模拟进行浮点运算。量化时需要构造一个数据生成器,数据即训练模型的训练样本。除了统计数据进行量化的方式外,通常也会有定点量化训练的方法,这样得到的量化模型精度更高。
3.对齐
模型打包量化完之后,需要将板子和PC端进行对齐,即同样的输入数据,PC和板子对齐输出,以保证我们打包量化的模型是没问题的。如果这一步没问题,后续我们就可以把重心放在PC端优化模型上,每次优化后再走一遍流程打包量化即可
其他
在模型往端侧迁移的时候,为了保证速度,通常也可以通过查表的方式将一些算子优化运算,牺牲空间换取时间