未验证 提交 450871cd 编写于 作者: G Guanghua Yu 提交者: GitHub

[cherry-pick] Fix v0.2 docs (#258)

* fix save checkpoint in quantization (#257)

* fix save checkpoint in quantization
* fix details

* Fix softlink (#256)
Co-authored-by: NLiufang Sang <slf12thuss@163.com>
上级 d99e2045
...@@ -80,11 +80,11 @@ PaddleDetection的目的是为工业界和学术界提供丰富、易用的目 ...@@ -80,11 +80,11 @@ PaddleDetection的目的是为工业界和学术界提供丰富、易用的目
- [IPython Notebook demo](demo/mask_rcnn_demo.ipynb) - [IPython Notebook demo](demo/mask_rcnn_demo.ipynb)
- [迁移学习教程](docs/advanced_tutorials/TRANSFER_LEARNING_cn.md) - [迁移学习教程](docs/advanced_tutorials/TRANSFER_LEARNING_cn.md)
- [模型压缩](slim) - [模型压缩](slim)
- [压缩benchmark](slim)
- [量化](slim/quantization) - [量化](slim/quantization)
- [剪枝](slim/prune) - [剪枝](slim/prune)
- [蒸馏](slim/distillation) - [蒸馏](slim/distillation)
- [神经网络搜索](slim/nas) - [神经网络搜索](slim/nas)
- [压缩benchmark](slim)
- [推理部署](inference) - [推理部署](inference)
- [模型导出教程](docs/advanced_tutorials/inference/EXPORT_MODEL.md) - [模型导出教程](docs/advanced_tutorials/inference/EXPORT_MODEL.md)
- [预测引擎Python API使用示例](docs/advanced_tutorials/inference/INFERENCE.md) - [预测引擎Python API使用示例](docs/advanced_tutorials/inference/INFERENCE.md)
...@@ -105,7 +105,7 @@ PaddleDetection的目的是为工业界和学术界提供丰富、易用的目 ...@@ -105,7 +105,7 @@ PaddleDetection的目的是为工业界和学术界提供丰富、易用的目
本项目的发布受[Apache 2.0 license](LICENSE)许可认证。 本项目的发布受[Apache 2.0 license](LICENSE)许可认证。
## 版本更新 ## 版本更新
v0.2.0版本已经在`01/2020`发布,增加多个模型,升级数据处理模块,拆分YOLOv3的loss,修复已知诸多bug等, v0.2.0版本已经在`02/2020`发布,增加多个模型,升级数据处理模块,拆分YOLOv3的loss,修复已知诸多bug等,
详细内容请参考[版本更新文档](docs/CHANGELOG.md) 详细内容请参考[版本更新文档](docs/CHANGELOG.md)
## 如何贡献代码 ## 如何贡献代码
......
...@@ -91,10 +91,11 @@ Advanced Features: ...@@ -91,10 +91,11 @@ Advanced Features:
- [IPython Notebook demo](demo/mask_rcnn_demo.ipynb) - [IPython Notebook demo](demo/mask_rcnn_demo.ipynb)
- [Transfer learning document](docs/advanced_tutorials/TRANSFER_LEARNING.md) - [Transfer learning document](docs/advanced_tutorials/TRANSFER_LEARNING.md)
- [Model compression](slim) - [Model compression](slim)
- [Quantization-aware training example](slim/quantization) - [Model compression benchmark](slim)
- [Model pruning example](slim/prune) - [Quantization](slim/quantization)
- [Model distillation example](slim/distillation) - [Model pruning](slim/prune)
- [Neural Architecture Search example](slim/nas) - [Model distillation](slim/distillation)
- [Neural Architecture Search](slim/nas)
- [Deployment](inference) - [Deployment](inference)
- [Export model for inference](docs/advanced_tutorials/inference/EXPORT_MODEL.md) - [Export model for inference](docs/advanced_tutorials/inference/EXPORT_MODEL.md)
- [Model inference](docs/advanced_tutorials/inference/INFERENCE.md) - [Model inference](docs/advanced_tutorials/inference/INFERENCE.md)
...@@ -115,7 +116,7 @@ Advanced Features: ...@@ -115,7 +116,7 @@ Advanced Features:
PaddleDetection is released under the [Apache 2.0 license](LICENSE). PaddleDetection is released under the [Apache 2.0 license](LICENSE).
## Updates ## Updates
v0.2.0 was released at `01/2020`, add some models,Upgrade data processing module, Split YOLOv3's loss, fix many known bugs, etc. v0.2.0 was released at `02/2020`, add some models,Upgrade data processing module, Split YOLOv3's loss, fix many known bugs, etc.
Please refer to [版本更新文档](docs/CHANGELOG.md) for details. Please refer to [版本更新文档](docs/CHANGELOG.md) for details.
## Contributing ## Contributing
......
../../../slim/distillation/README.md
\ No newline at end of file
slim/README.md ../../../slim/README.md
\ No newline at end of file \ No newline at end of file
../../../slim/nas/README.md
\ No newline at end of file
../../../slim/quantization/README.md
\ No newline at end of file
../../../../slim/distillation/README.md
\ No newline at end of file
模型蒸馏
===========================================
.. toctree::
:maxdepth: 2
DISTILLATION.md
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
DISTILLATION.md
QUANTIZATION.md
NAS.md
prune/index
MODEL_ZOO.md MODEL_ZOO.md
distillation/index
quantization/index
nas/index
prune/index
../../../../slim/nas/README.md
\ No newline at end of file
神经网络搜索
===========================================
.. toctree::
:maxdepth: 2
NAS.md
模型剪枝教程 模型剪枝
=========================================== ===========================================
.. toctree:: .. toctree::
......
../../../../slim/quantization/README.md
\ No newline at end of file
模型量化
===========================================
.. toctree::
:maxdepth: 2
QUANTIZATION.md
# 简介 # 压缩benchmark
在PaddleDetection, 提供了基于PaddleSlim进行模型压缩的完整教程和实验结果。详细教程请参考: 在PaddleDetection, 提供了基于PaddleSlim进行模型压缩的完整教程和实验结果。详细教程请参考:
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
下面给出压缩的benchmark实验结果。 下面给出压缩的benchmark实验结果。
# 压缩模型库
## 测试环境 ## 测试环境
- Python 2.7.1 - Python 2.7.1
...@@ -23,7 +21,7 @@ ...@@ -23,7 +21,7 @@
### 训练策略 ### 训练策略
- 剪裁模型训练时使用[PaddleDetection模型库](../docs/MODEL_ZOO_cn.md)发布的模型权重作为预训练权重。 - 剪裁模型训练时使用[PaddleDetection模型库](https://paddledetection.readthedocs.io/zh/latest/MODEL_ZOO_cn.html)发布的模型权重作为预训练权重。
- 剪裁训练使用模型默认配置,即除`pretrained_weights`外配置不变。 - 剪裁训练使用模型默认配置,即除`pretrained_weights`外配置不变。
- 剪裁模型全部为基于敏感度的卷积通道剪裁。 - 剪裁模型全部为基于敏感度的卷积通道剪裁。
- YOLOv3模型主要剪裁`yolo_head`部分,即剪裁参数如下。 - YOLOv3模型主要剪裁`yolo_head`部分,即剪裁参数如下。
...@@ -69,7 +67,7 @@ ...@@ -69,7 +67,7 @@
### 蒸馏通道剪裁模型 ### 蒸馏通道剪裁模型
可通过高精度模型蒸馏通道剪裁后模型的方式,训练方法及相关示例见[蒸馏通道剪裁模型](./extensions/distill_pruned_model/distill_pruned_model_demo.ipynb) 可通过高精度模型蒸馏通道剪裁后模型的方式,训练方法及相关示例见[蒸馏通道剪裁模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/slim/extensions/distill_pruned_model/distill_pruned_model_demo.ipynb)
COCO数据集上蒸馏通道剪裁模型库如下。 COCO数据集上蒸馏通道剪裁模型库如下。
...@@ -93,7 +91,7 @@ Pascal VOC数据集上蒸馏通道剪裁模型库如下。 ...@@ -93,7 +91,7 @@ Pascal VOC数据集上蒸馏通道剪裁模型库如下。
### 训练策略 ### 训练策略
- 蒸馏模型训练时teacher模型使用[PaddleDetection模型库](../docs/MODEL_ZOO_cn.md)发布的模型权重作为预训练权重。 - 蒸馏模型训练时teacher模型使用[PaddleDetection模型库](https://paddledetection.readthedocs.io/zh/latest/MODEL_ZOO_cn.html)发布的模型权重作为预训练权重。
- 蒸馏模型训练时student模型使用backbone的预训练权重 - 蒸馏模型训练时student模型使用backbone的预训练权重
### YOLOv3 on COCO ### YOLOv3 on COCO
......
...@@ -22,6 +22,7 @@ import time ...@@ -22,6 +22,7 @@ import time
import numpy as np import numpy as np
import datetime import datetime
from collections import deque from collections import deque
import shutil
from paddle import fluid from paddle import fluid
...@@ -42,6 +43,21 @@ logging.basicConfig(level=logging.INFO, format=FORMAT) ...@@ -42,6 +43,21 @@ logging.basicConfig(level=logging.INFO, format=FORMAT)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def save_checkpoint(exe, prog, path, train_prog):
if os.path.isdir(path):
shutil.rmtree(path)
logger.info('Save model to {}.'.format(path))
fluid.io.save_persistables(exe, path, main_program=prog)
v = train_prog.global_block().var('@LR_DECAY_COUNTER@')
fluid.io.save_vars(exe, dirname=path, vars=[v])
def load_global_step(exe, prog, path):
v = prog.global_block().var('@LR_DECAY_COUNTER@')
fluid.io.load_vars(exe, path, prog, [v])
def main(): def main():
env = os.environ env = os.environ
FLAGS.dist = 'PADDLE_TRAINER_ID' in env and 'PADDLE_TRAINERS_NUM' in env FLAGS.dist = 'PADDLE_TRAINER_ID' in env and 'PADDLE_TRAINERS_NUM' in env
...@@ -176,9 +192,9 @@ def main(): ...@@ -176,9 +192,9 @@ def main():
cfg.pretrain_weights, cfg.pretrain_weights,
ignore_params=ignore_params) ignore_params=ignore_params)
# insert quantize op in train_prog, return type is CompiledProgram # insert quantize op in train_prog, return type is CompiledProgram
train_prog = quant_aware(train_prog, place, config, for_test=False) train_prog_quant = quant_aware(train_prog, place, config, for_test=False)
compiled_train_prog = train_prog.with_data_parallel( compiled_train_prog = train_prog_quant.with_data_parallel(
loss_name=loss.name, loss_name=loss.name,
build_strategy=build_strategy, build_strategy=build_strategy,
exec_strategy=exec_strategy) exec_strategy=exec_strategy)
...@@ -192,6 +208,7 @@ def main(): ...@@ -192,6 +208,7 @@ def main():
start_iter = 0 start_iter = 0
if FLAGS.resume_checkpoint: if FLAGS.resume_checkpoint:
checkpoint.load_checkpoint(exe, eval_prog, FLAGS.resume_checkpoint) checkpoint.load_checkpoint(exe, eval_prog, FLAGS.resume_checkpoint)
load_global_step(exe, train_prog, FLAGS.resume_checkpoint)
start_iter = checkpoint.global_step() start_iter = checkpoint.global_step()
train_reader = create_reader(cfg.TrainReader, train_reader = create_reader(cfg.TrainReader,
...@@ -237,7 +254,8 @@ def main(): ...@@ -237,7 +254,8 @@ def main():
if (it > 0 and it % cfg.snapshot_iter == 0 or it == cfg.max_iters - 1) \ if (it > 0 and it % cfg.snapshot_iter == 0 or it == cfg.max_iters - 1) \
and (not FLAGS.dist or trainer_id == 0): and (not FLAGS.dist or trainer_id == 0):
save_name = str(it) if it != cfg.max_iters - 1 else "model_final" save_name = str(it) if it != cfg.max_iters - 1 else "model_final"
checkpoint.save(exe, eval_prog, os.path.join(save_dir, save_name)) save_checkpoint(exe, eval_prog,
os.path.join(save_dir, save_name), train_prog)
if FLAGS.eval: if FLAGS.eval:
# evaluation # evaluation
...@@ -254,8 +272,9 @@ def main(): ...@@ -254,8 +272,9 @@ def main():
if box_ap_stats[0] > best_box_ap_list[0]: if box_ap_stats[0] > best_box_ap_list[0]:
best_box_ap_list[0] = box_ap_stats[0] best_box_ap_list[0] = box_ap_stats[0]
best_box_ap_list[1] = it best_box_ap_list[1] = it
checkpoint.save(exe, eval_prog, save_checkpoint(exe, eval_prog,
os.path.join(save_dir, "best_model")) os.path.join(save_dir, "best_model"),
train_prog)
logger.info("Best test box ap: {}, in iter: {}".format( logger.info("Best test box ap: {}, in iter: {}".format(
best_box_ap_list[0], best_box_ap_list[1])) best_box_ap_list[0], best_box_ap_list[1]))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册