Skip to content

Commit

Permalink
update readme (PaddlePaddle#667)
Browse files Browse the repository at this point in the history
* update

* update
  • Loading branch information
ceci3 authored Feb 22, 2021
1 parent 03932a8 commit 3f96a70
Show file tree
Hide file tree
Showing 7 changed files with 344 additions and 44 deletions.
99 changes: 57 additions & 42 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,53 +42,55 @@ pip install paddleslim=2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
PaddleSlim支持以下功能,也支持自定义量化、裁剪等功能。
<table>
<tr align="center" valign="bottom">
<th>Quantization</th>
<th>Pruning</th>
<th>NAS</th>
<th>Distilling</th>
<th><a href="https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/tutorials/quant/overview.md">Quantization</a></th>
<th><a href="https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/tutorials/pruning/overview.md">Pruning</a></th>
<th><a href="https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/tutorials/nas/overview.md">NAS</a></th>
<th><a href="">Distilling</a></th>
</tr>
<tr valign="top">
<td>
<ul>
<li>QAT</li>
<li>PACT</li>
<li>PTQ-Static</li>
<li>PTQ-Dynamic</li>
<li>Embedding Quant</li>
<li><a href="docs/zh_cn/api_cn/overview.md#%E5%9C%A8%E7%BA%BF%E9%87%8F%E5%8C%96%E8%AE%AD%E7%BB%83qat">QAT</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#pact">PACT</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#%E9%9D%99%E6%80%81%E7%A6%BB%E7%BA%BF%E9%87%8F%E5%8C%96ptq-static">PTQ Static</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#%E5%8A%A8%E6%80%81%E7%A6%BB%E7%BA%BF%E9%87%8F%E5%8C%96ptq-dynamic">PTQ Dynamic</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#embedding%E9%87%8F%E5%8C%96">Embedding Quant</a></li>
</ul>
</td>
<td>
<ul>
<li>SensitivityPruner</li>
<li>FPGMFilterPruner</li>
<li>L1NormFilterPruner</li>
<li>L2NormFilterPruner</li>
<li>*SlimFilterPruner</li>
<li>*OptSlimFilterPruner</li>
<li><a href="docs/zh_cn/api_cn/overview.md#%E6%95%8F%E6%84%9F%E5%BA%A6%E5%89%AA%E6%9E%9D">SensitivityPruner</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#fpgm">FPGMFilterPruner</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#l1norm">L1NormFilterPruner</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#l2norm">**L2NormFilterPruner</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#slimfilter">*SlimFilterPruner</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#optslimfilter">*OptSlimFilterPruner</a></li>
</ul>
</td>
<td>
<ul>
<li>*Simulate Anneal based NAS</li>
<li>*Reinforcement Learning based NAS</li>
<li>**DARTS</li>
<li>**PC-DARTS</li>
<li>**Once-for-All</li>
<li>*Hardware-aware Search</li>
<li><a href="docs/zh_cn/api_cn/overview.md#sanas">*Simulate Anneal based NAS</a>/li>
<li><a href="docs/zh_cn/api_cn/overview.md#rlnas">*Reinforcement Learning based NAS</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#darts">**DARTS</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#pc-darts">**PC-DARTS</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#once-for-all">**Once-for-All</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#hardware-aware-search">*Hardware-aware Search</a></li>
</ul>
</td>

<td>
<ul>
<li>*FSP</li>
<li>*DML</li>
<li>*DK for YOLOv3</li>
<li><a href="docs/zh_cn/api_cn/overview.md#fsp">*FSP</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#dml">*DML</a></li>
<li><a href="docs/zh_cn/api_cn/overview.md#dk">*DK</a></li>
</ul>
</td>
</tr>
</table>

注:*表示仅支持静态图,**表示仅支持动态图
注:
- *表示仅支持静态图,**表示仅支持动态图
- 敏感度裁剪指的是通过各个层的敏感度分析来确定各个卷积层的剪裁率,需要和其他裁剪方法配合使用。

### 效果展示

Expand All @@ -108,6 +110,8 @@ PaddleSlim在典型视觉和自然语言处理任务上做了模型压缩,并

### 快速开始

快速开始教程是能基于CIFAR10数据集快速运行起来的简单示例,若您是Paddle官方模型套件用户,请直接使用下方的CV模型压缩或者NLP模型压缩中教程。

- 量化训练 - [动态图](docs/zh_cn/quick_start/dygraph/dygraph_quant_aware_training_tutorial.md) | [静态图](docs/zh_cn/quick_start/static/quant_aware_tutorial.md)
- 离线量化 - [动态图](docs/zh_cn/quick_start/dygraph/dygraph_quant_post_tutorial.md) | [静态图](docs/zh_cn/quick_start/static/quant_post_static_tutorial.md)
- 剪裁 - [动态图](docs/zh_cn/quick_start/dygraph/dygraph_pruning_tutorial.md) | [静态图](docs/zh_cn/quick_start/static/pruning_tutorial.md)
Expand All @@ -116,13 +120,14 @@ PaddleSlim在典型视觉和自然语言处理任务上做了模型压缩,并

### 进阶教程

进阶教程详细介绍了每一步的流程,帮助您把相应方法迁移到您自己的模型上。

- 通道剪裁
- [四种剪裁策略效果对比与应用方法](docs/zh_cn/tutorials/pruning/overview.md)
- [L1NormFilterPruner](docs/zh_cn/tutorials/pruning/overview.md#l1normfilterpruner)
- [FPGMFilterPruner](docs/zh_cn/tutorials/pruning/overview.md#fpgmfilterpruner)
- [SlimFilterFilterPruner](docs/zh_cn/tutorials/pruning/overview.md#slimfilterpruner)
- [OptSlimFilterPruner](docs/zh_cn/tutorials/pruning/overview.md#optslimfilterpruner)
- 剪裁功能详解: [动态图](docs/zh_cn/tutorials/pruning/dygraph/filter_pruning.md) | [静态图](docs/zh_cn/tutorials/pruning/static/image_classification_sensitivity_analysis_tutorial.md)
- 自定义剪裁策略:[动态图](docs/zh_cn/tutorials/pruning/dygraph/self_defined_filter_pruning.md)

- 低比特量化
Expand All @@ -133,6 +138,10 @@ PaddleSlim在典型视觉和自然语言处理任务上做了模型压缩,并

- NAS
- [四种NAS策略介绍和应用](docs/zh_cn/tutorials/nas/overview.md)
- [Once-For-All](docs/zh_cn/tutorials/nas/dygraph/nas_ofa.md)
- [SANAS](docs/zh_cn/tutorials/nas/static/sanas_darts_space.md)
- [RLNAS](https://github.com/PaddlePaddle/PaddleSlim/tree/release/2.0.0/demo/nas#rlnas%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84%E6%90%9C%E7%B4%A2%E7%A4%BA%E4%BE%8B)
- [DARTS](demo/darts/README.md)

- 蒸馏
- [知识蒸馏示例](demo/distillation)
Expand All @@ -145,48 +154,54 @@ PaddleSlim在典型视觉和自然语言处理任务上做了模型压缩,并
- [PaddleLite量化部署](docs/zh_cn/deploy/deploy_cls_model_on_mobile_device.md)

### CV模型压缩
本系列教程均基于Paddle官方的模型套件中模型进行压缩,若您不是模型套件用户,更推荐使用快速教程和进阶教程。

- 检测模型压缩(基于PaddleDetection)
- 检测模型压缩
- 压缩方案
- YOLOv3 3.5倍加速方案: 文档整理中...
- [PPDetection-YOLOv3 压缩方案](docs/zh_cn/cv/detection/static/yolov3_slim.md)
- 方法应用-静态图
- [在COCO和VOC上蒸馏MobileNetV1-YOLOv3](docs/zh_cn/cv/detection/static/paddledetection_slim_distillation_tutorial.md)
- [MobileNetV1-YOLOv3低比特量化训练](docs/zh_cn/cv/detection/static/paddledetection_slim_quantization_tutorial.md)
- [人脸检测模型小模型结构搜索](docs/zh_cn/cv/detection/static/paddledetection_slim_nas_tutorial.md)
- [蒸馏](docs/zh_cn/cv/detection/static/paddledetection_slim_distillation_tutorial.md)
- [量化训练](docs/zh_cn/cv/detection/static/paddledetection_slim_quantization_tutorial.md)
- [模型结构搜索](docs/zh_cn/cv/detection/static/paddledetection_slim_nas_tutorial.md)
- [剪枝](docs/zh_cn/cv/detection/static/paddledetection_slim_pruing_tutorial.md)
- [剪枝与蒸馏的结合使用](docs/zh_cn/cv/detection/static/paddledetection_slim_prune_dist_tutorial.md)
- [卷积层敏感度分析](docs/zh_cn/cv/detection/static/paddledetection_slim_sensitivy_tutorial.md)
- 方法应用-动态图
- 文档整理中...
- [剪枝](#TODO)
- [量化训练](#TODO)

- 分割模型压缩(基于PaddleSeg)
- 分割模型压缩

- 压缩方案
- 方案建设中...

- 方法应用-静态图
- 文档整理中...
- [蒸馏](TODO)
- [量化训练](TODO)
- [模型结构搜索](TODO)
- [剪枝](TODO)

- 方法应用-动态图
- 文档整理中...
- [剪枝](#TODO)
- [量化训练](#TODO)

- [OCR模型压缩(基于PaddleOCR)]()
- OCR模型压缩

- 压缩方案
- 3.5M模型压缩方案: 文档整理中...
- [3.5M模型压缩方案](docs/zh_cn/cv/ocr/static/3.5M_slim.md)

- 方法应用-静态图
- [低比特量化训练](https://github.com/PaddlePaddle/PaddleOCR/tree/release/1.1/deploy/slim/quantization)
- [量化训练](https://github.com/PaddlePaddle/PaddleOCR/tree/release/1.1/deploy/slim/quantization)
- [剪枝](https://github.com/PaddlePaddle/PaddleOCR/tree/release/1.1/deploy/slim/prune)

- 方法应用-动态图
- 文档整理中...
- [剪枝](#TODO)
- [量化训练](#TODO)


### NLP模型压缩

- [BERT](docs/zh_cn/nlp/paddlenlp_slim_ofa_tutorial.md)
- [ERNIE](docs/zh_cn/nlp/ernie_slim_ofa_tutorial.md)
- [PaddleNLP-BERT](docs/zh_cn/nlp/paddlenlp_slim_ofa_tutorial.md)
- [ERNIE-ERNIE](docs/zh_cn/nlp/ernie_slim_ofa_tutorial.md)

### API文档

Expand Down
2 changes: 1 addition & 1 deletion demo/nas/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ CUDA_VISIBLE_DEVICES=0 python block_sa_nas_mobilenetv2.py
## 接口介绍
请参考<a href='../../docs/zh_cn/api_cn/nas_api.rst'>神经网络搜索API文档</a>。

示例为利用SANAS在MobileNetV2的搜索空间上搜索精度更高的模型
示例为利用RLNAS在MobileNetV2的搜索空间上搜索精度更高的模型
## 1 搜索空间配置
默认搜索空间为`MobileNetV2`,详细的搜索空间配置请参考<a href='../../docs/zh_cn/api_cn/search_space.md'>搜索空间配置文档</a>。

Expand Down
141 changes: 141 additions & 0 deletions docs/zh_cn/api_cn/overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
低比特量化
================
定点量化是使用更少的比特数(如8-bit、3-bit、2-bit等)表示神经网络的权重和激活。

在线量化训练(QAT)
-------------
在线量化是在模型训练的过程中建模定点量化对模型的影响,通过在模型计算图中插入量化节点,在训练建模量化对模型精度的影响降低量化损失。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/quanter/qat.rst#qat)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_aware)

PACT
------------
PACT在量化激活值之前去掉一些离群点来使量化精度提高。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/quanter/qat.rst#qat)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/tree/release/2.0.0/demo/quant/pact_quant_aware#%E5%AE%9A%E4%B9%89pact%E5%87%BD%E6%95%B0)

静态离线量化(PTQ Static)
------------
静态离线量化,使用少量校准数据计算量化因子,可以快速得到量化模型。使用该量化模型进行预测,可以减少计算量、降低计算内存、减小模型大小。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_post_static)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_post_static)

动态离线量化(PTQ Dynamic)
------------
动态离线量化,将模型中特定OP的权重从FP32类型量化成INT8/16类型。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_post_dynamic)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_post_dynamic)

Embedding量化
------------
针对 Embedding 参数进行量化。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_embedding)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/quant/quantization_api.rst#quant_embedding)

剪枝
================
剪裁通过从冗余模型中删除不重要的子网络来压缩模型。

敏感度剪枝
-----------
敏感度裁剪指的是通过各个层的敏感度分析来确定各个卷积层的剪裁率,需要和其他裁剪方法配合使用。以下链接仅指向L1Norm剪枝方法和敏感度剪枝混合使用,其他剪枝方法和敏感度剪枝混合使用的方式可以去相应方法的API链接里查看。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/tutorials/pruning/dygraph/filter_pruning.md#41-%E5%8D%B7%E7%A7%AF%E9%87%8D%E8%A6%81%E6%80%A7%E5%88%86%E6%9E%90)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/prune/prune_api.rst#sensitivity)

FPGM
------------
该策略通过统计Filters两两之间的几何距离来评估单个卷积内的Filters的重要性。直觉上理解,离其它Filters平均距离越远的Filter越重要。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/pruners/fpgm_filter_pruner.rst#fpgmfilterpruner)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/9b01b195f0c4bc34a1ab434751cb260e13d64d9e/docs/zh_cn/tutorials/pruning/overview.md#%E9%9D%99%E6%80%81%E5%9B%BE-1)

L1Norm
------------
该策略使用l1-norm统计量来表示一个卷积层内各个Filters的重要性,l1-norm越大的Filter越重要。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/pruners/l1norm_filter_pruner.rst#l1normfilterpruner)
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/9b01b195f0c4bc34a1ab434751cb260e13d64d9e/docs/zh_cn/tutorials/pruning/overview.md#%E9%9D%99%E6%80%81%E5%9B%BE)

L2Norm
------------
该策略使用l2-norm统计量来表示一个卷积层内各个Filters的重要性,l2-norm越大的Filter越重要。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/pruners/l2norm_filter_pruner.rst#l2normfilterpruner)

SlimFilter
------------
该策略根据卷积之后的batch_norm的scale来评估当前卷积内各个Filters的重要性。scale越大,对应的Filter越重要。

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/9b01b195f0c4bc34a1ab434751cb260e13d64d9e/docs/zh_cn/tutorials/pruning/overview.md#slimfilterpruner)

OptSlimFilter
------------
根据卷积层后链接的batch_norm层的scale参数计算出要裁剪的最优裁剪阈值,并根据该阈值进行通道裁剪。

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/9b01b195f0c4bc34a1ab434751cb260e13d64d9e/docs/zh_cn/tutorials/pruning/overview.md#optslimfilterpruner)

模型结构搜索
================
模型结构搜索指的是定义一个搜索空间,其中包括所有候选神经网络结构,不断从中搜索最优网络结构的优化策略。

Once-For-All
------------
OFA是一种基于One-Shot NAS的压缩方案。这种方式比较高效,其优势是只需要训练一个超网络就可以从中选择满足不同延时要求的子模型。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/ofa/ofa_api.rst#ofa-%E8%AE%AD%E7%BB%83)

SANAS
------------
SANAS是基于模拟退火的方式进行网络结构搜索,在机器资源不多的情况下,选择这种方式一般能得到比强化学习更好的模型。

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/nas/nas_api.rst#sanas)

RLNAS
------------
RLNAS是基于强化学习的方式进行网络结构搜索,这种方式需要耗费大量机器资源。

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/nas/nas_api.rst#rlnas)

DARTS
------------
DARTS是基于梯度的方式进行网络结构搜索,可以大大缩短搜索时长。

[动态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/dygraph/nas/darts.rst#%E5%8F%AF%E5%BE%AE%E5%88%86%E6%A8%A1%E5%9E%8B%E6%9E%B6%E6%9E%84%E6%90%9C%E7%B4%A2darts)

PC-DARTS
------------
[动态图](https://github.com/PaddlePaddle/PaddleSlim/tree/release/2.0.0/demo/darts#%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84%E6%90%9C%E7%B4%A2)

Hardware-aware Search
------------
基于硬件进行模型结构搜索,减少搜索和实际部署上的差异。

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/83fd35cd41bba6dbd3b2eb425b867d3d28836cb0/docs/zh_cn/api_cn/static/common/analysis_api.rst#tablelatencyevaluator)


蒸馏
================
模型蒸馏是将复杂网络中的有用信息将复杂网络中的有用信息提取出来提取出来,迁移到一个更小的网络中去。

FSP
------------
出自论文[A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning](http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf)

[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/dist/single_distiller_api.rst#fsp_loss)

DML
------------
出自论文[Deep Mutual Learning](https://arxiv.org/abs/1706.00384)

[静态图](https://github.com/PaddlePaddle/PaddleSlim/tree/release/2.0.0/demo/deep_mutual_learning)

DK
------------
[静态图](https://github.com/PaddlePaddle/PaddleSlim/blob/release/2.0.0/docs/zh_cn/api_cn/static/dist/single_distiller_api.rst#l2_loss)

23 changes: 23 additions & 0 deletions docs/zh_cn/cv/detection/static/yolov3_slim.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# PPDetection-YOLOv3 模型压缩方案

本方案使用蒸馏和剪枝两种方法结合对YOLOv3进行压缩。

教程内容参考:https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.2/slim/extensions/distill_pruned_model

## 示例结果

- 时延单位均为`ms/images`
- Tesla P4时延为单卡并开启TensorRT推理时延
- 高通835/高通855/麒麟970时延为使用PaddleLite部署,使用`arm8`架构并使用4线程(4 Threads)推理时延

| 骨架网络 | 数据集 | 剪裁策略 | GFLOPs | 模型体积(MB) | 输入尺寸 | Tesla P4 | 麒麟970 | 高通835 | 高通855 |
| :--------------- | :----: | :------: | :------------: | :-------------: | :------: | :-------------: | :--------------: | :--------------: | :--------------: |
| MobileNetV1 | VOC | baseline | 20.20 | 93.37 | 608 | 16.556 | 748.404 | 734.970 | 289.878 |
| MobileNetV1 | VOC | baseline | 9.46 | 93.37 | 416 | 9.031 | 371.214 | 349.065 | 140.877 |
| MobileNetV1 | VOC | baseline | 5.60 | 93.37 | 320 | 6.235 | 221.705 | 200.498 | 80.515 |
| MobileNetV1 | VOC | r578 | 6.15(-69.57%) | 30.81(-67.00%) | 608 | 10.064(-39.21%) | 314.531(-57.97%) | 323.537(-55.98%) | 123.414(-57.43%) |
| MobileNetV1 | VOC | r578 | 2.88(-69.57%) | 30.81(-67.00%) | 416 | 5.478(-39.34%) | 151.562(-59.17%) | 146.014(-58.17%) | 56.420(-59.95%) |
| MobileNetV1 | VOC | r578 | 1.70(-69.57%) | 30.81(-67.00%) | 320 | 3.880(-37.77%) | 91.132(-58.90%) | 87.440(-56.39%) | 31.470(-60.91%) |

- 在使用`r578`剪裁策略下,`YOLOv3-MobileNetV1`模型减少了`69.57%`的FLOPs,输入图像尺寸为608时在单卡Tesla P4(TensorRT)推理时间减少`39.21%`,在麒麟970/高通835/高通855上推理时延分别减少`57.97%`, `55.98%``57.43%`

Loading

0 comments on commit 3f96a70

Please sign in to comment.