未验证 提交 7b6bd30d 编写于 作者: D Double_V 提交者: GitHub

[tipc]add pact about (#5480)

* add pact about

* fix doc

* fix comments

* add ptq aware

* fix

* add benchmark.png

* fix png and ptq

* fix tipc
上级 6b94bbfe
......@@ -18,12 +18,10 @@ from __future__ import print_function
import argparse
import os
import sys
sys.path.insert(0, ".")
import numpy as np
from PIL import Image
sys.path[0] = os.path.join(
os.path.dirname("__file__"), os.path.pardir, os.path.pardir)
import paddle
import paddlevision
from presets import ClassificationPresetEval
......@@ -62,6 +60,8 @@ def main():
params_filename=FLAGS.params_filename,
batch_size=FLAGS.batch_size,
batch_nums=FLAGS.batch_num,
save_model_filename=FLAGS.save_model_filename,
save_params_filename=FLAGS.params_filename',
algo=FLAGS.algo,
hist_percent=FLAGS.hist_percent)
......@@ -74,13 +74,23 @@ if __name__ == '__main__':
parser.add_argument(
"--model_filename",
type=str,
default=None,
default='inference.pdmodel',
help="Inference model model_filename")
parser.add_argument(
"--params_filename",
type=str,
default=None,
default='inference.pdiparams',
help="Inference model params_filename")
parser.add_argument(
"--save_model_filename",
type=str,
default='inference.pdmodel',
help="The saved inference model model_filename")
parser.add_argument(
"--save_params_filename",
type=str,
default='inference.pdiparams',
help="The saved inference model params_filename")
parser.add_argument(
"--output_dir", type=str, default='output', help="save dir")
parser.add_argument(
......
......@@ -18,7 +18,8 @@
| 算法论文 | 模型名称 | 模型类型 | 基础<br>训练预测 | 更多<br>训练方式 | 模型压缩 | 其他预测部署 |
| :--- | :--- | :----: | :--------: | :---- | :---- | :---- |
| MobileNetV3 | mobilenet_v3_small | 分类 | 支持 | 混合精度<br> | - | - |
| MobileNetV3 | mobilenet_v3_small | 分类 | 支持 | - | PACT量化训练<br> | - |
| MobileNetV3 | mobilenet_v3_small | 分类 | 支持 | - | 离线量化训练<br> | - |
## 3. 测试工具简介
......@@ -68,9 +69,9 @@ test_tipc
- [XPU 部署测试]
- [OpenCL ARM GPU 部署测试]
- Slim训练部署测试(coming soon)
- [Linux GPU/CPU PACT量化训练测试]
- [Linux GPU/CPU 离线量化测试]
- Slim训练部署测试:
- [Linux GPU/CPU PACT量化训练测试](./docs/test_train_pact_inference_python.md)
- [Linux GPU/CPU 离线量化测试](./docs/test_train_ptq_inference_python.md)
- 更多训练环境测试(coming soon):
- [Linux XPU2 基础训练推理测试]
......
===========================train_params===========================
model_name:mobilenet_v3_small
python:python3.7
gpu_list:0|0,1
use-gpu:True|True
--epochs:lite_train_lite_infer=5|whole_train_whole_infer=90
--output-dir:./output/
--batch-size:lite_train_lite_infer=4|whole_train_whole_infer=128
--pretrained:null
train_model_name:latest.pdparams
--data-path:./lite_data
##
trainer:pact_train
pact_train:train.py --pact_quant
##
===========================eval_params===========================
eval:train.py --test-only
##
===========================infer_params===========================
--save-inference-dir:./output/mobilenet_v3_small_infer/
--pretrained:
norm_export:tools/export_model.py --model=mobilenet_v3_small
##
train_model:./pretrain_models/mobilenet_v3_small_pretrained.pdparams
infer_export:tools/export_model.py --model=mobilenet_v3_small
##
inference:deploy/inference_python/infer.py
--use-gpu:True|False
--batch-size:1
--model-dir:./output/mobilenet_v3_small_infer/
--img-path:./images/demo.jpg
--benchmark:True
\ No newline at end of file
===========================ptq_params===========================
model_name:mobilenet_v3_small
python:python3.7
--use_gpu:True
--model_path:mobilenet_v3_small_infer/
--output_dir:./mobilenet_v3_small_infer_ptq/
--data_dir:./test_images/lite_data/
--batch_num:2
--batch_size:2
##
trainer:ptq_train
ptq_train:deploy/ptq_python/post_quant.py
##
===========================infer_params===========================
inference:deploy/inference_python/infer.py
--use-gpu:True|False
--batch-size:1
--model-dir:./mobilenet_v3_small_infer_ptq/
--img-path:./images/demo.jpg
--benchmark:True
# Linux GPU/CPU PACT量化训练推理测试
Linux GPU/CPU PACT量化训练推理测试的主程序为`test_train_inference_python.sh`,可以测试基于Python的模型训练、评估、推理等基本功能。
## 1. 测试结论汇总
- 训练相关:
| 算法名称 | 模型名称 | 单机单卡 | 单机多卡 |
| :----: | :----: | :----: | :----: |
| MobileNetV3 | mobilenet_v3_small | PACT量化训练 | PACT量化训练 |
- 推理相关:
| 算法名称 | 模型名称 | device_CPU | device_GPU | batchsize |
| :----: | :----: | :----: | :----: | :----: |
| MobileNetV3 | mobilenet_v3_small | 支持 | 支持 | 1 |
## 2. 测试流程
### 2.1 准备数据
用于量化训练推理测试的数据位于`test_images/lite_data.tar`,直接解压即可(如果已经解压完成,则无需运行下面的命令)。
```bash
tar -xf test_images/lite_data.tar
```
### 2.2 准备环境
- 安装PaddlePaddle:如果您已经安装了2.2或者以上版本的paddlepaddle,那么无需运行下面的命令安装paddlepaddle。
```
# 需要安装2.2及以上版本的Paddle
# 安装GPU版本的Paddle
pip3 install paddlepaddle-gpu==2.2.0
# 安装CPU版本的Paddle
pip3 install paddlepaddle==2.2.0
```
- 安装依赖
```
pip3 install -r requirements.txt
```
- 安装AutoLog(规范化日志输出工具)
```
pip3 install https://paddleocr.bj.bcebos.com/libs/auto_log-1.2.0-py3-none-any.whl
```
### 2.3 功能测试
`mobilenet_v3_small``Linux GPU/CPU PACT量化训练推理测试`为例,命令如下所示。
```bash
bash test_tipc/prepare.sh test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt lite_train_lite_infer
```
```bash
bash test_tipc/test_train_inference_python.sh test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt lite_train_lite_infer
```
输出结果如下,表示命令运行成功。
```
Run successfully with command - python3.7 train.py --pact_quant --output-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0 --epochs=5 --batch-size=4!
......
Run successfully with command - python3.7 train.py --test-only --pretrained=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0/latest.pdparams!
......
Run successfully with command - python3.7 tools/export_model.py --model=mobilenet_v3_small --pretrained=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0/latest.pdparams --save-inference-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0!
......
Run successfully with command - python3.7 deploy/inference_python/infer.py --use-gpu=True --model-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0 --batch-size=1 --benchmark=True > ./log/mobilenet_v3_small/lite_train_lite_infer/python_infer_gpu_batchsize_1.log 2>&1 !
......
Run successfully with command - python3.7 deploy/inference_python/infer.py --use-gpu=True --model-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0,1 --batch-size=1 --benchmark=True > ./log/mobilenet_v3_small/lite_train_lite_infer/python_infer_gpu_batchsize_1.log 2>&1
......
Run successfully with command - python3.7 deploy/inference_python/infer.py --use-gpu=False --model-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0,1 --batch-size=1 --benchmark=True > ./log/mobilenet_v3_small/lite_train_lite_infer/python_infer_cpu_batchsize_1.log 2>&1
```
在开启benchmark参数时,可以得到测试的详细数据,包含运行环境信息(系统版本、CUDA版本、CUDNN版本、驱动版本),Paddle版本信息,参数设置信息(运行设备、线程数、是否开启内存优化等),模型信息(模型名称、精度),数据信息(batchsize、是否为动态shape等),性能信息(CPU,GPU的占用、运行耗时、预处理耗时、推理耗时、后处理耗时),如下图所示
<div align="center">
<img src="../../images/pact_train_infer_benchmark.png">
</div>
如果运行失败,也会在终端中输出运行失败的日志信息以及对应的运行命令。可以基于该命令,分析运行失败的原因。
# Linux GPU/CPU PACT离线量化训练推理测试
Linux GPU/CPU PACT离线量化训练推理测试的主程序为`test_train_inference_python.sh`,可以测试基于Python的模型训练、评估、推理等基本功能。
## 1. 测试结论汇总
- 训练相关:
| 算法名称 | 模型名称 | 单机单卡 |
| :----: | :----: | :----: |
| MobileNetV3 | mobilenet_v3_small | PACT离线量化训练 |
- 推理相关:
| 算法名称 | 模型名称 | device_CPU | device_GPU | batchsize |
| :----: | :----: | :----: | :----: | :----: |
| MobileNetV3 | mobilenet_v3_small | 支持 | 支持 | 1 |
## 2. 测试流程
### 2.1 准备数据和模型
用于量化训练推理测试的数据位于`test_images/lite_data.tar`,直接解压即可(如果已经解压完成,则无需运行下面的命令)。
```bash
tar -xf test_images/lite_data.tar
```
准备离线量化需要的inference模型,以MobileNetV3为例,可以直接下载:
```bash
wget https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar
tar -xf mobilenet_v3_small_infer.tar
```
离线量化的训练流程,可参考[文档](../../deploy/ptq_python/README.md)
### 2.2 准备环境
- 安装PaddlePaddle:如果您已经安装了2.2或者以上版本的paddlepaddle,那么无需运行下面的命令安装paddlepaddle。
```
# 需要安装2.2及以上版本的Paddle
# 安装GPU版本的Paddle
pip3 install paddlepaddle-gpu==2.2.0
# 安装CPU版本的Paddle
pip3 install paddlepaddle==2.2.0
```
- 安装PaddleSlim
```
pip3 install paddleslim==2.2.0
```
- 安装依赖
```
pip3 install -r requirements.txt
```
- 安装AutoLog(规范化日志输出工具)
```
pip3 install https://paddleocr.bj.bcebos.com/libs/auto_log-1.2.0-py3-none-any.whl
```
### 2.3 功能测试
`mobilenet_v3_small``Linux GPU/CPU PACT离线量化训练推理测试`为例,命令如下所示。
```bash
bash test_tipc/test_train_ptq_python.sh ./test_tipc/configs/mobilenet_v3_small/train_ptq_infer_python.txt whole_infer
```
输出结果如下,表示命令运行成功。
```
Run successfully with command - 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/!
......
Run successfully with command - python3.7 deploy/inference_python/infer.py --use-gpu=True --model-dir=./mobilenet_v3_small_infer_ptq/ --batch-size=1 --img-path=./images/demo.jpg --benchmark=True > ./log/mobilenet_v3_small/whole_infer/python_infer_gpu_batchsize_1.log 2>&1 !
......
Run successfully with command - 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 > ./log/mobilenet_v3_small/whole_infer/python_infer_cpu_batchsize_1.log 2>&1 !
```
<div align="center">
<img src="../../images/pact_train_infer_benchmark.png">
</div>
如果运行失败,也会在终端中输出运行失败的日志信息以及对应的运行命令。可以基于该命令,分析运行失败的原因。
#!/bin/bash
source test_tipc/common_func.sh
FILENAME=$1
# MODE be one of ['lite_train_lite_infer' 'lite_train_whole_infer' 'whole_train_whole_infer', 'whole_infer']
MODE=$2
dataline=$(awk 'NR==1, NR==32{print}' $FILENAME)
# parser params
IFS=$'\n'
lines=(${dataline})
# The training params
model_name=$(func_parser_value "${lines[1]}")
python=$(func_parser_value "${lines[2]}")
use_gpu_key=$(func_parser_key "${lines[3]}")
use_gpu_value=$(func_parser_value "${lines[3]}")
model_path_key=$(func_parser_key "${lines[4]}")
model_path_value=$(func_parser_value "${lines[4]}")
output_dir_key=$(func_parser_key "${lines[5]}")
output_dir_value=$(func_parser_value "${lines[5]}")
data_dir_key=$(func_parser_key "${lines[6]}")
data_dir_value=$(func_parser_value "${lines[6]}")
batch_num_key=$(func_parser_key "${lines[7]}")
batch_num_value=$(func_parser_value "${lines[7]}")
batch_size_key=$(func_parser_key "${lines[8]}")
batch_size_value=$(func_parser_value "${lines[8]}")
# parser trainer
train_py=$(func_parser_value "${lines[11]}")
# parser inference
inference_py=$(func_parser_value "${lines[14]}")
use_gpu_key=$(func_parser_key "${lines[15]}")
use_gpu_list=$(func_parser_value "${lines[15]}")
batch_size_key=$(func_parser_key "${lines[16]}")
batch_size_list=$(func_parser_value "${lines[16]}")
infer_model_key=$(func_parser_key "${lines[17]}")
image_dir_key=$(func_parser_key "${lines[18]}")
infer_img_dir=$(func_parser_value "${lines[18]}")
benchmark_key=$(func_parser_key "${lines[19]}")
benchmark_value=$(func_parser_value "${lines[19]}")
function func_inference(){
IFS='|'
_python=$1
_script=$2
_model_dir=$3
_log_path=$4
_img_dir=$5
# inference
for use_gpu in ${use_gpu_list[*]}; do
# cpu
if [ ${use_gpu} = "False" ] || [ ${use_gpu} = "cpu" ]; then
for batch_size in ${batch_size_list[*]}; do
_save_log_path="${_log_path}/python_infer_cpu_batchsize_${batch_size}.log"
set_infer_data=$(func_set_params "${image_dir_key}" "${_img_dir}")
set_benchmark=$(func_set_params "${benchmark_key}" "${benchmark_value}")
set_batchsize=$(func_set_params "${batch_size_key}" "${batch_size}")
set_model_dir=$(func_set_params "${infer_model_key}" "${_model_dir}")
command="${_python} ${_script} ${use_gpu_key}=${use_gpu} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} > ${_save_log_path} 2>&1 "
echo $command
eval $command
last_status=${PIPESTATUS[0]}
eval "cat ${_save_log_path}"
status_check $last_status "${command}" "${status_log}"
done
# gpu
elif [ ${use_gpu} = "True" ] || [ ${use_gpu} = "gpu" ]; then
for batch_size in ${batch_size_list[*]}; do
_save_log_path="${_log_path}/python_infer_gpu_batchsize_${batch_size}.log"
set_infer_data=$(func_set_params "${image_dir_key}" "${_img_dir}")
set_benchmark=$(func_set_params "${benchmark_key}" "${benchmark_value}")
set_batchsize=$(func_set_params "${batch_size_key}" "${batch_size}")
set_model_dir=$(func_set_params "${infer_model_key}" "${_model_dir}")
command="${_python} ${_script} ${use_gpu_key}=${use_gpu} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} > ${_save_log_path} 2>&1 "
echo $command
eval $command
last_status=${PIPESTATUS[0]}
eval "cat ${_save_log_path}"
status_check $last_status "${command}" "${status_log}"
done
else
echo "Does not support hardware other than CPU and GPU Currently!"
fi
done
}
# log
LOG_PATH="./log/${model_name}/${MODE}"
mkdir -p ${LOG_PATH}
status_log="${LOG_PATH}/results_python.log"
if [ ${MODE} = "whole_infer" ]; then
IFS="|"
# run export
set_output_dir=$(func_set_params "${output_dir_key}" "${output_dir_value}")
set_data_dir=$(func_set_params "${data_dir_key}" "${data_dir_value}")
set_batch_size=$(func_set_params "${batch_size_key}" "${batch_size_value}")
set_batch_num=$(func_set_params "${batch_num_key}" "${batch_num_value}")
set_model_path=$(func_set_params "${model_path_key}" "${model_path_value}")
set_use_gpu=$(func_set_params "${use_gpu_key}" "${use_gpu_value}")
export_cmd="${python} ${train_py} ${set_use_gpu} ${set_model_path} ${set_batch_num} ${set_batch_size} ${set_data_dir} ${set_output_dir}"
echo $export_cmd
# eval $export_cmd
status_export=$?
status_check $status_export "${export_cmd}" "${status_log}"
save_infer_dir=${output_dir_value}
#run inference
func_inference "${python}" "${inference_py}" "${save_infer_dir}" "${LOG_PATH}" "${infer_img_dir}"
fi
\ No newline at end of file
......@@ -55,4 +55,41 @@ Linux GPU/CPU 离线量化开发过程可以分为下面5个步骤。
# 3. Linux GPU/CPU 离线量化测试开发与规范
coming soon!
## 3.1 开发流程
量化训练推理测试开发的流程如下所示:
<div align="center">
<img src="../images/test_ptq_pact_train_infer.png" width="800">
</div>
更多的介绍可以参考:[Linux GPU/CPU PACT离线量化训练推理测试开发规范](./test_ptq_infer_python.md)
### 3.2 核验点
#### 3.2.1 目录结构
如果您已经完成了[基础训练推理功能开发](../train_infer_python/README.md),那么只需要在原`test_tipc`目录的基础上,增加PACT量化训练推理测试的配置文件和使用说明文档。
否则,需要在repo根目录下面新建`test_tipc`文件夹,目录结构如下所示。
```
test_tipc
|--configs # 配置目录
| |--model_name # 您的模型名称
| |--train_infer_python.txt # 基础训练推理测试配置文件
| |--train_ptq_infer_python.txt # 离线量化训练推理测试配置文件
|--docs # 文档目录
| |--test_train_inference_python.md # 基础训练推理测试说明文档
| |--test_train_pact_ptq_inference_python.md # 离线量化训练推理测试说明文档
|----README.md # TIPC说明文档
|----test_train_inference_python.sh # TIPC基础训练、PACT量化训练推理测试解析脚本,无需改动
|----test_ptq_inference_python.sh # TIPC离线量化训练、推理测试解析脚本
|----common_func.sh # TIPC基础训练、PACT量化训练推理测试常用函数,无需改动
```
#### 3.2.2 配置文件和测试文档
* `test_tipc/README.md` 文档中对该模型支持的的功能进行总体介绍。
* `test_tipc/docs/test_train_ptq_inference_python.md` 文档中对**Linux GPU/CPU 离线量化训练推理**的功能支持情况进行介绍。
* 根据测试文档,基于配置文件,跑通训练推理全流程测试。
\ No newline at end of file
......@@ -3,5 +3,318 @@
# 目录
- [1. 简介](#1)
- [2. 测试流程](#2)
- [3. FAQ](#3)
- [2. 命令与配置文件解析](#2)
- [2.1 命令解析](#2.1)
- [2.2 配置文件和运行命令映射解析](#2.2)
- [3. 基本训练推理功能测试开发](#3)
- [2.1 准备待测试的命令](#3.1)
- [2.2 准备数据与环境](#3.2)
- [2.3 准备开发所需脚本](#3.3)
- [2.4 填写配置文件](#3.4)
- [2.5 验证配置正确性](#3.5)
- [2.6 撰写说明文档](#3.6)
- [4. FAQ](#4)
<a name="1"></a>
## 1. 简介
本文档主要关注Linux GPU/CPU 下模型的离线量化训练推理全流程功能测试,具体测试点如下:
- 模型训练:单机单卡训练跑通
- 模型推理:推理过程跑通
为了一键跑通上述所有功能,本文档提供了`训推一体全流程`功能自动化测试工具,它包含3个脚本文件和1个配置文件,分别是:
* `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`解析成具体的执行命令字段。
<a name="2"></a>
## 2. 命令与配置文件解析
<a name="2.1"></a>
### 2.1 命令解析
模型训练、动转静、推理过程的运行命令差别很大,但是都可以拆解为3个部分:
```
python run_script set_configs
```
例如:
* 对于通过配置文件传参的场景来说,`python3.7 post_quant.py --use-gpu=True --batch_num=2 `
* `python`部分为`python3.7`
* `run_script`部分为` post_quant.py`
* `set_configs`部分为`--use-gpu=True --batch_num=2`
* 对于通过argparse传参的场景来说,`python3.7 post_quant.py --use-gpu=True --model_path=mobilenet_v3_small_infer/ --batch_num=2`
* `python`部分为`python3.7`
* `run_script`部分为`post_quant.py`
* `set_configs`部分为`--model_path=mobilenet_v3_small_infer/`
其中,可修改参数`set_configs`一般通过`=`进行分隔,`=`前面的内容可以认为是key,后面的内容可以认为是value,那么通过给定配置文件模板,解析配置,得到其中的key和value,结合`python``run_script`,便可以组合出一条完整的命令。
<a name="2.2"></a>
### 2.2 配置文件和运行命令映射解析
完整的`train_ptq_infer_python.txt`配置文件共有20行,包含3个方面的内容。
* 训练参数:第1~10行
* 训练脚本配置:第11~12行
* 模型Inference推理:第15~20行
具体内容见[train_ptq_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_ptq_infer_python.txt)
配置文件中主要有以下3种类型的字段。
* 一行内容以冒号为分隔符:该行可以被解析为`key:value`的格式,需要根据实际的含义修改该行内容,下面进行详细说明。
* 一行内容为`======xxxxx=====`:该行内容为注释信息,无需修改。
* 一行内容为`##`:该行内容表示段落分隔符,没有实际意义,无需修改。
#### 2.2.1 训练配置参数
在配置文件中,可以通过下面的方式配置一些常用的超参数,如:是否使用GPU、迭代轮数、batch-size、预训练模型路径等,下面给出了常用的训练配置以及需要修改的内容。
<details>
<summary><b>训练配置参数(点击以展开详细内容或者折叠)
</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
| 2 | model_name:mobilenet_v3_small | 模型名字 | 否 | 是 | value修改为自己的模型名字 |
| 3 | python:python3.7 | python环境 | 否 | 是 | value修改为自己的python环境 |
| 4 | --use-gpu:True | 是否使用GPU | 是 | 是 | key修改为设置GPU的内容,value修改为设置GPU的值 |
| 5 | --model_path:mobilenet_v3_small_infer/| 输出目录 | 是 | 否 | key修改为代码中设置模型路径的内容 |
| 6 | --output_dir:./mobilenet_v3_small_infer_ptq/ | 输出模型路径 | 是 | 是 | value修改为自定义的模型输出目录 |
| 7 | --data_dir:./test_images/lite_data/ | 数据目录 | 是 | 是 | value修改为自己数据集目录 |
| 8 | --batch_num:2 | 训练的batch 数量 | 是 | 是 | key修改为代码中设置batch num的内容 |
| 9 | --batch-size:2 | 训练的batch size | 是 | 是 | key修改为代码中设置batch size的内容 |
</details>
以训练命令`python3.7 deploy/ptq_python/post_quant.py --use-gpu=True --model_path=mobilenet_v3_small_infer/ --batch_num=2 --data_dir=./test_images/lite_data/ --output_dir=./mobilenet_v3_small_infer_ptq/ --batch-size=2`为例,总共包含5个超参数。
* 运行设备:`--use-gpu=True`,则需要修改为配置文件的第4行,`key``--use-gpu``value``True`,修改后内容为`--use-gpu:True`
* 离线量化模型: `--model_path=mobilenet_v3_small_infer/`,需要改为配置文件的第5行,`key``--model_path``value``mobilenet_v3_small_infer`,修改后内容为`--model_path:mobilenet_v3_small_infer/`
* 离线量化输出模型:`--output_dir:./mobilenet_v3_small_infer_ptq/`,需要修改配置文件的第6行,`key``--output_dir``value``./mobilenet_v3_small_infer_ptq/`
* 数据路径:`--data-path=test_images/lite_data/`,则需要修改为配置文件的第11行,修改后内容为`--data-path:test_images/lite_data/`
* 迭代轮数:`--batch_num=2`,则需要修改配置文件的第8行,修改后内容为`--batch_num:2`
* 数据批次:`--batch_size=2`,则需要修改配置文件的第8行,修改后内容为`--batch_size:2`
#### 2.2.2 训练命令配置参数
下面给出了配置文件中的训练命令配置参数(点击以展开详细内容或者折叠)
<details>
<summary><b>训练命令配置参数(点击以展开详细内容或者折叠)
</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|---------------------------------------------|-----------------|-----------|-------------|-------------------|
| 11 | trainer:ptq_train | 训练方法 | 否 | 否 | - |
| 12 | ptq_train:deploy/ptq_python/post_quant.py | ptq_train的训练脚本 | 否 | 是 | value可以修改为自己的训练命令 |
</details>
以训练命令`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/`为例,该命令为离线量化训练(非裁剪、量化、蒸馏等方式),因此
* 配置文件的第11行直接写`ptq_train`即可。
* 第12行配置`ptq_train`的具体运行脚本/入口,即上述命令中的`deploy/ptq_python/post_quant.py`因此配置文件的14行内容初步可以修改为`ptq_train:deploy/ptq_python/post_quant.py`
#### 2.2.3 模型推理配置参数
下面给出了配置文件中的模型推理配置参数。
<details>
<summary><b>模型推理配置参数(点击以展开详细内容或者折叠)</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|------------------|-----------------|-----------|-------------|-------------|
| 15 | inference:deploy/inference_python/infer.py | 推理脚本 | 否 | 是 | value修改为自己的推理脚本 |
| 16 | --use-gpu:True|False | 是否使用GPU | 是 | 是 | key和value修改为GPU设置的参数和值 |
| 17 | --batch_size:1 | 推理batch size | 是 | 否 | key修改为代码中设置batch size的内容 |
| 18 | --model-dir:./output/mobilenet_v3_small_infer/ | 推理模型保存路径 | 是 | 否 | key修改为代码中可以设置inference model路径的内容 |
| 19 | --img-path:./images/demo.jpg | 图片路径或者图片文件夹路径 | 是 | 否 | key修改为代码中设置图片路径的内容 |
| 20 | --benchmark:False | 是否使用benchmark | 是 | 是 | key和value修改为规范化推理日志输出设置的参数和值 |
</details>
以推理命令`python deploy/inference_python/infer.py --model-dir=./mobilenet_v3_small_infer_ptq/ --img-path=./images/demo.jpg`为例。
* 推理的入口脚本为`deploy/inference_python/infer.py`,因此15行需要修改为`inference:deploy/inference_python/infer.py`
* Inference模型路径配置在第6行参数中配置,`--output_dir:./mobilenet_v3_small_infer_ptq/`
* 测试图像路径配置为`--img-path=./images/demo.jpg`,因此19行修改为`--img-path:./images/demo.jpg`
<a name="3"></a>
## 3. 离线PACT量化训练推理功能测试开发
PACT量化训练推理功能测试开发过程主要分为以下6个步骤。
<div align="center">
<img src="../images/post_infer_quant_guide.png" width="800">
</div>
其中设置了2个核验点,下面详细介绍开发过程。
<a name="3.1"></a>
### 3.1 准备待测试的命令
**【基本内容】**
准备离线量化训练、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。
**【实战】**
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
```
<a name="3.2"></a>
### 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`
<a name="3.3"></a>
### 3.3 准备开发所需脚本
**【基本内容】**
在repo中新建`test_tipc`目录,将文件 [common_func.sh](../../mobilenetv3_prod/Step6/test_tipc/common_func.sh)[prepare.sh](../../mobilenetv3_prod/Step6/test_tipc/prepare.sh)[test_train_inference_python.sh](../../mobilenetv3_prod/Step6/test_tipc/test_train_inference_python.sh)[test_ptq_inference_python.sh](../../mobilenetv3_prod/Step6/test_tipc/test_ptq_inference_python.sh)分别拷贝到`test_tipc`目录中。
**【注意事项】**
* 上述4个脚本文件无需改动,在实际使用时,直接修改配置文件即可。
<a name="3.4"></a>
### 3.4 填写配置文件
**【基本内容】**
在repo的`test_tipc/`目录中新建`configs/model_name`,将文件 [train_ptq_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_ptq_infer_python.txt) 拷贝到该目录中,其中`model_name`需要修改为您自己的模型名称。
**【实战】**
配置文件的含义解析可以参考 [2.2节配置文件解析](#2.2) 部分。
mobilenet_v3_small的测试开发配置文件可以参考:[train_ptq_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_ptq_infer_python.txt)
<a name="3.5"></a>
### 3.5 验证配置正确性
**【基本内容】**
基于修改完的配置,运行
```bash
bash test_tipc/prepare.sh ${your_params_file} whole_infer
bash test_tipc/test_train_inference_python.sh ${your_params_file} whole_infer
```
**【注意事项】**
如果运行失败,会输出具体的报错命令,可以根据输出的报错命令排查下配置文件的问题并修改,示例报错如下所示。
```
Run failed with command - 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/!
```
**【实战】**
以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
```
输出结果如下,表示命令运行成功。
```bash
Run successfully with command - 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/!
......
Run successfully with command - python3.7 deploy/inference_python/infer.py --use-gpu=True --model-dir=./mobilenet_v3_small_infer_ptq/ --batch-size=1 --img-path=./images/demo.jpg --benchmark=True > ./log/mobilenet_v3_small/whole_infer/python_infer_gpu_batchsize_1.log 2>&1 !
```
**【核验】**
基于修改后的配置文件,测试通过,全部命令成功
<a name="3.6"></a>
### 3.6 撰写说明文档
**【基本内容】**
撰写TIPC功能总览和测试流程说明文档,分别为
1. TIPC功能总览文档:test_tipc/README.md
2. Linux GPU/CPU 离线量化训练推理功能测试说明文档:test_tipc/docs/test_ptq_train_infer_python.md
2个文档模板分别位于下述位置,可以直接拷贝到自己的repo中,根据自己的模型进行修改。
1. [README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
2. [test_train_ptq_inference_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_train_ptq_inference_python.md)
**【实战】**
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)
**【核验】**
repo中最终目录结构如下所示。
```
test_tipc
|--configs # 配置目录
| |--model_name # 您的模型名称
| |--train_ptq_infer_python.txt # 离线量化训练推理测试配置文件
|--docs # 文档目录
| |--test_train_ptq_inference_python.md # 离线量化训练推理测试说明文档
|----README.md # TIPC说明文档
|----prepare.sh # TIPC离线量化训练推理测试数据准备脚本
|----test_train_inference_python.sh # TIPC离线量化训练推理测试解析脚本,无需改动
|----test_ptq_inference_python.sh # TIPC离线量化训练推理测试解析脚本,无需改动
|----common_func.sh # TIPC离线量化训练推理测试常用函数,无需改动
```
基于`test_train_ptq_inference_python.md`文档,跑通`Linux GPU/CPU 离线量化训练推理功能测试`流程。
<a name="4"></a>
## 4. FAQ
......@@ -38,7 +38,7 @@ Linux GPU/CPU PACT量化训练功能开发过程可以分为下面5个步骤。
</div>
更多的介绍可以参考:[Linux GPU/CPU PACT量化训练功能开发文档](././train_pact_infer_python.md)
更多的介绍可以参考:[Linux GPU/CPU PACT量化训练功能开发文档](./train_pact_infer_python.md)
<a name="2.2"></a>
......@@ -56,4 +56,42 @@ Linux GPU/CPU PACT量化训练功能开发过程可以分为下面5个步骤。
# 3. Linux GPU/CPU PACT量化训练测试开发与规范
coming soon!
## 3.1 开发流程
量化训练推理测试开发的流程如下所示:
<div align="center">
<img src="../images/test_ptq_pact_train_infer.png" width="800">
</div>
更多的介绍可以参考:[Linux GPU/CPU PACT量化训练推理测试开发规范](./test_train_pact_infer_python.md)
### 3.2 核验点
#### 3.2.1 目录结构
如果您已经完成了[基础训练推理功能开发](../train_infer_python/README.md),那么只需要在原`test_tipc`目录的基础上,增加PACT量化训练推理测试的配置文件和使用说明文档。
否则,需要在repo根目录下面新建`test_tipc`文件夹,目录结构如下所示。
```
test_tipc
|--configs # 配置目录
| |--model_name # 您的模型名称
| |--train_infer_python.txt # 基础训练推理测试配置文件
| |--train_pact_infer_python.txt # PACT量化训练推理测试配置文件
|--docs # 文档目录
| |--test_train_inference_python.md # 基础训练推理测试说明文档
| |--test_train_pact_inference_python.md # PACT量化训练推理测试说明文档
|----README.md # TIPC说明文档
|----test_train_inference_python.sh # TIPC基础训练、PACT量化训练推理测试解析脚本,无需改动
|----common_func.sh # TIPC基础训练、PACT量化训练推理测试常用函数,无需改动
```
#### 3.2.2 配置文件和测试文档
* `test_tipc/README.md` 文档中对该模型支持的的功能进行总体介绍。
* `test_tipc/docs/test_train_pact_inference_python.md` 文档中对**Linux GPU/CPU PACT量化训练推理**的功能支持情况进行介绍。
* 根据测试文档,基于配置文件,跑通训练推理全流程测试。
......@@ -3,5 +3,344 @@
# 目录
- [1. 简介](#1)
- [2. 测试流程](#2)
- [3. FAQ](#3)
- [2. 命令与配置文件解析](#2)
- [2.1 命令解析](#2.1)
- [2.2 配置文件和运行命令映射解析](#2.2)
- [3. 基本训练推理功能测试开发](#3)
- [2.1 准备待测试的命令](#3.1)
- [2.2 准备数据与环境](#3.2)
- [2.3 准备开发所需脚本](#3.3)
- [2.4 填写配置文件](#3.4)
- [2.5 验证配置正确性](#3.5)
- [2.6 撰写说明文档](#3.6)
- [4. FAQ](#4)
<a name="1"></a>
## 1. 简介
本文档主要关注Linux GPU/CPU 下模型的PACT量化训练推理全流程功能测试,具体测试点如下:
- 模型训练:单机单卡/多卡训练跑通
- 模型动转静:保存静态图模型
- 模型推理:推理过程跑通
为了一键跑通上述所有功能,本文档提供了`训推一体全流程`功能自动化测试工具,它包含3个脚本文件和1个配置文件,分别是:
* `test_train_inference_python.sh`: 测试Linux上训练、模型动转静、推理功能的脚本,会对`train_pact_infer_python.txt`进行解析,得到具体的执行命令。**该脚本无需修改**
* `prepare.sh`: 准备测试需要的数据或需要的预训练模型。
* `common_func.sh`: 在配置文件一些通用的函数,如配置文件的解析函数等,**该脚本无需修改**
* `train_pact_infer_python.txt`: 配置文件,其中的内容会被`test_train_inference_python.sh`解析成具体的执行命令字段。
<a name="2"></a>
## 2. 命令与配置文件解析
<a name="2.1"></a>
### 2.1 命令解析
模型训练、动转静、推理过程的运行命令差别很大,但是都可以拆解为3个部分:
```
python run_script set_configs
```
例如:
* 对于通过配置文件传参的场景来说,`python3.7 train.py -c config.yaml -o epoch_num=120`
* `python`部分为`python3.7`
* `run_script`部分为`train.py`
* `set_configs`部分为`-c config.yaml -o epoch_num=120`
* 对于通过argparse传参的场景来说,`python3.7 train.py --data-path="./lite_data" --lr=0.1`
* `python`部分为`python3.7`
* `run_script`部分为`train.py`
* `set_configs`部分为`--data-path="./lite_data" --lr=0.1`
其中,可修改参数`set_configs`一般通过`=`进行分隔,`=`前面的内容可以认为是key,后面的内容可以认为是value,那么通过给定配置文件模板,解析配置,得到其中的key和value,结合`python``run_script`,便可以组合出一条完整的命令。
<a name="2.2"></a>
### 2.2 配置文件和运行命令映射解析
完整的`train_pact_infer_python.txt`配置文件共有32行,包含5个方面的内容。
* 训练参数:第1~11行
* 训练脚本配置:第13~14行
* 评估脚本和配置:第16~17行(本部分无需关注,这里不再展开介绍)
* 模型导出脚本和配置:第19~25行
* 模型Inference推理:第26~32行
具体内容见[train_pact_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt)
配置文件中主要有以下3种类型的字段。
* 一行内容以冒号为分隔符:该行可以被解析为`key:value`的格式,需要根据实际的含义修改该行内容,下面进行详细说明。
* 一行内容为`======xxxxx=====`:该行内容为注释信息,无需修改。
* 一行内容为`##`:该行内容表示段落分隔符,没有实际意义,无需修改。
#### 2.2.1 训练配置参数
在配置文件中,可以通过下面的方式配置一些常用的超参数,如:是否使用GPU、迭代轮数、batch-size、预训练模型路径等,下面给出了常用的训练配置以及需要修改的内容。
<details>
<summary><b>训练配置参数(点击以展开详细内容或者折叠)
</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
| 2 | model_name:mobilenet_v3_small | 模型名字 | 否 | 是 | value修改为自己的模型名字 |
| 3 | python:python3.7 | python环境 | 否 | 是 | value修改为自己的python环境 |
| 4 | gpu_list:0 | gpu id | 否 | 是 | value修改为自己的GPU ID |
| 5 | use-gpu:True | 是否使用GPU | 是 | 是 | key修改为设置GPU的内容,value修改为设置GPU的值 |
| 6 | --epochs:lite_train_lite_infer=5 | 迭代的epoch数目 | 是 | 否 | key修改为代码中设置epoch数量的内容 |
| 7 | --output-dir:./output/ | 输出目录 | 是 | 否 | key修改为代码中设置输出路径的内容 |
| 8 | --batch-size:lite_train_lite_infer=4 | 训练的batch size | 是 | 否 | key修改为代码中设置batch size的内容 |
| 9 | --pretrained:null | 预训练模型 | 是 | 是 | 如果训练时指定了预训练模型,则key和value需要对应修改 |
| 10 | train_model_name:latest.pdparams | 训练结果的模型名字 | 否 | 是 | value需要修改为训练完成之后保存的模型名称,用于后续的动转静 |
| 11 | --data-path:./lite_data | 数据集路径 | 是 | 是 | key和value需要对应修改为指定的数据集路径 |
</details>
以训练命令`python3.7 train.py --pact_quant --device=gpu --epochs=2 --data-path=./lite_data`为例,总共包含4个超参数。
* 运行设备:`--device=gpu`,则需要修改为配置文件的第5行,`key``--device``value``gpu`,修改后内容为`--device:gpu`
* 迭代轮数:`--epochs=2`,则需要修改配置文件的第6行,修改后内容为`--epochs:lite_train_lite_infer=2``lite_train_lite_infer`为模式设置,表示少量数据训练,少量数据推理,此处无需修改)
* 数据路径:`--data-path=./lite_data`,则需要修改为配置文件的第11行,修改后内容为`--data-path:./lite_data`
* 开启量化训练:`--pact_quant`,由于配置文件中不包含该项配置,因此可以将其和`train.py`字段(配置文件第14行)放在一起,具体会在2.2.2节详细说明。
#### 2.2.2 训练命令配置参数
下面给出了配置文件中的训练命令配置参数(点击以展开详细内容或者折叠)
<details>
<summary><b>训练命令配置参数(点击以展开详细内容或者折叠)
</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|---------------------------------------------|-----------------|-----------|-------------|-------------------|
| 13 | trainer:pact_train | 训练方法 | 否 | 否 | - |
| 14 | pact_train:train.py --pact_quant | pact_train的训练脚本 | 否 | 是 | value可以修改为自己的训练命令 |
</details>
以训练命令`python3.7 train.py --pact_quant --device=gpu --epochs=1 --data-path=./lite_data`为例,该命令为PACT量化训练(非裁剪、量化、蒸馏等方式),因此
* 配置文件的第13行直接写`pact_train`即可。
* 第14行配置`pact_train`的具体运行脚本/入口,即上述命令中的`train.py`因此配置文件的14行内容初步可以修改为`pact_train:train.py --pact_quant`,考虑到`--pact_quant`超参数无法在配置文件中配置,因此可以在这里添加,修改后内容为`pact_train:train.py --pact_quant`
#### 2.2.3 模型动转静配置参数
下面给出了配置文件中的模型动转静配置参数。
**【注意】:** 在模型动转静过程中,为方便管理输入输出,程序会自动指定输入和输出目录,因此我们只需要提供可以配置输入输出目录的参数即可。
<details>
<summary><b>模型动转静配置参数(点击以展开详细内容或者折叠)</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|------------------|-----------|-----------|-------------|-------------------------|
| 20 | --save-inference-dir:./output/mobilenet_v3_small_infer/ | 动转静输出目录 | 是 | 否 | key修改为代码中设置输出目录的内容 |
| 21 | --pretrained: | 预训练模型路径 | 是 | 否 | key修改为代码中可以设置预训练模型路径的内容 |
| 22 | norm_export:tools/export_model.py | 模型动转静导出命令 | 否 | 是 | value修改为实际的动转静导出命令 |
</details>
以模型动转静命令`python tools/export_model.py --pretrained=./mobilenet_v3_small_pretrained.pdparams --save-inference-dir="./mobilenet_v3_small_infer" --model=mobilenet_v3_small`为例。
* 预训练模型路径的配置为`--pretrained=./mobilenet_v3_small_pretrained.pdparams`,因此需要将21行修改为`--pretrained:`
* 动转静保存目录的配置为`--save-inference-dir="./mobilenet_v3_small_infer"`,因此需要将20行修改为`--save-inference-dir:`
* 模型导出命令为`tools/export_model.py`,考虑到也需要配置`--model=mobilenet_v3_small`,因此可以将22行修改为`norm_export:tools/export_model.py --model=mobilenet_v3_small`
#### 2.2.4 模型推理配置参数
下面给出了配置文件中的模型推理配置参数。
<details>
<summary><b>模型推理配置参数(点击以展开详细内容或者折叠)</b></summary>
| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
|----|------------------|-----------------|-----------|-------------|-------------|
| 24 | train_model:./pretrain_models/mobilenet_v3_small_pretrained.pdparams | 训练模型保存路径 | 否 | 否 | |
| 25 | infer_export:tools/export_model.py --model=mobilenet_v3_small | 推理前是否需要导出 | 否 | 是 | value修改为和22行内容一致即可 |
| 27 | inference:deploy/inference_python/infer.py | 推理脚本 | 否 | 是 | value修改为自己的推理脚本 |
| 28 | --use-gpu:True|False | 是否使用GPU | 是 | 是 | key和value修改为GPU设置的参数和值 |
| 29 | --batch_size:1 | 推理batch size | 是 | 否 | key修改为代码中设置batch size的内容 |
| 30 | --model-dir:./output/mobilenet_v3_small_infer/ | 推理模型保存路径 | 是 | 否 | key修改为代码中可以设置inference model路径的内容 |
| 31 | --img-path:./images/demo.jpg | 图片路径或者图片文件夹路径 | 是 | 否 | key修改为代码中设置图片路径的内容 |
| 32 | --benchmark:False | 是否使用benchmark | 是 | 是 | key和value修改为规范化推理日志输出设置的参数和值 |
</details>
以推理命令`python deploy/inference_python/infer.py --model-dir=./mobilenet_v3_small_infer/ --img-path=./images/demo.jpg`为例。
* 推理的入口脚本为`deploy/inference_python/infer.py`,因此27行需要修改为`inference:deploy/inference_python/infer.py`
* Inference模型路径配置为`--model-dir=./mobilenet_v3_small_infer/`,而运行该命令时,会直接基于已经生成的Inference模型,因此30行需要修改为`--model-dir:./mobilenet_v3_small_infer/`
* 测试图像路径配置为`--img-path=./images/demo.jpg`,因此31行修改为`--img-path:./images/demo.jpg`
<a name="3"></a>
## 3. PACT量化训练推理功能测试开发
PACT量化训练推理功能测试开发过程主要分为以下6个步骤。
<div align="center">
<img src="../images/quant_aware_training_guide.png" width="800">
</div>
其中设置了2个核验点,下面详细介绍开发过程。
<a name="3.1"></a>
### 3.1 准备待测试的命令
**【基本内容】**
准备训练、模型动转静、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。
**【实战】**
MobileNetV3的训练、动转静、推理示例运行命令如下所示。
```bash
# 模型训练
python3.7 train.py --device=gpu --epochs=2 --data-path=./lite_data --pact_quant
# 模型动转静
python3.7 tools/export_model.py --model=mobilenet_v3_small --pretrained=./latest.pdparams --save-inference-dir="./mobilenet_v3_small_infer" --model=mobilenet_v3_small
# 推理
python deploy/inference_python/infer.py --model-dir=./mobilenet_v3_small_infer/ --img-path=./images/demo.jpg
```
<a name="3.2"></a>
### 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`
<a name="3.3"></a>
### 3.3 准备开发所需脚本
**【基本内容】**
在repo中新建`test_tipc`目录,将文件 [common_func.sh](../../mobilenetv3_prod/Step6/test_tipc/common_func.sh)[prepare.sh](../../mobilenetv3_prod/Step6/test_tipc/prepare.sh)[test_train_inference_python.sh](../../mobilenetv3_prod/Step6/test_tipc/test_train_inference_python.sh) 分别拷贝到`test_tipc`目录中。
**【注意事项】**
* 上述3个脚本文件无需改动,在实际使用时,直接修改配置文件即可。
<a name="3.4"></a>
### 3.4 填写配置文件
**【基本内容】**
在repo的`test_tipc/`目录中新建`configs/model_name`,将文件 [train_pact_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt) 拷贝到该目录中,其中`model_name`需要修改为您自己的模型名称。
**【实战】**
配置文件的含义解析可以参考 [2.2节配置文件解析](#2.2) 部分。
mobilenet_v3_small的测试开发配置文件可以参考:[train_pact_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt)
<a name="3.5"></a>
### 3.5 验证配置正确性
**【基本内容】**
基于修改完的配置,运行
```bash
bash test_tipc/prepare.sh ${your_params_file} lite_train_lite_infer
bash test_tipc/test_train_inference_python.sh ${your_params_file} lite_train_lite_infer
```
**【注意事项】**
如果运行失败,会输出具体的报错命令,可以根据输出的报错命令排查下配置文件的问题并修改,示例报错如下所示。
```
Run failed with command - python3.7 tools/export_model.py --model=mobilenet_v3_small --pretrained=./log/mobilenet_v3_small/lite_train_lite_infer/norm_train_gpus_0/latest --save-inference-dir=./log/mobilenet_v3_small/lite_train_lite_infer/norm_train_gpus_0!
```
**【实战】**
以mobilenet_v3_small的`Linux GPU/CPU PACT量化训练推理功能测试` 为例,命令如下所示。
```bash
bash test_tipc/test_train_inference_python.sh test_tipc/configs/mobilenet_v3_small/train_pact_infer_python.txt lite_train_lite_infer
```
输出结果如下,表示命令运行成功。
```bash
Run successfully with command - python3.7 train.py --pact_quant --output-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0 --epochs=5 --batch-size=4!
......
Run successfully with command - python3.7 tools/export_model.py --model=mobilenet_v3_small --pretrained=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0/latest.pdparams --save-inference-dir=./log/mobilenet_v3_small/lite_train_lite_infer/pact_train_gpus_0!
```
**【核验】**
基于修改后的配置文件,测试通过,全部命令成功
<a name="3.6"></a>
### 3.6 撰写说明文档
**【基本内容】**
撰写TIPC功能总览和测试流程说明文档,分别为
1. TIPC功能总览文档:test_tipc/README.md
2. Linux GPU/CPU PACT量化训练推理功能测试说明文档:test_tipc/docs/test_pact_train_infer_python.md
2个文档模板分别位于下述位置,可以直接拷贝到自己的repo中,根据自己的模型进行修改。
1. [README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
2. [test_train_pact_inference_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_train_pact_inference_python.md)
**【实战】**
mobilenet_v3_small中`test_tipc`文档如下所示。
1. TIPC功能总览文档:[README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
2. Linux GPU/CPU PACT量化训练推理测试说明文档:[test_train_pact_inference_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_train_pact_inference_python.md)
**【核验】**
repo中最终目录结构如下所示。
```
test_tipc
|--configs # 配置目录
| |--model_name # 您的模型名称
| |--train_pact_infer_python.txt # PACT量化训练推理测试配置文件
|--docs # 文档目录
| |--test_train_pact_inference_python.md # PACT量化训练推理测试说明文档
|----README.md # TIPC说明文档
|----prepare.sh # TIPCPACT量化训练推理测试数据准备脚本
|----test_train_inference_python.sh # TIPCPACT量化训练推理测试解析脚本,无需改动
|----common_func.sh # TIPCPACT量化训练推理测试常用函数,无需改动
```
基于`test_train_pact_inference_python.md`文档,跑通`Linux GPU/CPU PACT量化训练推理功能测试`流程。
<a name="4"></a>
## 4. FAQ
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册