SNPE调试记录
模型结构
- SNPE支持的层较少,支持的层限制也很多,所以很多复杂的结构在不做修改的情况下基本不支持,比如QKV, non-local(Matmul is only supported when used to interpret an FC layer. The second input must be a set of weights.),具体可以参考 SNPE-OP指南
- 还有一个坑,BN如果不能合并CONV而是单独存在的话(如下图),QUANT后的精度差异会比较大。猜测是SNPE只对Conv和FC量化,单独存在BN是不会量化的,这就会导致送到BN的act因为量化导致mean和std都出现了较大的偏移,而未量化的BN又放大了这些便宜,从而导致精度较大。
- 还有些玄学的,比如同样一个模型,某些输入尺寸可以正常量化,某些又不行(遵循32,64的倍数);
模型量化
- 量化样本的生成一定要和实际部署的一致,比如均值,方差(OPENCV是BGR,PIL是RGB),严谨一点,次序尽量别出错,虽然出错了问题也不大;
- 标定样本不需要太多,5000张和500张的差异不大,多了浪费时间;
- –optimizations cle 要求很多:
3.1 仅支持单路结构 Conv®->Batchnorm®->activation(o)->Conv®->Batchnorm®->activation(o)
Conv®->Batchnorm®->activation(o)->DepthwiseConv®->Batchnorm®->activation(o)->Conv®->Batchnorm®->activation(o)
3.2 不支持RELU6
3.3 为了最大保持精度, 转换DLC前最好保留BN; - 为了最大化的提升8bit后模型的精度,建议结合AIMET;