张量分解模型
分解前提
用户将需要张量分解的Caffe模型文件和权重文件上传到Linux服务器任意目录下,本手册以sample/resnet50/中的模型为例进行说明。使用该sample中的模型之前,请先参见模型准备下载ResNet-50-deploy.prototxt模型文件。
分解约束
如果Convolution层的shape过大,会造成分解时间过长或分解异常中止,为防止出现该情况,执行分解动作前,请先参见如下约束或参考数据:
- 分解工具性能参考数据:
- CPU: Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
- 内存: 512G
分解单层卷积:
- shape(512, 512, 5, 5), 大约耗时25秒。
- shape(1024, 1024, 3, 3),大约耗时16秒。
- shape(1024, 1024, 5, 5),大约耗时78秒。
- shape(2048, 2048, 3, 3),大约耗时63秒。
- shape(2048, 2048, 5, 5),大约耗时430秒。
- 内存超限风险提醒:
分解大卷积核存在内存超限风险参考数值:shape为(2048, 2048, 5, 5)的卷积核约占用32G内存。
分解示例
- 切换到amct_caffe/sample/tensor_decompose路径,执行如下命令分解原始模型:
python3.7.5 tensor_decomposition_sample.py --model_file MODEL_FILE --weights_file WEIGHTS_FILE --new_model_file NEW_MODEL_FILE --new_weights_file NEW_WEIGHTS_FILE --caffe_dir CAFFE_DIR
各参数解释如表3-35所示。
表3-35 张量分解脚本所用参数说明参数
说明
--h
可选。显示帮助信息。
--model_file MODEL_FILE
必填。Caffe模型文件(.prototxt)路径。
--weights_file WEIGHTS_FILE
必填。Caffe权重文件(.caffemodel)路径。
--new_model_file NEW_MODEL_FILE
必填。张量分解后Caffe模型文件(.prototxt)路径。
--new_weights_file NEW_WEIGHTS_FILE
必填。张量分解后Caffe权重文件(.caffemodel)路径。
--caffe_dir CAFFE_DIR
必填。Caffe源代码路径,支持相对路径和绝对路径。
使用样例如下:
python3.7.5 tensor_decomposition_sample.py --model_file ../resnet50/pre_model/ResNet-50-deploy.prototxt --weights_file ../resnet50/pre_model/ResNet-50-model.caffemodel --new_model_file ./ResNet-50-deploy_tensor_decomposition.prototxt --new_weights_file ./ResNet-50-model_tensor_decomposition.caffemodel --caffe_dir caffe-master
分解过程中,日志会打印支持分解的算子名称,以及分解后的算子名称,如下所示(如下示例中的算子信息只是样例,请以实际分解的模型为准):
INFO - [AMCT]:[AMCT]: Decomposition res3a_branch2b ->['res3a_branch2b_0', 'res3a_branch2b_1', 'res3a_branch2b_2'] INFO - [AMCT]:[AMCT]: Decomposition res3b_branch2b ->['res3b_branch2b_0', 'res3b_branch2b_1', 'res3b_branch2b_2'] INFO - [AMCT]:[AMCT]: Decomposition res3c_branch2b ->['res3c_branch2b_0', 'res3c_branch2b_1', 'res3c_branch2b_2']
若提示如下信息,则说明分解成功:
Run tensor_decomposition success!
- 分解成功后,在“--new_model_file”参数和“--new_weights_file”参数所指定路径下,生成分解后的模型,如下所示:
INFO - [AMCT]:[AMCT]: The $HOME/amct/amct_caffe/sample/tensor_decompose/ResNet-50-model_tensor_decomposition.caffemodel is saved //张量分解后的权重文件 INFO - [AMCT]:[AMCT]: The $HOME/amct/amct_caffe/sample/tensor_decompose/ResNet-50-deploy_tensor_decomposition.prototxt is saved //张量分解后的模型文件
正常情况下,分解后模型的精度会比原始模型有所下降,所以在推理之前,会用一个finetune(微调)过程来提高分解模型的精度。 finetune的方法和普通模型finetune的方式一致,将原始的学习率调小,一般可设为原始学习率的0.1倍左右。 finetune的epoch(1个epoch表示过了1遍训练集中的所有样本)数各个模型不尽相同,分解的卷积层越多,所需要的epoch一般就越多。 finetune之后的模型,其精度可能与原模型持平,也可能有少许的下降或提升。
- 如果用户要对分解后的模型进行量化, 则请参见均匀量化。