这几天踩了无数坑把PPQ走通了,把自己搭的一个网络实现了完美量化,测试结果也可以正常分类。看到结果终于明白为什么说PPQ对于FPGA的神经网络的量化来说是神了
虔诚地放出链接: OpenPPL/ppq
PS:这辈子要是能去商汤就好了……
一、 PPQ前言
对于FPGA或ZYNQ来说,Verilog流水线加速神经网络的一个重要方面就是参数的量化,作为对2的幂次方极为偏爱的平台,如果偏置和权重等都能完美实现这个要求,那么在权重读取或者权重计算中,过程的爽感是不言而喻的。
PPQ真的是一个极其优秀的平台,里面支持量化的框架有很多,不同量化框架的策略是不一样的,所以无论你是RKNN还是NCNN等等的量化都能够做到特定的优化,挺不错的。
二、 结果展示
我们先简单看一下原始ONNX模型的权重,可以发现都是浮点数。
接下来我们看一下经过某一种量化策略后的结果,可以惊喜地发现右边的参数都是2的幂次方相加的形式,这太完美了。-0.0625,-0.078125,随便挑出一两个都是这么亲切。
如果你接触过onnxruntime的int8量化你就会知道它把卷积层的参数拆开并实现了缩放操作(即用于量化与反量化),但是缩放的尺度仍然是个浮点数。效果如下图
PPQ也有相应的量化操作,而且缩放尺度的结果也是2的幂次方,这样就很方便Verilog语言的操作(注意看的是图中的x_scale)
三、碎碎念
其实使用普通的量化后在FPGA中进行截断也行,只是我还没试过两者之前的区别,理论上保持精度足够,截断或者说近似一点点应该没问题,不过这个是我的猜想,毕竟还没实现过。不过PPQ全做好了,何乐而不为呢?
除了PPQ,在TensorRT中,你可以使用 power-of-two 或类似选项来启用缩放因子为 2 的幂次方的策略。不过我没试过,应该也能做到类似功能。
这篇主要还是感慨一下整个流程和发现,自己才学疏浅,不免孤陋寡闻,也望有大佬能在FPGA上部署神经网络关于量化方面指点一二。
有人如果有需要PPQ相关的操作我再更PPQ整个流程吧,或者是模型的操作,不过人家的Readme和历程做的很好了。