Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSlim
提交
50d067e8
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看板
未验证
提交
50d067e8
编写于
8月 31, 2021
作者:
L
lidanqing
提交者:
GitHub
8月 31, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix an error in mkldnn doc (#886)
* Fix an issue in mkldnn doc * update README.md
上级
23b2acb4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
13 addition
and
10 deletion
+13
-10
demo/mkldnn_quant/README.md
demo/mkldnn_quant/README.md
+6
-9
demo/mkldnn_quant/sample_tester.cc
demo/mkldnn_quant/sample_tester.cc
+7
-1
未找到文件。
demo/mkldnn_quant/README.md
浏览文件 @
50d067e8
...
...
@@ -67,7 +67,7 @@ python save_quant_model.py --quant_model_path=/PATH/TO/SAVE/FLOAT32/QUANT/MODEL
-
**--op_ids_to_skip:**
以逗号隔开的op id号列表,可选,默认为空。这个列表中的op号将不量化,采用FP32类型。要获取特定op的ID,请先使用
`--debug`
选项运行脚本,并打开生成的文件
`int8_<number>_cpu_quantize_placement_pass.dot`
,找出不需量化的op, ID号在Op名称后面的括号中。
-
**--debug:**
添加此选项可在每个转换步骤之后生成一系列包含模型图的
* .dot文件。 有关DOT格式的说明,请参见[DOT](https://graphviz.gitlab.io/_pages/doc/info/lang.html)。要打开`*
.dot
`文件,请使用系统上可用的任何Graphviz工具(例如Linux上的`
xdot
`工具或Windows上的`
dot
`工具有关文档,请参见[Graphviz](http://www.graphviz.org/documentation/)。
- **注意:**
- 目前支持DNNL量化的op列表是`
conv2d
`, `
depthwise_conv2d
`, `
fc
`, `
matmul
`, `
pool2d
`, `
reshape2
`, `
transpose2
`,`
scale
`, `
concat
`。
- 目前支持DNNL量化的op列表是`
conv2d
`, `
depthwise_conv2d
`, `
fc
`, `
matmul
`, `
pool2d
`, `
reshape2
`, `
transpose2
`,`
scale
`, `
concat
`
,`
gru
`,`
lstm
`
。
- 如果设置 `
--op_ids_to_skip
`,只需要传入所有量化op中想要保持FP32类型的op ID号即可。
- 有时量化全部op不一定得到最优性能。例如:如果一个op是单个的INT8 op, 之前和之后的op都为float32 op,那么为了量化这个op,需要先做quantize,然后运行INT8 op, 再dequantize, 这样可能导致最终性能不如保持该op为fp32 op。如果用户使用默认设置性能较差,可以观察这个模型是否有单独的INT8 op,选出不同的`
ops_to_quantize
`组合,也可以通过`
--op_ids_to_skip
`排除部分可量化op ID,多运行几次获得最佳设置。
...
...
@@ -160,10 +160,8 @@ echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
### 4.3 用户编写自己的测试
如果用户编写自己的测试:
1. 测试INT8模型
如果用户测试转化好的INT8模型,使用 `
paddle::NativeConfig
` 即可测试。在demo中,设置`
use_analysis
`为`
false
`。
2. 测试FP32模型
如果用户要测试PF32模型,使用`
paddle::AnalysisConfig
`对原始FP32模型先优化(fuses等)再测试。在样例中,直接设置`
use_analysis
`为`
true
`。AnalysisConfig设置如下:
1. 测试 Native FP32 模型(不经过MKLDNN优化的),可以使用 `
paddle::NativeConfig
` 测试。在demo中,设置`
use_analysis
`为`
false
`。
2. 测试 MKLDNN FP32 或者 INT8 模型,需要开启`
paddle::AnalysisConfig
`,本案例中,直接设置`
use_analysis
`为`
true
`。AnalysisConfig设置如下:
```
static void SetConfig(paddle::AnalysisConfig *cfg) {
cfg->SetModel(FLAGS_infer_model); // 必须。表示需要测试的模型
...
...
@@ -173,9 +171,8 @@ static void SetConfig(paddle::AnalysisConfig *cfg) {
cfg->SetCpuMathLibraryNumThreads(FLAGS_num_threads); //非必须。默认设置为1。表示多线程运行
}
```
- 在我们提供的样例中,只要设置`
use_analysis
`为true并且`
infer_model
`传入原始FP32模型,AnalysisConfig的上述设置将被执行,传入的FP32模型将被DNNL优化加速(包括fuses等)。
- 如果infer_model传入INT8模型,则 `
use_analysis
`将不起任何作用,因为INT8模型已经被优化量化。
- 如果infer_model传入PaddleSlim产出的quant模型,`
use_analysis
`
即使设置为true不起作用,因为quant模型包含fake_quantize/fake_dequantize ops,无法fuse,无法优化。
- 测试经过 MKLDNN 量化转化的 INT8模型时,仍需设置 `
use_analysis
`为true。
- 当infer_model传入PaddleSlim产出的quant模型,`
use_analysis
`
即使设置为true不起作用,因为quant模型包含fake_quantize/fake_dequantize ops,无法fuse,无法优化。
## 5. 精度和性能数据
INT8模型精度和性能结果参考
[
CPU部署预测INT8模型的精度和性能
](
https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0-alpha/docs/zh_cn/tutorials/image_classification_mkldnn_quant_tutorial.md
)
...
...
@@ -183,4 +180,4 @@ INT8模型精度和性能结果参考[CPU部署预测INT8模型的精度和性
## FAQ
-
自然语言处理模型在CPU上的部署和预测参考样例
[
ERNIE 模型 QUANT INT8 精度与性能复现
](
https://github.com/PaddlePaddle/benchmark/tree/master/Inference/c++/ernie/mkldnn
)
-
具体DNNL量化原理可以查看
[
SLIM Quant for INT8
DNNL
](
https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/contrib/slim/tests/README.md
)
。
-
具体DNNL量化原理可以查看
[
SLIM Quant for INT8
MKLDNN
](
https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/contrib/slim/tests/README.md
)
。
demo/mkldnn_quant/sample_tester.cc
浏览文件 @
50d067e8
...
...
@@ -39,6 +39,7 @@ DEFINE_bool(with_accuracy_layer,
DEFINE_bool
(
use_analysis
,
false
,
"If use_analysis is set to true, the model will be optimized"
);
DEFINE_int32
(
warmup_iter
,
2
,
"number of warmup batches"
);
struct
Timer
{
std
::
chrono
::
high_resolution_clock
::
time_point
start
;
...
...
@@ -181,7 +182,12 @@ void PredictionRun(paddle::PaddlePredictor *predictor,
Timer
run_timer
;
double
elapsed_time
=
0
;
int
predicted_num
=
0
;
// warmup
for
(
int
k
=
0
;
k
<
FLAGS_warmup_iter
;
k
++
){
predictor
->
Run
(
inputs
[
k
],
&
(
*
outputs
)[
k
],
FLAGS_batch_size
);
LOG
(
INFO
)
<<
"Warmup "
<<
k
<<
" batches"
;
}
// run
for
(
int
i
=
0
;
i
<
iterations
;
i
++
)
{
run_timer
.
tic
();
predictor
->
Run
(
inputs
[
i
],
&
(
*
outputs
)[
i
],
FLAGS_batch_size
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录