diff --git a/tutorials/tipc/ptq_infer_python/ptq_infer_python.md b/tutorials/tipc/ptq_infer_python/ptq_infer_python.md index 4c8d5d264e..d71f07bd12 100644 --- a/tutorials/tipc/ptq_infer_python/ptq_infer_python.md +++ b/tutorials/tipc/ptq_infer_python/ptq_infer_python.md @@ -46,54 +46,29 @@ Paddle 离线量化开发可以分为个步骤,如下图所示。 以ImageNet1k数据集为例,可参考[数据准备文档](https://github.com/PaddlePaddle/models/tree/release/2.2/tutorials/mobilenetv3_prod/Step6#32-%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE)。 +用于校准的数据最好选择训练集,数据量在500个样本左右即可。 + **【准备开发环境】** -- 确定已安装paddle,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看飞桨[官网](https://www.paddlepaddle.org.cn/) -- 确定已安装paddleslim,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) +- 确定已安装PaddlePaddle最新版本,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看飞桨[官网](https://www.paddlepaddle.org.cn/) +- 确定已安装paddleslim最新版本,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) ``` -pip install paddlepaddle-gpu==2.2.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html -pip install paddleslim==2.2.1 +pip install paddlepaddle-gpu +pip install paddleslim ``` ### 2.2 准备推理模型 -**【基本流程】** - -准备推理模型分为三步: - -- Step1:定义继承自`paddle.nn.Layer`的网络模型 - -- Step2:使用`paddle.jit.save`接口对模型进行动转静,导出成Inference模型 - -- Step3:检查导出的路径下是否生成 `model.pdmodel` 和 `model.pdiparams` 文件 - -**【实战】** - -模型组网可以参考[mobilenet_v3](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/mobilenetv3_prod/Step6/paddlevision/models/mobilenet_v3.py) - -```python -fp32_model = mobilenet_v3_small() -fp32_model.eval() -``` - -然后将模型进行动转静: - -```python -# save inference model -input_spec = paddle.static.InputSpec( - shape=[None, 3, 224, 224], dtype='float32') -fp32_output_model_path = os.path.join("mv3_fp32_infer", "model") -paddle.jit.save(fp32_model, fp32_output_model_path, [input_spec]) -``` +准备推理模型可参考[准备推理模型教程](https://github.com/PaddlePaddle/models/blob/release/2.3/tutorials/tipc/train_infer_python/infer_python.md#22-%E5%87%86%E5%A4%87%E6%8E%A8%E7%90%86%E6%A8%A1%E5%9E%8B) -会在`mv3_fp32_infer`文件夹下生成`model.pdmodel` 和 `model.pdiparams`两个文件。 +最终会在`mv3_fp32_infer`文件夹下生成`model.pdmodel` 和 `model.pdiparams`两个预测模型文件。 -### 2.3 准备离线量化代码 +### 2.3 开始离线量化 **【基本流程】** @@ -101,14 +76,14 @@ paddle.jit.save(fp32_model, fp32_output_model_path, [input_spec]) - Step1:定义`sample_generator`,传入paddle.io.Dataloader实例化对象,用来遍历校准数据集 -- Step2:定义Executor,由于离线量化模型是Inference模型,量化校准过程也需要在静态图下执行,所以需要定义静态图Executor,用来执行离线量化校准执行 +- Step2:开始离线量化 **【实战】** -1)定义数据集,可以参考[Datasets定义](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/mobilenetv3_prod/Step6/paddlevision/datasets/vision.py) +1)定义DataLoader,数据集定义可以参考[Datasets定义](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/mobilenetv3_prod/Step6/paddlevision/datasets/vision.py) -2)定义`sample_generator`: +包装DataLoader,定义`sample_generator`: ```python def sample_generator(loader): @@ -120,46 +95,28 @@ def sample_generator(loader): return __reader__ ``` -2)定义Executor: +2)开始离线量化 -```python -use_gpu = True -place = paddle.CUDAPlace(0) if use_gpu else paddle.CPUPlace() -exe = paddle.static.Executor(place) -``` - - - - -### 2.4 开始离线量化 - -**【基本流程】** - -使用飞桨PaddleSlim中的`quant_post_static`接口开始进行离线量化: - -- Step1:导入`quant_post_static`接口 ```python from paddleslim.quant import quant_post_static -``` - -- Step2:配置传入`quant_post_static`接口参数,开始离线量化 - -```python fp32_model_dir = 'mv3_fp32_infer' quant_output_dir = 'quant_model' +use_gpu = True +place = paddle.CUDAPlace(0) if use_gpu else paddle.CPUPlace() +exe = paddle.static.Executor(place) quant_post_static( executor=exe, - model_dir=fp32_model_dir, - quantize_model_path=quant_output_dir, - sample_generator=sample_generator(data_loader), - model_filename='model.pdmodel', - params_filename='model.pdiparams', - batch_size=32, - batch_nums=10, - algo='KL') + model_dir=fp32_model_dir, + quantize_model_path=quant_output_dir, + sample_generator=sample_generator(data_loader), + model_filename='model.pdmodel', + params_filename='model.pdiparams', + batch_size=32, + batch_nums=10, + algo='KL') ``` -- Step3:检查输出结果,确保离线量化后生成`__model__`和`__params__`文件。 +- 检查输出结果,确保离线量化后生成`__model__`和`__params__`文件。 **【实战】** @@ -169,43 +126,11 @@ quant_post_static( -### 2.5 验证推理结果正确性 +### 2.5 通过Paddle Inference验证量化前模型和量化后模型的精度差异 **【基本流程】** -使用Paddle Inference库测试离线量化模型,确保模型精度符合预期。 - -- Step1:初始化`paddle.inference`库并配置相应参数 - -```python -import paddle.inference as paddle_infer -model_file = os.path.join('quant_model', '__model__') -params_file = os.path.join('quant_model', '__params__') -config = paddle_infer.Config(model_file, params_file) -if FLAGS.use_gpu: - config.enable_use_gpu(1000, 0) -if not FLAGS.ir_optim: - config.switch_ir_optim(False) - -predictor = paddle_infer.create_predictor(config) -``` - -- Step2:配置预测库输入输出 - -```python -input_names = predictor.get_input_names() -input_handle = predictor.get_input_handle(input_names[0]) -output_names = predictor.get_output_names() -output_handle = predictor.get_output_handle(output_names[0]) -``` - -- Step3:开始预测并检验结果正确性 - -```python -input_handle.copy_from_cpu(img_np) -predictor.run() - output_data = output_handle.copy_to_cpu() -``` +可参考[开发推理程序流程](https://github.com/PaddlePaddle/models/blob/release/2.3/tutorials/tipc/train_infer_python/infer_python.md#26-%E5%BC%80%E5%8F%91%E6%8E%A8%E7%90%86%E7%A8%8B%E5%BA%8F) **【实战】** diff --git a/tutorials/tipc/ptq_infer_python/test_ptq_infer_python.md b/tutorials/tipc/ptq_infer_python/test_ptq_infer_python.md index e65f961c4a..80554c941c 100644 --- a/tutorials/tipc/ptq_infer_python/test_ptq_infer_python.md +++ b/tutorials/tipc/ptq_infer_python/test_ptq_infer_python.md @@ -26,7 +26,7 @@ 为了一键跑通上述所有功能,本文档提供了`训推一体全流程`功能自动化测试工具,它包含3个脚本文件和1个配置文件,分别是: -* `test_ptq_inference_python.sh`: 测试Linux上离线量化训练、推理功能的脚本,会对`train_ptq_infer_python.txt`进行解析,得到具体的执行命令。**该脚本无需修改**。 +* `test_ptq_inference_python.sh`: 测试Linux上离线量化、推理功能的脚本,会对`train_ptq_infer_python.txt`进行解析,得到具体的执行命令。**该脚本无需修改**。 * `prepare.sh`: 准备测试需要的数据或需要的预训练模型。 * `common_func.sh`: 在配置文件一些通用的函数,如配置文件的解析函数等,**该脚本无需修改**。 * `train_ptq_infer_python.txt`: 配置文件,其中的内容会被`test_ptq_inference_python.sh`解析成具体的执行命令字段。 @@ -155,9 +155,9 @@ python run_script set_configs -## 3. 离线PACT量化训练推理功能测试开发 +## 3. 离线量化推理功能测试开发 -PACT量化训练推理功能测试开发过程主要分为以下6个步骤。 +离线量化推理功能测试开发过程主要分为以下6个步骤。
@@ -172,14 +172,14 @@ PACT量化训练推理功能测试开发过程主要分为以下6个步骤。 **【基本内容】** -准备离线量化训练、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。 +准备离线量化、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。 **【实战】** -MobileNetV3的训练、动转静、推理示例运行命令如下所示。 +MobileNetV3的离线量化、动转静、推理示例运行命令如下所示。 ```bash -# 模型训练 +# 模型离线量化 python3.7 deploy/ptq_python/post_quant.py --use-gpu=True --model_path=mobilenet_v3_small_infer/ --batch_num=2 --batch-size=2 --data_dir=./test_images/lite_data/ --output_dir=./mobilenet_v3_small_infer_ptq/ # 模型动转静 # 推理 python3.7 deploy/inference_python/infer.py --use-gpu=False --model-dir=./mobilenet_v3_small_infer_ptq/ --batch-size=1 --img-path=./images/demo.jpg --benchmark=True @@ -189,20 +189,7 @@ python3.7 deploy/inference_python/infer.py --use-gpu=False --model-dir=./mobilen ### 3.2 准备数据与环境 -**【基本内容】** - -1. 数据集:为方便快速验证训练/评估/推理过程,需要准备一个小数据集(训练集和验证集各8~16张图像即可,压缩后数据大小建议在`20M`以内),放在`lite_data`文件夹下。 - - 相关文档可以参考[论文复现赛指南3.2章节](../../../docs/lwfx/ArticleReproduction_CV.md),代码可以参考`基于ImageNet准备小数据集的脚本`:[prepare.py](https://github.com/littletomatodonkey/AlexNet-Prod/blob/tipc/pipeline/Step2/prepare.py)。 - -2. 环境:安装好PaddlePaddle即可进行离线量化训练推理测试开发 - -**【注意事项】** - -* 为方便管理,建议在上传至github前,首先将lite_data文件夹压缩为tar包,直接上传tar包即可,在测试训练评估与推理过程时,可以首先对数据进行解压。 - * 压缩命令: `tar -zcf lite_data.tar lite_data` - * 解压命令: `tar -xf lite_data.tar` - +可参考[TIPC 数据准备教程](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/tipc/train_infer_python/test_train_infer_python.md#32-%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E4%B8%8E%E7%8E%AF%E5%A2%83) @@ -254,7 +241,7 @@ Run failed with command - python3.7 deploy/ptq_python/post_quant.py --use-gpu=Tr **【实战】** -以mobilenet_v3_small的`Linux GPU/CPU 离线量化训练推理功能测试` 为例,命令如下所示。 +以mobilenet_v3_small的`Linux GPU/CPU 离线量化推理功能测试` 为例,命令如下所示。 ```bash bash test_tipc/test_train_ptq_python.sh ./test_tipc/configs/mobilenet_v3_small/train_ptq_infer_python.txt whole_infer @@ -281,7 +268,7 @@ bash test_tipc/test_train_ptq_python.sh ./test_tipc/configs/mobilenet_v3_small/t 撰写TIPC功能总览和测试流程说明文档,分别为 1. TIPC功能总览文档:test_tipc/README.md -2. Linux GPU/CPU 离线量化训练推理功能测试说明文档:test_tipc/docs/test_ptq_train_infer_python.md +2. Linux GPU/CPU 离线量化及推理功能测试说明文档:test_tipc/docs/test_ptq_train_infer_python.md 2个文档模板分别位于下述位置,可以直接拷贝到自己的repo中,根据自己的模型进行修改。 @@ -293,7 +280,7 @@ bash test_tipc/test_train_ptq_python.sh ./test_tipc/configs/mobilenet_v3_small/t mobilenet_v3_small中`test_tipc`文档如下所示。 1. TIPC功能总览文档:[README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md) -2. Linux GPU/CPU PACT量化训练推理测试说明文档:[test_train_ptq_inference_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_train_ptq_inference_python.md) +2. Linux GPU/CPU 离线量化及推理测试说明文档:[test_train_ptq_inference_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_train_ptq_inference_python.md) **【核验】** diff --git a/tutorials/tipc/train_pact_infer_python/test_train_pact_infer_python.md b/tutorials/tipc/train_pact_infer_python/test_train_pact_infer_python.md index b24140181d..7df63caf75 100644 --- a/tutorials/tipc/train_pact_infer_python/test_train_pact_infer_python.md +++ b/tutorials/tipc/train_pact_infer_python/test_train_pact_infer_python.md @@ -216,19 +216,7 @@ python deploy/inference_python/infer.py --model-dir=./mobilenet_v3_small_infer/ ### 3.2 准备数据与环境 -**【基本内容】** - -1. 数据集:为方便快速验证训练/评估/推理过程,需要准备一个小数据集(训练集和验证集各8~16张图像即可,压缩后数据大小建议在`20M`以内),放在`lite_data`文件夹下。 - - 相关文档可以参考[论文复现赛指南3.2章节](../../../docs/lwfx/ArticleReproduction_CV.md),代码可以参考`基于ImageNet准备小数据集的脚本`:[prepare.py](https://github.com/littletomatodonkey/AlexNet-Prod/blob/tipc/pipeline/Step2/prepare.py)。 - -2. 环境:安装好PaddlePaddle即可进行PACT量化训练推理测试开发 - -**【注意事项】** - -* 为方便管理,建议在上传至github前,首先将lite_data文件夹压缩为tar包,直接上传tar包即可,在测试训练评估与推理过程时,可以首先对数据进行解压。 - * 压缩命令: `tar -zcf lite_data.tar lite_data` - * 解压命令: `tar -xf lite_data.tar` +可参考[TIPC 数据准备教程](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/tipc/train_infer_python/test_train_infer_python.md#32-%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE%E4%B8%8E%E7%8E%AF%E5%A2%83) @@ -343,4 +331,4 @@ test_tipc -## 4. FAQ \ No newline at end of file +## 4. FAQ diff --git a/tutorials/tipc/train_pact_infer_python/train_pact_infer_python.md b/tutorials/tipc/train_pact_infer_python/train_pact_infer_python.md index 6f9d55004c..13c67ddc6e 100644 --- a/tutorials/tipc/train_pact_infer_python/train_pact_infer_python.md +++ b/tutorials/tipc/train_pact_infer_python/train_pact_infer_python.md @@ -52,12 +52,12 @@ Linux GPU/CPU PACT量化训练功能开发可以分为5个步骤,如下图所 **【准备开发环境】** -- 确定已安装paddle,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看飞桨[官网](https://www.paddlepaddle.org.cn/) -- 确定已安装paddleslim,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) +- 确定已安装PaddlePaddle最新版本,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看飞桨[官网](https://www.paddlepaddle.org.cn/) +- 确定已安装paddleslim最新版本,通过pip安装linux版本paddle命令如下,更多的版本安装方法可查看[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) ``` -pip install paddlepaddle-gpu==2.2.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html -pip install paddleslim==2.2.1 +pip install paddlepaddle-gpu +pip install paddleslim ``` @@ -101,7 +101,7 @@ PACT在线量化训练开发之前,要求首先有Linux GPU/CPU基础训练的 ```python quant_config = { 'weight_preprocess_type': None, - 'activation_preprocess_type': None, + 'activation_preprocess_type': PACT, #None, 'weight_quantize_type': 'channel_wise_abs_max', 'activation_quantize_type': 'moving_average_abs_max', 'weight_bits': 8, @@ -113,11 +113,7 @@ quant_config = { } ``` -- `activation_preprocess_type`':代表对量化模型激活值预处理的方法,目前支持PACT方法,如需使用可以改为'PACT';默认为None,代表不对激活值进行任何预处理。 -- `weight_preprocess_type`:代表对量化模型权重参数预处理的方法;默认为None,代表不对权重进行任何预处理。 -- `weight_quantize_type`:代表模型权重的量化方式,可选的有['abs_max', 'moving_average_abs_max', 'channel_wise_abs_max'],默认为channel_wise_abs_max -- `activation_quantize_type`:代表模型激活值的量化方式,可选的有['abs_max', 'moving_average_abs_max'],默认为moving_average_abs_max -- `quantizable_layer_type`:代表量化OP的类型,目前支持Conv2D和Linear +**注意**:保持以上量化配置,无需改动 - Step2:插入量化算子,得到量化训练模型 @@ -143,43 +139,11 @@ quanter.save_quantized_model(net, 'save_dir', input_spec=[paddle.static.InputSpe -### 2.5 验证推理结果正确性 +### 2.5 通过Paddle Inference验证量化前模型和量化后模型的精度差异 **【基本流程】** -使用Paddle Inference库测试离线量化模型,确保模型精度符合预期。 - -- Step1:初始化`paddle.inference`库并配置相应参数 - -```python -import paddle.inference as paddle_infer -model_file = os.path.join('quant_model', 'qat_inference.pdmodel') -params_file = os.path.join('quant_model', 'qat_inference.pdiparams') -config = paddle_infer.Config(model_file, params_file) -if FLAGS.use_gpu: - config.enable_use_gpu(1000, 0) -if not FLAGS.ir_optim: - config.switch_ir_optim(False) - -predictor = paddle_infer.create_predictor(config) -``` - -- Step2:配置预测库输入输出 - -```python -input_names = predictor.get_input_names() -input_handle = predictor.get_input_handle(input_names[0]) -output_names = predictor.get_output_names() -output_handle = predictor.get_output_handle(output_names[0]) -``` - -- Step3:开始预测并检验结果正确性 - -```python -input_handle.copy_from_cpu(img_np) -predictor.run() - output_data = output_handle.copy_to_cpu() -``` +可参考[开发推理程序流程](https://github.com/PaddlePaddle/models/blob/release/2.3/tutorials/tipc/train_infer_python/infer_python.md#26-%E5%BC%80%E5%8F%91%E6%8E%A8%E7%90%86%E7%A8%8B%E5%BA%8F) **【实战】**