diff --git a/deploy/slim/quantization/quant_kl.py b/deploy/slim/quantization/quant_kl.py new file mode 100755 index 0000000000000000000000000000000000000000..d866784ae6a3c087215320ec95bd39fdd1e89418 --- /dev/null +++ b/deploy/slim/quantization/quant_kl.py @@ -0,0 +1,146 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys + +__dir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(__dir__) +sys.path.append(os.path.abspath(os.path.join(__dir__, '..', '..', '..'))) +sys.path.append( + os.path.abspath(os.path.join(__dir__, '..', '..', '..', 'tools'))) + +import yaml +import paddle +import paddle.distributed as dist + +paddle.seed(2) + +from ppocr.data import build_dataloader +from ppocr.modeling.architectures import build_model +from ppocr.losses import build_loss +from ppocr.optimizer import build_optimizer +from ppocr.postprocess import build_post_process +from ppocr.metrics import build_metric +from ppocr.utils.save_load import init_model +import tools.program as program +import paddleslim +from paddleslim.dygraph.quant import QAT +import numpy as np + +dist.get_world_size() + + +class PACT(paddle.nn.Layer): + def __init__(self): + super(PACT, self).__init__() + alpha_attr = paddle.ParamAttr( + name=self.full_name() + ".pact", + initializer=paddle.nn.initializer.Constant(value=20), + learning_rate=1.0, + regularizer=paddle.regularizer.L2Decay(2e-5)) + + self.alpha = self.create_parameter( + shape=[1], attr=alpha_attr, dtype='float32') + + def forward(self, x): + out_left = paddle.nn.functional.relu(x - self.alpha) + out_right = paddle.nn.functional.relu(-self.alpha - x) + x = x - out_left + out_right + return x + + +quant_config = { + # weight preprocess type, default is None and no preprocessing is performed. + 'weight_preprocess_type': None, + # activation preprocess type, default is None and no preprocessing is performed. + 'activation_preprocess_type': None, + # weight quantize type, default is 'channel_wise_abs_max' + 'weight_quantize_type': 'channel_wise_abs_max', + # activation quantize type, default is 'moving_average_abs_max' + 'activation_quantize_type': 'moving_average_abs_max', + # weight quantize bit num, default is 8 + 'weight_bits': 8, + # activation quantize bit num, default is 8 + 'activation_bits': 8, + # data type after quantization, such as 'uint8', 'int8', etc. default is 'int8' + 'dtype': 'int8', + # window size for 'range_abs_max' quantization. default is 10000 + 'window_size': 10000, + # The decay coefficient of moving average, default is 0.9 + 'moving_rate': 0.9, + # for dygraph quantization, layers of type in quantizable_layer_type will be quantized + 'quantizable_layer_type': ['Conv2D', 'Linear'], +} + + +def sample_generator(loader): + def __reader__(): + for indx, data in enumerate(loader): + images = np.array(data[0]) + yield images + + return __reader__ + + +def main(config, device, logger, vdl_writer): + # init dist environment + if config['Global']['distributed']: + dist.init_parallel_env() + + global_config = config['Global'] + + # build dataloader + config['Train']['loader']['num_workers'] = 0 + train_dataloader = build_dataloader(config, 'Train', device, logger) + if config['Eval']: + config['Eval']['loader']['num_workers'] = 0 + valid_dataloader = build_dataloader(config, 'Eval', device, logger) + else: + valid_dataloader = None + + paddle.enable_static() + place = paddle.CPUPlace() + exe = paddle.static.Executor(place) + + if 'inference_model' in global_config.keys(): # , 'inference_model'): + inference_model_dir = global_config['inference_model'] + else: + inference_model_dir = os.path.dirname(global_config['pretrained_model']) + if not (os.path.exists(os.path.join(inference_model_dir, "inference.pdmodel")) and \ + os.path.exists(os.path.join(inference_model_dir, "inference.pdiparams")) ): + raise ValueError( + "Please set inference model dir in Global.inference_model or Global.pretrained_model for post-quantazition" + ) + + paddleslim.quant.quant_post_static( + executor=exe, + model_dir=inference_model_dir, + model_filename='inference.pdmodel', + params_filename='inference.pdiparams', + quantize_model_path=global_config['save_inference_dir'], + sample_generator=sample_generator(train_dataloader), + save_model_filename='inference.pdmodel', + save_params_filename='inference.pdiparams', + batch_size=1, + batch_nums=None) + + +if __name__ == '__main__': + config, device, logger, vdl_writer = program.preprocess(is_train=True) + main(config, device, logger, vdl_writer) diff --git a/tests/configs/det_mv3_db.yml b/tests/configs/det_mv3_db.yml index d6d4c26cbcafa9ff698faec7f8af950152635eeb..5eada6d53dd3364238bdfc6a3c40515ca0726688 100644 --- a/tests/configs/det_mv3_db.yml +++ b/tests/configs/det_mv3_db.yml @@ -23,10 +23,10 @@ Architecture: name: MobileNetV3 scale: 0.5 model_name: large - disable_se: True + disable_se: False Neck: name: DBFPN - out_channels: 96 + out_channels: 256 Head: name: DBHead k: 50 @@ -74,7 +74,7 @@ Train: channel_first: False - DetLabelEncode: # Class handling label - Resize: - # size: [640, 640] + size: [640, 640] - MakeBorderMap: shrink_ratio: 0.4 thresh_min: 0.3 diff --git a/tests/ocr_det_params.txt b/tests/ocr_det_params.txt index 4ea74746620dbaf130084e7ecb8f76348cac088f..6fd22e409a5219574b2f29285ff5ee5d2e1cf7ca 100644 --- a/tests/ocr_det_params.txt +++ b/tests/ocr_det_params.txt @@ -12,7 +12,7 @@ train_model_name:latest train_infer_img_dir:./train_data/icdar2015/text_localization/ch4_test_images/ null:null ## -trainer:norm_train|pact_train +trainer:norm_train|pact_train|fpgm_train norm_train:tools/train.py -c tests/configs/det_mv3_db.yml -o Global.pretrained_model=./pretrain_models/MobileNetV3_large_x0_5_pretrained pact_train:deploy/slim/quantization/quant.py -c tests/configs/det_mv3_db.yml -o fpgm_train:deploy/slim/prune/sensitivity_anal.py -c tests/configs/det_mv3_db.yml -o Global.pretrained_model=./pretrain_models/det_mv3_db_v2.0_train/best_accuracy @@ -21,7 +21,7 @@ null:null null:null ## ===========================eval_params=========================== -eval:tools/eval.py -c tests/configs/det_mv3_db.yml -o +eval:null null:null ## ===========================infer_params=========================== @@ -35,7 +35,7 @@ export1:null export2:null ## train_model:./inference/ch_ppocr_mobile_v2.0_det_train/best_accuracy -infer_export:tools/export_model.py -c configs/det/det_mv3_db.yml -o +infer_export:tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o infer_quant:False inference:tools/infer/predict_det.py --use_gpu:True|False diff --git a/tests/ocr_kl_quant_params.txt b/tests/ocr_kl_quant_params.txt new file mode 100644 index 0000000000000000000000000000000000000000..c6ee97dca49bb7d942a339783af44053e6c79b00 --- /dev/null +++ b/tests/ocr_kl_quant_params.txt @@ -0,0 +1,51 @@ +===========================train_params=========================== +model_name:ocr_system +python:python3.7 +gpu_list:null +Global.use_gpu:null +Global.auto_cast:null +Global.epoch_num:null +Global.save_model_dir:./output/ +Train.loader.batch_size_per_card:null +Global.pretrained_model:null +train_model_name:null +train_infer_img_dir:null +null:null +## +trainer: +norm_train:null +pact_train:null +fpgm_train:null +distill_train:null +null:null +null:null +## +===========================eval_params=========================== +eval:null +null:null +## +===========================infer_params=========================== +Global.save_inference_dir:./output/ +Global.pretrained_model: +norm_export:null +quant_export:null +fpgm_export:null +distill_export:null +export1:null +export2:null +## +infer_model:./inference/ch_ppocr_mobile_v2.0_det_infer/ +kl_quant:deploy/slim/quantization/quant_kl.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml -o +infer_quant:True +inference:tools/infer/predict_det.py +--use_gpu:TrueFalse +--enable_mkldnn:True|False +--cpu_threads:1|6 +--rec_batch_num:1 +--use_tensorrt:False|True +--precision:fp32|fp16|int8 +--det_model_dir: +--image_dir:./inference/ch_det_data_50/all-sum-510/ +--save_log_path:null +--benchmark:True +null:null diff --git a/tests/test.sh b/tests/test.sh index e7de53a75be50a7596ddef3c6e92706fc935de92..5649e344b76cf4485db533eee4035e1cbdd5adae 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -433,7 +433,9 @@ if [ ${MODE} = "infer" ]; then save_infer_dir=$(dirname $infer_model) set_export_weight=$(func_set_params "${export_weight}" "${infer_model}") set_save_infer_key=$(func_set_params "${save_infer_key}" "${save_infer_dir}") - export_cmd="${python} ${norm_export} ${set_export_weight} ${set_save_infer_key}" + export_cmd="${python} ${infer_run_exports[Count]} ${set_export_weight} ${set_save_infer_key}" + echo ${infer_run_exports[Count]} + echo $export_cmd eval $export_cmd status_export=$? status_check $status_export "${export_cmd}" "${status_log}"