From bf7efc031ac4983d3c20d5780f1fdcdecbc97032 Mon Sep 17 00:00:00 2001 From: Chang Xu Date: Tue, 25 Oct 2022 17:35:00 +0800 Subject: [PATCH] [Cherry-Pick] Update Analysis (#1481) --- .../detection/README.md | 4 ++-- .../pytorch_yolo_series/README.md | 4 ++-- paddleslim/quant/analysis.py | 18 +++++------------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/example/post_training_quantization/detection/README.md b/example/post_training_quantization/detection/README.md index 3e76ba64..97b71a55 100644 --- a/example/post_training_quantization/detection/README.md +++ b/example/post_training_quantization/detection/README.md @@ -130,7 +130,7 @@ python eval.py --config_path=./configs/ppyoloe_s_ptq.yaml - 要测试的模型路径可以在配置文件中`model_dir`字段下进行修改。 #### 3.6 提高离线量化精度 -本节介绍如何使用量化分析工具提升离线量化精度。离线量化功能仅需使用少量数据,且使用简单、能快速得到量化模型,但往往会造成较大的精度损失。PaddleSlim提供量化分析工具,会使用接口```paddleslim.quant.AnalysisQuant```,可视化展示出不适合量化的层,通过跳过这些层,提高离线量化模型精度。```paddleslim.quant.AnalysisQuant```详解见[AnalysisQuant.md](../../../../docs/zh_cn/tutorials/quant/AnalysisQuant.md)。 +本节介绍如何使用量化分析工具提升离线量化精度。离线量化功能仅需使用少量数据,且使用简单、能快速得到量化模型,但往往会造成较大的精度损失。PaddleSlim提供量化分析工具,会使用接口```paddleslim.quant.AnalysisQuant```,可视化展示出不适合量化的层,通过跳过这些层,提高离线量化模型精度。```paddleslim.quant.AnalysisQuant```详解见[AnalysisQuant.md](../../../docs/zh_cn/tutorials/quant/AnalysisQuant.md)。 经过多个实验,包括尝试多种激活算法(avg,KL等)、weight的量化方式(abs_max,channel_wise_abs_max),对PicoDet-s进行离线量化后精度均为0,以PicoDet-s为例,量化分析工具具体使用方法如下: @@ -162,11 +162,11 @@ python post_quant.py --config_path=./configs/picodet_s_analyzed_ptq.yaml --save_ **加速分析过程** 使用量化分析工具时,因需要逐层量化模型并进行验证,因此过程可能较慢,若想加速分析过程,可以在配置文件中设置 `FastEvalDataset` ,输入一个图片数量较少的annotation文件路径。注意,用少量数据验证的模型精度不一定等于全量数据验证的模型精度,若只需分析时获得不同层量化效果的相对排序,可以使用少量数据集;若要求准确精度,请使用全量验证数据集。如需要全量验证数据,将 `FastEvalDataset` 字段删掉即可。 +若需要少量验证数据集来快速验证,可下载:[单张COCO验证数据集](https://bj.bcebos.com/v1/paddle-slim-models/data/small_instances_val2017.json)。 注:分析之后若需要直接产出符合目标精度的量化模型,demo代码不会使用少量数据集验证,会自动使用全量验证数据。 -量化分析工具详细介绍见[量化分析工具介绍](../analysis.md) ## 4.预测部署 预测部署可参考[Detection模型自动压缩示例](https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/detection) diff --git a/example/post_training_quantization/pytorch_yolo_series/README.md b/example/post_training_quantization/pytorch_yolo_series/README.md index e0ed9bfc..9ab05a20 100644 --- a/example/post_training_quantization/pytorch_yolo_series/README.md +++ b/example/post_training_quantization/pytorch_yolo_series/README.md @@ -116,7 +116,7 @@ python eval.py --config_path=./configs/yolov5s_ptq.yaml #### 3.6 提高离线量化精度 -本节介绍如何使用量化分析工具提升离线量化精度。离线量化功能仅需使用少量数据,且使用简单、能快速得到量化模型,但往往会造成较大的精度损失。PaddleSlim提供量化分析工具,会使用接口```paddleslim.quant.AnalysisQuant```,可视化展示出不适合量化的层,通过跳过这些层,提高离线量化模型精度。```paddleslim.quant.AnalysisQuant```详解见[AnalysisQuant.md](../../../../docs/zh_cn/tutorials/quant/AnalysisQuant.md)。 +本节介绍如何使用量化分析工具提升离线量化精度。离线量化功能仅需使用少量数据,且使用简单、能快速得到量化模型,但往往会造成较大的精度损失。PaddleSlim提供量化分析工具,会使用接口```paddleslim.quant.AnalysisQuant```,可视化展示出不适合量化的层,通过跳过这些层,提高离线量化模型精度。```paddleslim.quant.AnalysisQuant```详解见[AnalysisQuant.md](../../../docs/zh_cn/tutorials/quant/AnalysisQuant.md)。 由于YOLOv6离线量化效果较差,以YOLOv6为例,量化分析工具具体使用方法如下: @@ -153,10 +153,10 @@ python post_quant.py --config_path=./configs/yolov6s_analyzed_ptq.yaml --save_di **加速分析过程** 使用量化分析工具时,因需要逐层量化模型并进行验证,因此过程可能较慢,若想加速分析过程,可以在配置文件中设置 `fast_val_anno_path` ,输入一个图片数量较少的annotation文件路径。注意,用少量数据验证的模型精度不一定等于全量数据验证的模型精度,若只需分析时获得不同层量化效果的相对排序,可以使用少量数据集;若要求准确精度,请使用全量验证数据集。如需要全量验证数据,将 `fast_val_anno_path` 设置为None即可。 +若需要少量验证数据集来快速验证,可下载:[单张COCO验证数据集](https://bj.bcebos.com/v1/paddle-slim-models/data/small_instances_val2017.json)。 注:分析之后若需要直接产出符合目标精度的量化模型,demo代码不会使用少量数据集验证,会自动使用全量验证数据。 -量化分析工具详细介绍见[量化分析工具介绍](../analysis.md) ## 4.预测部署 预测部署可参考[YOLO系列模型自动压缩示例](https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_yolo_series) diff --git a/paddleslim/quant/analysis.py b/paddleslim/quant/analysis.py index 7da2a10e..d2e12c94 100644 --- a/paddleslim/quant/analysis.py +++ b/paddleslim/quant/analysis.py @@ -86,8 +86,6 @@ class AnalysisQuant(object): 'is_full_quantize'] if 'is_full_quantize' in ptq_config else False self.onnx_format = ptq_config[ 'onnx_format'] if 'onnx_format' in ptq_config else False - if 'algo' not in ptq_config: - ptq_config['algo'] = 'avg' if not os.path.exists(self.save_dir): os.mkdir(self.save_dir) @@ -112,7 +110,7 @@ class AnalysisQuant(object): self.data_loader = wrap_dataloader(data_loader, self.feed_list) # quant model to get quantizable ops - post_training_quantization = self.create_ptq(executor, None, 'avg') + post_training_quantization = self.create_ptq(executor, None) _logger.info('Run PTQ before analysis.') program = post_training_quantization.quantize() @@ -170,7 +168,7 @@ class AnalysisQuant(object): writer.writerow(d) _logger.info('Activation Statistic is saved in {}'.format(save_path)) - def create_ptq(self, executor, skip_tensor_list, algo): + def create_ptq(self, executor, skip_tensor_list): return PostTrainingQuantization( executor=executor, data_loader=self.data_loader, @@ -178,7 +176,6 @@ class AnalysisQuant(object): model_filename=self.model_filename, params_filename=self.params_filename, skip_tensor_list=skip_tensor_list, - algo=algo, # avg fastest onnx_format=self.onnx_format, **self.ptq_config) @@ -196,8 +193,7 @@ class AnalysisQuant(object): def eval_quant_model(self, skip_list): executor = paddle.static.Executor(self.places) - post_training_quantization = self.create_ptq( - executor, skip_list, algo='avg') + post_training_quantization = self.create_ptq(executor, skip_list) program = post_training_quantization.quantize() _logger.info('Evaluating...') if self.onnx_format: @@ -313,7 +309,7 @@ class AnalysisQuant(object): _logger.info('Collecting Statistic After PTQ...') executor = paddle.static.Executor(self.places) scope = global_scope() - post_training_quantization = self.create_ptq(executor, None, algo='avg') + post_training_quantization = self.create_ptq(executor, None) program = post_training_quantization.quantize() persistable_var_names = [] @@ -538,11 +534,7 @@ class AnalysisQuant(object): skip_list.append(rank_list.pop(0)) _logger.info('Skip Ops: {}'.format(skip_list)) executor = paddle.static.Executor(self.places) - post_training_quantization = self.create_ptq( - executor, - skip_list, - algo=self.ptq_config['algo'] - if 'algo' in self.ptq_config else 'KL') + post_training_quantization = self.create_ptq(executor, skip_list) program = post_training_quantization.quantize() _logger.info('Evaluating...') -- GitLab