|
1 |
| -# 使用预测模型进行量化训练示例 |
| 1 | +# 自动压缩工具ACT(Auto Compression Tookit) |
2 | 2 |
|
3 |
| -预测模型保存接口: |
4 |
| -动态图使用``paddle.jit.save``保存; |
5 |
| -静态图使用``paddle.static.save_inference_model``保存。 |
| 3 | +## 简介 |
| 4 | +PaddleSlim推出全新自动压缩工具(ACT),旨在通过Source-Free的方式,自动对预测模型进行压缩,压缩后模型可直接部署应用。ACT自动压缩工具主要特性如下: |
| 5 | +- **『更便捷』**:开发者无需了解或修改模型源码,直接使用导出的预测模型进行压缩; |
| 6 | +- **『更智能』**:开发者简单配置即可启动压缩,ACT工具会自动优化得到最好预测模型; |
| 7 | +- **『更丰富』**:ACT中提供了量化训练、蒸馏、结构化剪枝、非结构化剪枝、多种离线量化方法及超参搜索等等,可任意搭配使用。 |
6 | 8 |
|
7 |
| -本示例将介绍如何使用预测模型进行蒸馏量化训练, |
8 |
| -首先使用接口``paddleslim.quant.quant_aware_with_infermodel``训练量化模型, |
9 |
| -训练完成后,使用接口``paddleslim.quant.export_quant_infermodel``将训好的量化模型导出为预测模型。 |
10 | 9 |
|
11 |
| -## 分类模型量化训练流程 |
| 10 | +## 环境准备 |
12 | 11 |
|
13 |
| -### 1. 准备数据 |
| 12 | +- 安装PaddlePaddle >= 2.3版本 (从[Paddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)下载安装) |
| 13 | +- 安装PaddleSlim >= 2.3 或者适当develop版本 |
14 | 14 |
|
15 |
| -在``demo``文件夹下创建``data``文件夹,将``ImageNet``数据集解压在``data``文件夹下,解压后``data/ILSVRC2012``文件夹下应包含以下文件: |
16 |
| -- ``'train'``文件夹,训练图片 |
17 |
| -- ``'train_list.txt'``文件 |
18 |
| -- ``'val'``文件夹,验证图片 |
19 |
| -- ``'val_list.txt'``文件 |
| 15 | +## 快速上手 |
20 | 16 |
|
21 |
| -### 2. 准备需要量化的模型 |
22 |
| - |
23 |
| -飞桨图像识别套件PaddleClas是飞桨为工业界和学术界所准备的一个图像识别任务的工具集,本示例使用该套件产出imagenet分类模型。 |
24 |
| -#### 2.1 下载PaddleClas release/2.3分支代码 |
25 |
| -<https://github.com/PaddlePaddle/PaddleClas/archive/refs/heads/release/2.3.zip> |
26 |
| -解压后,进入PaddleClas目录 |
27 |
| -``` |
28 |
| -cd PaddleClas-release-2.3 |
29 |
| -``` |
30 |
| -#### 2.2 下载MobileNetV2预训练模型 |
31 |
| -在PaddleClas根目录创建``pretrained``文件夹: |
32 |
| -``` |
33 |
| -mkdir pretrained |
| 17 | +```python |
| 18 | +# 导入依赖包 |
| 19 | +from paddleslim.auto_compression.config_helpers import load_config |
| 20 | +from paddleslim.auto_compression import AutoCompression |
| 21 | +from paddleslim.common.imagenet_reader import reader |
| 22 | +# 加载配置文件 |
| 23 | +compress_config, train_config = load_slim_config("./image_classification/mobilenetv1_qat_dis.yaml") |
| 24 | +# 定义DataLoader |
| 25 | +train_loader = reader(mode='test') # DataLoader |
| 26 | +# 开始自动压缩 |
| 27 | +ac = AutoCompression( |
| 28 | + model_dir="./mobilenetv1_infer", |
| 29 | + model_filename="model.pdmodel", |
| 30 | + params_filename="model.pdiparams", |
| 31 | + save_dir="output", |
| 32 | + strategy_config=compress_config, |
| 33 | + train_config=train_config, |
| 34 | + train_dataloader=train_loader, |
| 35 | + eval_callback=None) # eval_function to verify accuracy |
| 36 | +ac.compress() |
34 | 37 | ```
|
35 | 38 |
|
36 |
| -下载预训练模型 |
37 |
| -分类预训练模型库地址 <https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md> |
38 |
| -MobileNetV2预训练模型地址 <https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_pretrained.pdparams> |
39 |
| -执行下载命令: |
40 |
| -``` |
41 |
| -wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV2_pretrained.pdparams -O ./pretrained/MobileNetV2_pretrained.pdparams |
42 |
| -``` |
| 39 | +**提示:** |
| 40 | +- DataLoader传入的数据集是待压缩模型所用的数据集,DataLoader继承自`paddle.io.DataLoader`。 |
| 41 | +- 如无需验证自动压缩过程中模型的精度,`eval_callback`可不传入function,程序会自动根据损失来选择最优模型。 |
| 42 | +- 自动压缩Config中定义量化、蒸馏、剪枝等压缩算法会合并执行,压缩策略有:量化+蒸馏,剪枝+蒸馏等等。 |
43 | 43 |
|
44 |
| -#### 2.3 导出预测模型 |
45 |
| -PaddleClas代码库根目录执行如下命令,导出预测模型 |
46 |
| -``` |
47 |
| -python tools/export_model.py \ |
48 |
| - -c ppcls/configs/ImageNet/MobileNetV2/MobileNetV2.yaml \ |
49 |
| - -o Global.pretrained_model=pretrained/MobileNetV2_pretrained \ |
50 |
| - -o Global.save_inference_dir=infermodel_mobilenetv2 |
51 |
| -``` |
52 |
| -#### 2.4 测试模型精度 |
53 |
| -拷贝``infermodel_mobilenetv2``文件夹到``PaddleSlim/demo/auto_compression/``文件夹。 |
54 |
| -``` |
55 |
| -cd PaddleSlim/demo/auto_compression/ |
56 |
| -``` |
57 |
| -使用[eval.py](../quant/quant_post/eval.py)脚本得到模型的分类精度,压缩后的模型也可以使用同一个脚本测试精度: |
58 |
| -``` |
59 |
| -python ../quant/quant_post/eval.py --model_path infermodel_mobilenetv2 --model_name inference.pdmodel --params_name inference.pdiparams |
60 |
| -``` |
61 |
| -精度输出为: |
62 |
| -``` |
63 |
| -top1_acc/top5_acc= [0.71918 0.90568] |
64 |
| -``` |
| 44 | +## 应用示例 |
65 | 45 |
|
66 |
| -### 3. 进行多策略融合压缩 |
| 46 | +#### [图像分类](./image_classification) |
67 | 47 |
|
68 |
| -每一个小章节代表一种多策略融合压缩,不代表需要串行执行。 |
| 48 | +#### [目标检测](./detection) |
69 | 49 |
|
70 |
| -### 3.1 进行量化蒸馏压缩 |
71 |
| -蒸馏量化训练示例脚本为[demo_imagenet.py](./demo_imagenet.py),使用接口``paddleslim.auto_compression.AutoCompression``对模型进行量化训练。运行命令为: |
72 |
| -``` |
73 |
| -python demo_imagenet.py \ |
74 |
| - --model_dir='infermodel_mobilenetv2' \ |
75 |
| - --model_filename='inference.pdmodel' \ |
76 |
| - --params_filename='./inference.pdiparams' \ |
77 |
| - --save_dir='./save_qat_mbv2/' \ |
78 |
| - --devices='gpu' \ |
79 |
| - --batch_size=64 \ |
80 |
| - --data_dir='../data/ILSVRC2012/' \ |
81 |
| - --config_path='./configs/CV/mbv2_qat_dis.yaml' |
82 |
| -``` |
| 50 | +#### [语义分割](./semantic_segmentation) |
83 | 51 |
|
84 |
| -### 3.2 进行离线量化超参搜索压缩 |
85 |
| -离线量化超参搜索压缩示例脚本为[demo_imagenet.py](./demo_imagenet.py),使用接口``paddleslim.auto_compression.AutoCompression``对模型进行压缩。运行命令为: |
86 |
| -``` |
87 |
| -python demo_imagenet.py \ |
88 |
| - --model_dir='infermodel_mobilenetv2' \ |
89 |
| - --model_filename='inference.pdmodel' \ |
90 |
| - --params_filename='./inference.pdiparams' \ |
91 |
| - --save_dir='./save_ptq_mbv2/' \ |
92 |
| - --devices='gpu' \ |
93 |
| - --batch_size=64 \ |
94 |
| - --data_dir='../data/ILSVRC2012/' \ |
95 |
| - --config_path='./configs/CV/mbv2_ptq_hpo.yaml' |
96 |
| -``` |
| 52 | +#### [NLP](./nlp) |
97 | 53 |
|
98 |
| -### 3.3 进行剪枝蒸馏策略融合压缩 |
99 |
| -注意:本示例为对BERT模型进行ASP稀疏。 |
100 |
| -首先参考[脚本](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/language_model/bert#%E9%A2%84%E6%B5%8B)得到可部署的模型,或者下载SST-2数据集上的示例模型[SST-2-BERT](https://paddle-qa.bj.bcebos.com/PaddleSlim_datasets/static_bert_models.tar.gz)。 |
101 |
| -剪枝蒸馏压缩示例脚本为[demo_glue.py](./demo_glue.py),使用接口``paddleslim.auto_compression.AutoCompression``对模型进行压缩。运行命令为: |
102 |
| -``` |
103 |
| -python demo_glue.py \ |
104 |
| - --model_dir='./static_bert_models/' \ |
105 |
| - --model_filename='bert.pdmodel' \ |
106 |
| - --params_filename='bert.pdiparams' \ |
107 |
| - --save_dir='./save_asp_bert/' \ |
108 |
| - --devices='gpu' \ |
109 |
| - --batch_size=32 \ |
110 |
| - --task='sst-2' \ |
111 |
| - --config_path='./configs/NLP/bert_asp_dis.yaml' |
112 |
| -``` |
| 54 | +#### 即将发布 |
| 55 | +- [ ] 更多自动压缩应用示例 |
| 56 | +- [ ] X2Paddle模型自动压缩示例 |
113 | 57 |
|
114 |
| -### 3.4 进行非结构化稀疏蒸馏策略融合压缩 |
115 |
| -非结构化稀疏蒸馏压缩示例脚本为[demo_imagenet.py](./demo_imagenet.py),使用接口``paddleslim.auto_compression.AutoCompression``对模型进行压缩。运行命令为: |
116 |
| -``` |
117 |
| -python demo_imagenet.py \ |
118 |
| - --model_dir='infermodel_mobilenetv2' \ |
119 |
| - --model_filename='inference.pdmodel' \ |
120 |
| - --params_filename='./inference.pdiparams' \ |
121 |
| - --save_dir='./save_asp_mbv2/' \ |
122 |
| - --devices='gpu' \ |
123 |
| - --batch_size=64 \ |
124 |
| - --data_dir='../data/ILSVRC2012/' \ |
125 |
| - --config_path='./configs/CV/xxx.yaml' |
126 |
| -``` |
| 58 | +## 其他 |
| 59 | + |
| 60 | +- ACT可以自动处理常见的预测模型,如果有更特殊的改造需求,可以参考[ACT超参配置教程](./hyperparameter_tutorial.md)来进行单独配置压缩策略。 |
| 61 | + |
| 62 | +- 如果你发现任何关于ACT自动压缩工具的问题或者是建议, 欢迎通过[GitHub Issues](https://github.com/PaddlePaddle/PaddleSlim/issues)给我们提issues。同时欢迎贡献更多优秀模型,共建开源生态。 |
0 commit comments