量化执行过程中提示“RuntimeError: Cannot find scale_d of layer '**' in record file”
问题描述
量化过程中调用save_model接口保存量化模型时,需要读取calibration阶段计算得到的数据量化参数scale_d,offset_d,如果未能在相应的记录文件中找到对应参数,则无法进行后续量化模型保存动作。因此模型小型化工具会抛出上述错误,并终止流程。
可能原因
保存scale_d和offset_d参数是在用户执行calibration动作时(调用caffe框架执行calibration模型做前向计算时),模型小型化工具在calibration模型中插入的IFMR层做的动作,而IFMR层需要先攒够用户指定batch_num数据后再进行一次量化计算得到scale_d和offset_d。导致RuntimeError: Cannot find scale_d of layer * in record file错误的原因主要分为两类:
- 执行caffe做inference错误:该问题可能原因有很多种,例如用户编译的caffe本身有问题,calibration模型存在问题,未能找到相应数据集等等。用户可以通过查看caffe框架本身抛出的异常信息来查看。
- 用户提供的校准集数据量不满足设置的batch_num所需要的数据量:例如用户仅提供了一个batch的数据用作校准集,但设置了batch_num=2,这样在做calibration过程中,IFMR层未攒满足够的数据,不能执行量化操作,也就未能计算得到scale_d和offset_d,也会触发上述错误。用户可以通过查看IFMR在量化过程中打印的进程信息来排查,IFMR层会显示已经攒的数据量:
当攒够指定数据量后,会触发量化操作:
直至出现Do layer * activation calibration success!信息才表示完成了当前层的量化动作。
处理建议
- 根据caffe框架抛出的具体错误来相应进行修复。
- 适当增加校准集数据量或者降低量化算法batch_num配置(但降低batch_num可能会导致量化后模型精度下降,需要慎重考虑)直至满足校准集数据量大于等于`batch_num`设置。
