Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSlim
提交
bf7efc03
P
PaddleSlim
项目概览
PaddlePaddle
/
PaddleSlim
1 年多 前同步成功
通知
51
Star
1434
Fork
344
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
53
列表
看板
标记
里程碑
合并请求
16
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleSlim
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
53
Issue
53
列表
看板
标记
里程碑
合并请求
16
合并请求
16
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
bf7efc03
编写于
10月 25, 2022
作者:
C
Chang Xu
提交者:
GitHub
10月 25, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Cherry-Pick] Update Analysis (#1481)
上级
18d3524a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
9 addition
and
17 deletion
+9
-17
example/post_training_quantization/detection/README.md
example/post_training_quantization/detection/README.md
+2
-2
example/post_training_quantization/pytorch_yolo_series/README.md
.../post_training_quantization/pytorch_yolo_series/README.md
+2
-2
paddleslim/quant/analysis.py
paddleslim/quant/analysis.py
+5
-13
未找到文件。
example/post_training_quantization/detection/README.md
浏览文件 @
bf7efc03
...
...
@@ -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
)
...
...
example/post_training_quantization/pytorch_yolo_series/README.md
浏览文件 @
bf7efc03
...
...
@@ -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
)
...
...
paddleslim/quant/analysis.py
浏览文件 @
bf7efc03
...
...
@@ -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...'
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录