PaddleOCR/deploy/slim/prune
yukavio aa3266b192 update for enable static 2020-11-04 10:34:12 +00:00
..
README.md fix some bug 2020-11-04 05:23:36 +00:00
README_en.md update bash of slim pruning 2020-09-23 05:16:02 +00:00
export_prune_model.py update for enable static 2020-11-04 10:34:12 +00:00
pruning_and_finetune.py update for enable static 2020-11-04 10:34:12 +00:00
sensitivity_anal.py update for enable static 2020-11-04 10:34:12 +00:00

README_en.md

Introduction

Generally, a more complex model would achive better performance in the task, but it also leads to some redundancy in the model. Model Pruning is a technique that reduces this redundancy by removing the sub-models in the neural network model, so as to reduce model calculation complexity and improve model inference performance.

This example uses PaddleSlim providedAPIs of Pruning to compress the OCR model. PaddleSlim, an open source library which integrates model pruning, quantization (including quantization training and offline quantization), distillation, neural network architecture search, and many other commonly used and leading model compression technique in the industry.

It is recommended that you could understand following pages before reading this example

  1. PaddleOCR training methods
  2. The demo of prune
  3. PaddleSlim prune API

Quick start

Five steps for OCR model prune:

  1. Install PaddleSlim
  2. Prepare the trained model
  3. Sensitivity analysis and training
  4. Model tailoring training
  5. Export model, predict deployment

1. Install PaddleSlim

git clone https://github.com/PaddlePaddle/PaddleSlim.git
cd Paddleslim
python setup.py install

2. Download Pretrain Model

Model prune needs to load pre-trained models. PaddleOCR also provides a series of (models)[../../../doc/doc_en/models_list_en.md]. Developers can choose their own models or use their own models according to their needs.

3. Pruning sensitivity analysis

After the pre-training model is loaded, sensitivity analysis is performed on each network layer of the model to understand the redundancy of each network layer, and save a sensitivity file which named: sensitivities_0.data. After that, user could load the sensitivity file via the methods provided by PaddleSlim and determining the pruning ratio of each network layer automatically. For specific details of sensitivity analysis, seeSensitivity analysis The data format of sensitivity file sensitivities_0.data(Dict){ 'layer_weight_name_0': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} 'layer_weight_name_1': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss} }

  example
      {
          'conv10_expand_weights': {0.1: 0.006509952684312718, 0.2: 0.01827734339798862, 0.3: 0.014528405644659832, 0.6: 0.06536008804270439, 0.8: 0.11798612250664964, 0.7: 0.12391408417493704, 0.4: 0.030615754498018757, 0.5: 0.047105205602406594}
          'conv10_linear_weights': {0.1: 0.05113190831455035, 0.2: 0.07705573833558801, 0.3: 0.12096721757739311, 0.6: 0.5135061352930738, 0.8: 0.7908166677143281, 0.7: 0.7272187676899062, 0.4: 0.1819252083008504, 0.5: 0.3728054727792405}
      }

The function would return a dict after loading the sensitivity file. The keys of the dict are name of parameters in each layer. And the value of key is the information about pruning sensitivity of correspoding layer. In example, pruning 10% filter of the layer corresponding to conv10_expand_weights would lead to 0.65% degradation of model performance. The details could be seen at: Sensitivity analysis

Enter the PaddleOCR root directoryperform sensitivity analysis on the model with the following command


python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1

4. Model pruning and Fine-tune

When pruning, the previous sensitivity analysis file would determines the pruning ratio of each network layer. In the specific implementation, in order to retain as many low-level features extracted from the image as possible, we skipped the 4 convolutional layers close to the input in the backbone. Similarly, in order to reduce the model performance loss caused by pruning, we selected some of the less redundant and more sensitive network layer through the sensitivity table obtained from the previous sensitivity analysis.And choose to skip these network layers in the subsequent pruning process. After pruning, the model need a finetune process to recover the performance and the training strategy of finetune is similar to the strategy of training original OCR detection model.


python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1

5. Export inference model and deploy it

We can export the pruned model as inference_model for deployment:

python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model

Reference for prediction and deployment of inference model:

  1. inference model python prediction
  2. inference model C++ prediction
  3. Deployment of inference model on mobile