量化执行过程中提示“Error: Cannot find scale_d of layer '**' in record file”
问题描述
量化过程中调用save_model接口保存量化模型时,需要读取calibration阶段计算得到的数据量化参数scale_d,offset_d,如果未能在相应的记录文件中找到对应参数,则无法进行后续量化模型保存动作。因此AMCT会抛出上述错误,并终止流程。现象如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
2021-05-11 09:29:18,138 - INFO - [AMCT]:[Optimizer]: Do <class 'amct_caffe.optimizer.check_record_scale_offset.CheckRecordScaleOffsetPass'> 2021-05-11 09:29:18,138 - ERROR - [AMCT]:[AMCT]: Cannot find scale_d,offset_d,channels,height,width of layer:Convolution1 2021-05-11 09:29:18,138 - ERROR - [AMCT]:[AMCT]: Check scale and offset record file xx/data/AMCT15_CAFFE_GPU_GPU_FAQ_LEVEL1_TC_001/AMCT15_CAFFE_GPU_GPU_FAQ_LEVEL1_TC_001_record.txt failed 2021-05-11 09:29:18,138 - ERROR - [AMCT]:[AMCT]: There may be something wrong while doing calibration 2021-05-11 09:29:18,138 - ERROR - [AMCT]:[AMCT]: Please check caffe log Traceback (most recent call last): File "test_caffe_faq.py", line 32, in <module> main() File "test_caffe_faq.py", line 28, in main gen_amct_model(case,json_flag = True) File "../caffe_lib/calibration_test/code/gen_amct_model.py", line 102, in gen_amct_model save_model(graph, mode, AMCT_PATH+case_name) File "xx/amct/lib/python3.7/site-packages/amct_caffe/common/utils/check_params.py", line 43, in wrapper return func(*args, **kwargs) File "xx/amct/lib/python3.7/site-packages/amct_caffe/quantize_tool.py", line 190, in save_model optimizer.do_optimizer(graph) File "xx/amct/lib/python3.7/site-packages/amct_caffe/optimizer/graph_optimizer.py", line 60, in do_optimizer graph_pass.run(graph) File "xx/amct/lib/python3.7/site-packages/amct_caffe/optimizer/check_record_scale_offset.py", line 103, in run raise RuntimeError('Check file {} failed.'.format(record_file)) RuntimeError: Check file xx/data/AMCT15_CAFFE_GPU_GPU_FAQ_LEVEL1_TC_001/AMCT15_CAFFE_GPU_GPU_FAQ_LEVEL1_TC_001_record.txt failed. |
可能原因
保存scale_d和offset_d参数是在用户执行calibration动作时(调用Caffe框架执行calibration模型做前向计算时),AMCT在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设置。
父主题: FAQ