PaddleSlim
PaddleSlim copied to clipboard
PaddleOCR 识别模型裁剪和量化问题
裁剪:
cd PaddleOCR
python deploy/slim/prune/sensitivity_anal.py -c configs/rec_record/rec_r34_vd_none_bilstm_ctc_ccpd.yml -o Global.pretrained_model=output/rec/r34_vd_none_bilstm_ctc_ccpd/best_accuracy Global.save_model_dir=./output/prune_model_ccpd/
- 裁剪错误日志
W1126 09:49:51.398372 46912 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 8.6, Driver API Version: 11.3, Runtime API Version: 11.0
W1126 09:49:51.406190 46912 device_context.cc:465] device: 0, cuDNN Version: 8.0.
<class 'paddle.nn.layer.pooling.AvgPool2D'>'s flops has been counted
<class 'paddle.nn.layer.conv.Conv2D'>'s flops has been counted
<class 'paddle.fluid.dygraph.nn.BatchNorm'>'s flops has been counted
Cannot find suitable count function for <class 'paddle.nn.layer.pooling.MaxPool2D'>. Treat it as zero FLOPs.
Cannot find suitable count function for <class 'ppocr.modeling.necks.rnn.Im2Seq'>. Treat it as zero FLOPs.
Cannot find suitable count function for <class 'paddle.nn.layer.rnn.LSTMCell'>. Treat it as zero FLOPs.
<class 'paddle.nn.layer.common.Linear'>'s flops has been counted
Traceback (most recent call last):
File "deploy/slim/prune/sensitivity_anal.py", line 147, in <module>
main(config, device, logger, vdl_writer)
File "deploy/slim/prune/sensitivity_anal.py", line 77, in main
flops = paddle.flops(model, [1, 3, 640, 640])
File "D:\Program Files\Anaconda3\envs\paddle\lib\site-packages\paddle\hapi\dynamic_flops.py", line 108, in flops
print_detail=print_detail)
File "D:\Program Files\Anaconda3\envs\paddle\lib\site-packages\paddle\hapi\dynamic_flops.py", line 249, in dynamic_flops
model(inputs)
File "D:\Program Files\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\dygraph\layers.py", line 914, in __call__
outputs = self.forward(*inputs, **kwargs)
File "deploy/slim/prune\..\..\..\ppocr\modeling\architectures\base_model.py", line 78, in forward
x = self.neck(x)
File "D:\Program Files\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\dygraph\layers.py", line 914, in __call__
outputs = self.forward(*inputs, **kwargs)
File "deploy/slim/prune\..\..\..\ppocr\modeling\necks\rnn.py", line 89, in forward
x = self.encoder_reshape(x)
File "D:\Program Files\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\dygraph\layers.py", line 914, in __call__
outputs = self.forward(*inputs, **kwargs)
File "deploy/slim/prune\..\..\..\ppocr\modeling\necks\rnn.py", line 31, in forward
assert H == 1
AssertionError
量化
python deploy/slim/quantization/quant.py -c configs/rec_record/rec_r34_vd_none_bilstm_ctc_ccpd.yml -o Global.pretrain_weights=./output/rec/r34_vd_none_bilstm_ctc_ccpd/best_accuracy Global.save_model_dir=./output/quant_model_ccpd
- 量化错误日志
W1126 10:49:18.884593 7304 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 8.6, Driver API Version: 11.3, Runtime API Version: 11.0
W1126 10:49:18.900218 7304 device_context.cc:465] device: 0, cuDNN Version: 8.0.
INFO:root:If regularizer of a Parameter has been set by 'paddle.ParamAttr' or 'static.WeightNormParamAttr' already. The weight_decay[L2Decay, regularization_coeff=0.000000] in Optimizer will not take effect, and it will only be applied to other Parameters!
Traceback (most recent call last):
File "deploy/slim/quantization/quant.py", line 162, in <module>
main(config, device, logger, vdl_writer)
File "deploy/slim/quantization/quant.py", line 149, in main
pre_best_model_dict = init_model(config, model, logger, optimizer)
File "E:\Paddle\PaddleOCR\ppocr\utils\save_load.py", line 65, in init_model
optimizer.set_state_dict(opti_dict)
AttributeError: 'Logger' object has no attribute 'set_state_dict
PaddlePaddle版本 : paddlepaddle-gpu 2.2.0.post110 PaddleSlim版本: 2.2.0、 2.0.0 拉取PaddleSlim ,执行 python setup.py install 安装版本 以上3个版本都测试
这个问题怎么解决??
感谢反馈,我们正在尝试修复该问题。如有进度,会及时同步。
以上问题均在PaddleOCR dygraph分支修复:https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph
剪裁错误
Traceback (most recent call last): File "deploy/slim/prune/sensitivity_anal.py", line 147, in
main(config, device, logger, vdl_writer) File "deploy/slim/prune/sensitivity_anal.py", line 77, in main flops = paddle.flops(model, [1, 3, 640, 640])
该问题主要原始是在sensitivity_anal.py文件中调用paddle.flops时,传入了错误的shape, [1, 3, 640, 640], 该shape不兼容OCR rcnn识别模型。
fix之后:https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/slim/prune/sensitivity_anal.py#L78-L79
量化
W1126 10:49:18.884593 7304 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 8.6, Driver API Version: 11.3, Runtime API Version: 11.0 W1126 10:49:18.900218 7304 device_context.cc:465] device: 0, cuDNN Version: 8.0. INFO:root:If regularizer of a Parameter has been set by 'paddle.ParamAttr' or 'static.WeightNormParamAttr' already. The weight_decay[L2Decay, regularization_coeff=0.000000] in Optimizer will not take effect, and it will only be applied to other Parameters! Traceback (most recent call last): File "deploy/slim/quantization/quant.py", line 162, in
main(config, device, logger, vdl_writer) File "deploy/slim/quantization/quant.py", line 149, in main pre_best_model_dict = init_model(config, model, logger, optimizer) File "E:\Paddle\PaddleOCR\ppocr\utils\save_load.py", line 65, in init_model optimizer.set_state_dict(opti_dict) AttributeError: 'Logger' object has no attribute 'set_state_dict
该问题是PaddleOCR的init_model接口发生变化,但是在quant.py文件中的调用没有适配该变化。