PaddlePaddle / PaddleSlim

PaddleSlim is an open-source library for deep model compression and architecture search.
https://paddleslim.readthedocs.io/zh_CN/latest/
Apache License 2.0
1.56k stars 344 forks source link

PaddleOCR 识别模型裁剪和量化问题 #934

Closed chccc1994 closed 7 months ago

chccc1994 commented 2 years ago

裁剪:

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

PaddlePaddle版本 : paddlepaddle-gpu 2.2.0.post110 PaddleSlim版本: 2.2.0、 2.0.0 拉取PaddleSlim ,执行 python setup.py install 安装版本 以上3个版本都测试

这个问题怎么解决??

wanghaoshuang commented 2 years ago

感谢反馈,我们正在尝试修复该问题。如有进度,会及时同步。

wanghaoshuang commented 2 years ago

以上问题均在PaddleOCR dygraph分支修复:https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph

wanghaoshuang commented 2 years ago

剪裁错误

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文件中的调用没有适配该变化。