Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSlim
提交
a8c16a7b
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看板
未验证
提交
a8c16a7b
编写于
1月 04, 2022
作者:
I
itminner
提交者:
GitHub
1月 04, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加详细复现步骤到readme (#965)
上级
28bea706
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
59 addition
and
32 deletion
+59
-32
demo/quant/quant_aware_with_infermodel/README.md
demo/quant/quant_aware_with_infermodel/README.md
+56
-31
paddleslim/quant/quant_aware_with_infermodel.py
paddleslim/quant/quant_aware_with_infermodel.py
+3
-1
未找到文件。
demo/quant/quant_aware_with_infermodel/README.md
浏览文件 @
a8c16a7b
# 使用预测模型进行量化训练示例
预测模型
获取
动态图使用
paddle.jit.save
保存;
静态图使用
paddle.static.save_inference_model
保存。
预测模型
保存接口:
动态图使用
``paddle.jit.save``
保存;
静态图使用
``paddle.static.save_inference_model``
保存。
本示例将介绍如何使用预测模型进行蒸馏量化训练,
首先使用接口
``paddleslim.quant.quant_aware_with_infermodel``
训练量化模型,
...
...
@@ -10,7 +10,7 @@
## 分类模型量化训练流程
###1. 准备数据
###
1. 准备数据
在
``demo``
文件夹下创建
``data``
文件夹,将
``ImageNet``
数据集解压在
``data``
文件夹下,解压后
``data/ILSVRC2012``
文件夹下应包含以下文件:
-
``'train'``
文件夹,训练图片
...
...
@@ -21,10 +21,25 @@
### 2. 准备需要量化的模型
飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,本示例使用该套件产出imagenet分类模型。
####① 下载MobileNetV2预训练模型
预训练模型库地址
``https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md``
MobileNetV2预训练模型地址
``https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_pretrained.pdparams``
在PaddleClas代码库根目录创建pretrained文件夹,MobileNetV2预训练参数保存在该文件夹中。
#### ① 下载PaddleClas release/2.3分支代码
<https://github.com/PaddlePaddle/PaddleClas/archive/refs/heads/release/2.3.zip>
解压后,进入PaddleClas目录
```
cd PaddleClas-release-2.3
```
#### ② 下载MobileNetV2预训练模型
在PaddleClas根目录创建
``pretrained``
文件夹:
```
mkdir pretrained
```
下载预训练模型
分类预训练模型库地址
<https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md>
MobileNetV2预训练模型地址
<https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_pretrained.pdparams>
执行下载命令:
```
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_pretrained.pdparams -O ./pretrained/MobileNetV2_pretrained.pdparams
```
#### ② 导出预测模型
PaddleClas代码库根目录执行如下命令,导出预测模型
...
...
@@ -32,9 +47,13 @@ PaddleClas代码库根目录执行如下命令,导出预测模型
python tools/export_model.py \
-c ppcls/configs/ImageNet/MobileNetV2/MobileNetV2.yaml \
-o Global.pretrained_model=pretrained/MobileNetV2_pretrained \
-o Global.save_inference_dir=infermodel_mobilenetv2
\
-o Global.save_inference_dir=infermodel_mobilenetv2
```
#### ③ 测试模型精度
拷贝
``infermodel_mobilenetv2``
文件夹到
``PaddleSlim/demo/quant/quant_aware_with_infermodel/``
文件夹。
```
cd PaddleSlim/demo/quant/quant_aware_with_infermodel/
```
使用
[
eval.py
](
../quant_post/eval.py
)
脚本得到模型的分类精度:
```
python ../quant_post/eval.py --model_path infermodel_mobilenetv2 --model_name inference.pdmodel --params_name inference.pdiparams
...
...
@@ -49,16 +68,16 @@ top1_acc/top5_acc= [0.71918 0.90568]
蒸馏量化训练示例脚本为
[
quant_aware_with_infermodel.py
](
./quant_aware_with_infermodel.py
)
,使用接口
``paddleslim.quant.quant_aware_with_infermodel``
对模型进行量化训练。运行命令为:
```
python quant_aware_with_infermodel.py \
--use_gpu=
Fals
e \
--batch_size=2 \
--num_epoch=
30
\
--save_iter_step=
2
0 \
--use_gpu=
Tru
e \
--batch_size=
51
2 \
--num_epoch=
1
\
--save_iter_step=
10
0 \
--learning_rate=0.0001 \
--weight_decay=0.00004 \
--use_pact=
Fals
e \
--checkpoint_path="./
inference_model/MobileNet
_quantaware_ckpt/" \
--model_path_prefix="./infer
ence_model/infer
model_mobilenetv2/inference" \
--teacher_model_path_prefix="./infer
ence_model/infer
model_mobilenetv2/inference" \
--use_pact=
Tru
e \
--checkpoint_path="./
MobileNetV2
_quantaware_ckpt/" \
--model_path_prefix="./infermodel_mobilenetv2/inference" \
--teacher_model_path_prefix="./infermodel_mobilenetv2/inference" \
--distill_node_name_list "teacher_conv2d_54.tmp_0" "conv2d_54.tmp_0" "teacher_conv2d_55.tmp_0" "conv2d_55.tmp_0" \
"teacher_conv2d_57.tmp_0" "conv2d_57.tmp_0" "teacher_elementwise_add_0" "elementwise_add_0" \
"teacher_conv2d_61.tmp_0" "conv2d_61.tmp_0" "teacher_elementwise_add_1" "elementwise_add_1" \
...
...
@@ -70,12 +89,13 @@ python quant_aware_with_infermodel.py \
"teacher_elementwise_add_9" "elementwise_add_9" "teacher_conv2d_87.tmp_0" "conv2d_87.tmp_0" \
"teacher_linear_1.tmp_0" "linear_1.tmp_0"
```
-
``use_gpu``
: 是否使用GPU。
-
``batch_size``
: 量化训练batch size。
-
``num_epoch``
: 量化训练epoch数。
-
``save_iter_step``
: 每隔save_iter_step保存一次checkpoint。
-
``learning_rate``
: 量化训练学习率,推荐使用float模型训练最小一级学习率。
-
``weight_decay``
: 推荐使用float模型训练weight decay设置。
-
``use_pact``
: 是否使用pact量化算法
, 推荐使用
。
-
``use_pact``
: 是否使用pact量化算法
,
``推荐使用,量化精度更好``
。
-
``checkpoint_path``
: 量化训练模型checkpoint保存路径。
-
``model_path_prefix``
: 需要量化模型的目录 + 模型名称(不包含后缀)
-
``teacher_model_path_prefix``
: teacher模型的目录 + 模型名称(不包含后缀), 可以和量化模型是同一个,即自蒸馏。
...
...
@@ -83,22 +103,23 @@ python quant_aware_with_infermodel.py \
运行以上命令后,可在
``${checkpoint_path}``
下看到量化后模型的checkpoint。
``注意:不需训练一个完整的epoch,精度不再增长即可停止训练。训练中精度测试关键字 top1_acc/top5_acc``
### 4. 量化模型导出
量化模型checkpoint导出为预测模型。
```
python export_quantmodel.py \
--use_gpu=
Fals
e \
--batch_size=2 \
--num_epoch=
30
\
--save_iter_step=
2
0 \
--use_gpu=
Tru
e \
--batch_size=
51
2 \
--num_epoch=
1
\
--save_iter_step=
10
0 \
--learning_rate=0.0001 \
--weight_decay=0.00004 \
--use_pact=
Fals
e \
--checkpoint_path="./
inference_model/MobileNet
_quantaware_ckpt/" \
--model_path_prefix="./infer
ence_model/infer
model_mobilenetv2/inference" \
--teacher_model_path_prefix="./infer
ence_model/infer
model_mobilenetv2/inference" \
--use_pact=
Tru
e \
--checkpoint_path="./
MobileNetV2
_quantaware_ckpt/" \
--model_path_prefix="./infermodel_mobilenetv2/inference" \
--teacher_model_path_prefix="./infermodel_mobilenetv2/inference" \
--distill_node_name_list "teacher_conv2d_54.tmp_0" "conv2d_54.tmp_0" "teacher_conv2d_55.tmp_0" "conv2d_55.tmp_0" \
"teacher_conv2d_57.tmp_0" "conv2d_57.tmp_0" "teacher_elementwise_add_0" "elementwise_add_0" \
"teacher_conv2d_61.tmp_0" "conv2d_61.tmp_0" "teacher_elementwise_add_1" "elementwise_add_1" \
...
...
@@ -109,8 +130,8 @@ python export_quantmodel.py \
"teacher_conv2d_81.tmp_0" "conv2d_81.tmp_0" "teacher_elementwise_add_8" "elementwise_add_8" \
"teacher_elementwise_add_9" "elementwise_add_9" "teacher_conv2d_87.tmp_0" "conv2d_87.tmp_0" \
"teacher_linear_1.tmp_0" "linear_1.tmp_0" \
--checkpoint_filename="epoch_0_iter_
2
0" \
--export_inference_model_path_prefix="./
inference_model/MobileNet_quantaware_ckpt/epoch_0_iter_2
0_infer"
--checkpoint_filename="epoch_0_iter_
140
0" \
--export_inference_model_path_prefix="./
MobileNetV2_quantaware_ckpt/epoch_0_iter_140
0_infer"
```
-
``checkpoint_filename``
: checkpoint文件名。
-
``export_inference_model_path_prefix``
: 量化模型导出的目录 + 模型名称(不包含后缀)。
...
...
@@ -119,9 +140,13 @@ python export_quantmodel.py \
使用
[
eval.py
](
../quant_post/eval.py
)
脚本对量化后的模型进行精度测试:
```
python ../quant_post/eval.py --model_path ./
quant_infermodel_mobilenetv2/ --model_name model --params_name
params
python ../quant_post/eval.py --model_path ./
MobileNetV2_quantaware_ckpt --model_name epoch_0_iter_1400_infer.pdmodel --params_name epoch_0_iter_1400_infer.pdi
params
```
精度输出为:
```
top1_acc/top5_acc= [0.71764 0.90418]
top1_acc/top5_acc= [0.71922 0.90546]
```
如上面各步骤使用参数设定
``use_pact=False``
, 模型最终精度为:
```
top1_acc/top5_acc= [0.7181 0.90544]
```
paddleslim/quant/quant_aware_with_infermodel.py
浏览文件 @
a8c16a7b
...
...
@@ -355,6 +355,8 @@ def quant_aware_with_infermodel(executor,
if
iter_num
>
0
and
iter_num
%
save_iter_step
==
0
:
checkpoint_name
=
"epoch_"
+
str
(
epoch
)
+
"_iter_"
+
str
(
iter_num
)
if
not
os
.
path
.
exists
(
train_config
[
"quant_model_ckpt_path"
]):
os
.
makedirs
(
train_config
[
"quant_model_ckpt_path"
])
paddle
.
static
.
save
(
program
=
test_program
,
model_path
=
os
.
path
.
join
(
...
...
@@ -419,7 +421,7 @@ def export_quant_infermodel(
############################################################################
# quant
############################################################################
use_pact
=
train_config
[
"use_pact"
]
use_pact
=
False
# export model should set use_pact is False
if
use_pact
:
act_preprocess_func
=
pact
optimizer_func
=
get_pact_optimizer
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录