diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/serving_python/pipeline_http_client.py b/tutorials/mobilenetv3_prod/Step6/deploy/serving_python/pipeline_http_client.py
index a174813ff495db289c5f669f5245813bf8d5eda7..ccc1a2b1fc38bf35d19b16197c307ad748ab3e16 100755
--- a/tutorials/mobilenetv3_prod/Step6/deploy/serving_python/pipeline_http_client.py
+++ b/tutorials/mobilenetv3_prod/Step6/deploy/serving_python/pipeline_http_client.py
@@ -19,6 +19,11 @@ import cv2
import base64
import os
+import argparse
+parser = argparse.ArgumentParser(description="args for paddleserving")
+parser.add_argument("--image_dir", type=str, default="../../images/demo.jpg")
+args = parser.parse_args()
+
def cv2_to_base64(image):
"""cv2_to_base64
@@ -36,12 +41,16 @@ def cv2_to_base64(image):
if __name__ == "__main__":
url = "http://127.0.0.1:18093/imagenet/prediction"
logid = 10000
- img_path = "../../images/demo.jpg"
- with open(img_path, 'rb') as file:
- image_data = file.read()
- # data should be transformed to the base64 format
- image = cv2_to_base64(image_data)
- data = {"key": ["image"], "value": [image], "logid": logid}
- # send requests
- r = requests.post(url=url, data=json.dumps(data))
- print(r.json())
+ test_img_dir = args.image_dir
+
+ for idx, img_file in enumerate(os.listdir(test_img_dir)):
+ with open(os.path.join(test_img_dir, img_file), 'rb') as file:
+ image_data1 = file.read()
+
+ image = cv2_to_base64(image_data1)
+
+ for i in range(1):
+ data = {"key": ["image"], "value": [image], "logid": logid}
+ # send requests
+ r = requests.post(url=url, data=json.dumps(data))
+ print(r.json())
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt b/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt
new file mode 100644
index 0000000000000000000000000000000000000000..870684570d28518905121fa10538ba060288090a
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt
@@ -0,0 +1,13 @@
+===========================paddle2onnx_params===========================
+model_name:mobilenet_v3_small
+python:python3.7
+2onnx: paddle2onnx
+--model_dir:./inference/mobilenet_v3_small_infer/
+--model_filename:inference.pdmodel
+--params_filename:inference.pdiparams
+--save_file:./inference/mobilenet_v3_small_onnx/model.onnx
+--opset_version:10
+--enable_onnx_checker:True
+inference:deploy/onnx_python/infer.py
+--onnx_file:./inference/mobilenetv3_model_onnx/model.onnx
+--img_path:./lite_data/test/demo.jpg
\ No newline at end of file
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt b/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e59a41e3bd1affa800bc56566d4762e8e808f6fe
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt
@@ -0,0 +1,13 @@
+===========================serving_params===========================
+model_name:mobilenet_v3_small
+python:python3.7
+trans_model:-m paddle_serving_client.convert
+--dirname:./inference/mobilenet_v3_small_infer/
+--model_filename:inference.pdmodel
+--params_filename:inference.pdiparams
+--serving_server:./deploy/serving_python/serving_server/
+--serving_client:./deploy/serving_python/serving_client/
+serving_dir:./deploy/serving_python
+web_service:web_service.py
+pipline:pipeline_http_client.py
+--image_dir:../../lite_data/test/
\ No newline at end of file
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_paddle2onnx.md b/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_paddle2onnx.md
new file mode 100644
index 0000000000000000000000000000000000000000..528456b36249db64bb1b368f33a5c080a401e474
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_paddle2onnx.md
@@ -0,0 +1,86 @@
+# Paddle2ONNX 测试
+
+Paddle2ONNX 测试的主程序为`test_paddle2onnx.sh`,可以测试基于Paddle2ONNX的模型转换和onnx预测功能。
+
+
+## 1. 测试结论汇总
+
+- 推理相关:
+
+| 算法名称 | 模型名称 | device_CPU | device_GPU | batchsize |
+| :----: | :----: | :----: | :----: | :----: |
+| MobileNetV3 | mobilenet_v3_small | 支持 | 支持 | 1 |
+
+
+## 2. 测试流程
+
+### 2.1 准备数据
+
+用于基础训练推理测试的数据位于`test_images/lite_data.tar`,直接解压即可(如果已经解压完成,则无需运行下面的命令)。
+
+```
+tar -xf test_images/lite_data.tar
+```
+
+### 2.2 准备环境
+
+
+- 安装PaddlePaddle:如果您已经安装了2.2或者以上版本的paddlepaddle,那么无需运行下面的命令安装paddlepaddle。
+ ```
+ # 需要安装2.2及以上版本的Paddle
+ # 安装GPU版本的Paddle
+ pip install paddlepaddle-gpu==2.2.0
+ # 安装CPU版本的Paddle
+ pip install paddlepaddle==2.2.0
+ ```
+
+- 安装依赖
+ ```
+ pip3 install -r requirements.txt
+ ```
+
+- 安装 Paddle2ONNX
+ ```
+ pip install paddle2onnx
+ ```
+
+- 安装 ONNXRuntime
+ ```
+ # 建议安装 1.9.0 版本,可根据环境更换版本号
+ pip install onnxruntime==1.9.0
+ ```
+
+
+### 2.3 功能测试
+
+测试方法如下所示,希望测试不同的模型文件,只需更换为自己的参数配置文件,即可完成对应模型的测试。
+
+```bash
+bash test_tipc/test_paddle2onnx.sh ${your_params_file} paddle2onnx_infer
+```
+
+以`mobilenet_v3_small`的`Paddle2ONNX 测试`为例,命令如下所示。
+
+ ```bash
+bash test_tipc/prepare.sh test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt paddle2onnx_infer
+```
+
+```bash
+bash test_tipc/test_paddle2onnx.sh test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt paddle2onnx_infer
+```
+
+输出结果如下,表示命令运行成功。
+
+```
+Run successfully with command - paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/mobilenet_v3_small_onnx/model.onnx --opset_version=10 --enable_onnx_checker=True!
+
+Run successfully with command - python3.7 deploy/onnx_python/infer.py --img_path=./lite_data/test/demo.jpg --onnx_file=./inference/mobilenet_v3_small_onnx/model.onnx > ./log/mobilenet_v3_small//paddle2onnx_infer_cpu.log 2>&1 !
+```
+
+预测结果会自动保存在 `./log/mobilenet_v3_small/paddle2onnx_infer_cpu.log` ,可以看到onnx运行结果:
+```
+ONNXRuntime predict:
+class_id: 8, prob: 0.9091271758079529
+```
+
+如果运行失败,也会在终端中输出运行失败的日志信息以及对应的运行命令。可以基于该命令,分析运行失败的原因。
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_serving_infer_python.md b/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_serving_infer_python.md
new file mode 100644
index 0000000000000000000000000000000000000000..f8352cb8614c8a757c16228962a22c7325a11859
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/docs/test_serving_infer_python.md
@@ -0,0 +1,92 @@
+# Linux GPU/CPU PYTHON 服务化部署测试
+
+Linux GPU/CPU PYTHON 服务化部署测试的主程序为`test_serving_infer_python.sh`,可以测试基于Python的模型服务化部署功能。
+
+
+## 1. 测试结论汇总
+
+- 推理相关:
+
+| 算法名称 | 模型名称 | 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
+ pip install paddlepaddle-gpu==2.2.0
+ # 安装CPU版本的Paddle
+ pip install paddlepaddle==2.2.0
+ ```
+- 安装 PaddleServing 相关组件,包括serving-server、serving_client、serving-app
+
+ ```
+ # 安装0.7.0版本serving_server,用于启动服务
+ wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server_gpu-0.7.0.post102-py3-none-any.whl
+ pip install paddle_serving_server_gpu-0.7.0.post102-py3-none-any.whl
+ # 如果是cuda10.1环境,可以使用下面的命令安装paddle-serving-server
+ # wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_server_gpu-0.7.0.post101-py3-none-any.whl
+ # pip install paddle_serving_server_gpu-0.7.0.post101-py3-none-any.whl
+
+ # 安装serving_client,用于向服务发送请求
+ wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_client-0.7.0-cp37-none-any.whl
+ pip install paddle_serving_client-0.7.0-cp37-none-any.whl
+
+ # 安装serving-app
+ wget https://paddle-serving.bj.bcebos.com/test-dev/whl/paddle_serving_app-0.7.0-py3-none-any.whl
+ pip install paddle_serving_app-0.7.0-py3-none-any.whl
+ ```
+**Note:** 如果要安装最新版本的PaddleServing参考[链接](https://github.com/PaddlePaddle/Serving/blob/v0.7.0/doc/Latest_Packages_CN.md)
+
+- 安装依赖
+ ```
+ pip3 install -r requirements.txt
+ ```
+
+ ### 2.3 功能测试
+
+ 测试方法如下所示,希望测试不同的模型文件,只需更换为自己的参数配置文件,即可完成对应模型的测试。
+
+```bash
+bash test_tipc/test_serving_infer_python.sh ${your_params_file} lite_train_lite_infer
+```
+
+以`mobilenet_v3_small`的`Linux GPU/CPU PYTHON 服务化部署测试`为例,命令如下所示。
+
+ ```bash
+bash test_tipc/prepare.sh test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt serving_infer
+```
+
+```bash
+bash test_tipc/test_serving_infer_python.sh test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt serving_infer
+```
+
+输出结果如下,表示命令运行成功。
+
+```
+Run successfully with command - python3.7 pipeline_http_client.py > ../../log/mobilenet_v3_small/serving_infer/server_infer_gpu_batchsize_1.log 2>&1 !
+```
+
+预测结果会自动保存在 `./log/mobilenet_v3_small/serving_infer/server_infer_gpu_batchsize_1.log` ,可以看到 PaddleServing 的运行结果:
+
+```
+{'err_no': 0, 'err_msg': '', 'key': ['class_id', 'prob'], 'value': ['[8]', '[0.9091243743896484]'], 'tensors': []}
+```
+
+
+如果运行失败,也会在终端中输出运行失败的日志信息以及对应的运行命令。可以基于该命令,分析运行失败的原因。
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/prepare.sh b/tutorials/mobilenetv3_prod/Step6/test_tipc/prepare.sh
index d704b80d318bb7c31e2e24697167db1755d5c13c..4ea8bb9725cae4120293757b9b9b462f6ec420ae 100644
--- a/tutorials/mobilenetv3_prod/Step6/test_tipc/prepare.sh
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/prepare.sh
@@ -45,4 +45,21 @@ elif [ ${MODE} = "whole_infer" ];then
if [[ ${model_name} == "mobilenet_v3_small" ]];then
wget -nc -P ./pretrain_models/ https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams --no-check-certificate
fi
+
+elif [ ${MODE} = "serving_infer" ];then
+ # get data
+ tar -xf ./test_images/lite_data.tar
+ # wget model
+ if [[ ${model_name} == "mobilenet_v3_small" ]];then
+ wget -nc -P ./inference https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar --no-check-certificate
+ cd ./inference && tar xf mobilenet_v3_small_infer.tar && cd ../
+ fi
+elif [ ${MODE} = "paddle2onnx_infer" ];then
+ # get data
+ tar -xf ./test_images/lite_data.tar
+ # get model
+ if [[ ${model_name} == "mobilenet_v3_small" ]];then
+ wget -nc -P ./inference https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar --no-check-certificate
+ cd ./inference && tar xf mobilenet_v3_small_infer.tar && cd ../
+ fi
fi
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/test_paddle2onnx.sh b/tutorials/mobilenetv3_prod/Step6/test_tipc/test_paddle2onnx.sh
new file mode 100644
index 0000000000000000000000000000000000000000..61e1981792fac6be0a6a6d90a1afa04180fe32bf
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/test_paddle2onnx.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+source test_tipc/common_func.sh
+
+FILENAME=$1
+
+dataline=$(cat ${FILENAME})
+lines=(${dataline})
+# common params
+model_name=$(func_parser_value "${lines[1]}")
+python=$(func_parser_value "${lines[2]}")
+
+
+# parser params
+dataline=$(awk 'NR==1, NR==13{print}' $FILENAME)
+IFS=$'\n'
+lines=(${dataline})
+
+# parser paddle2onnx
+model_name=$(func_parser_value "${lines[1]}")
+python=$(func_parser_value "${lines[2]}")
+padlle2onnx_cmd=$(func_parser_value "${lines[3]}")
+infer_model_dir_key=$(func_parser_key "${lines[4]}")
+infer_model_dir_value=$(func_parser_value "${lines[4]}")
+model_filename_key=$(func_parser_key "${lines[5]}")
+model_filename_value=$(func_parser_value "${lines[5]}")
+params_filename_key=$(func_parser_key "${lines[6]}")
+params_filename_value=$(func_parser_value "${lines[6]}")
+save_file_key=$(func_parser_key "${lines[7]}")
+save_file_value=$(func_parser_value "${lines[7]}")
+opset_version_key=$(func_parser_key "${lines[8]}")
+opset_version_value=$(func_parser_value "${lines[8]}")
+enable_onnx_checker_key=$(func_parser_key "${lines[9]}")
+enable_onnx_checker_value=$(func_parser_value "${lines[9]}")
+# parser onnx inference
+inference_py=$(func_parser_value "${lines[10]}")
+model_key=$(func_parser_key "${lines[11]}")
+image_dir_key=$(func_parser_key "${lines[12]}")
+image_dir_value=$(func_parser_value "${lines[12]}")
+
+
+LOG_PATH="./log/${model_name}/${MODE}"
+mkdir -p ${LOG_PATH}
+status_log="${LOG_PATH}/results_paddle2onnx.log"
+
+
+function func_paddle2onnx(){
+ IFS='|'
+ _script=$1
+
+ # paddle2onnx
+ _save_log_path="${LOG_PATH}/paddle2onnx_infer_cpu.log"
+ set_dirname=$(func_set_params "${infer_model_dir_key}" "${infer_model_dir_value}")
+ set_model_filename=$(func_set_params "${model_filename_key}" "${model_filename_value}")
+ set_params_filename=$(func_set_params "${params_filename_key}" "${params_filename_value}")
+ set_save_model=$(func_set_params "${save_file_key}" "${save_file_value}")
+ set_opset_version=$(func_set_params "${opset_version_key}" "${opset_version_value}")
+ set_enable_onnx_checker=$(func_set_params "${enable_onnx_checker_key}" "${enable_onnx_checker_value}")
+ trans_model_cmd="${padlle2onnx_cmd} ${set_dirname} ${set_model_filename} ${set_params_filename} ${set_save_model} ${set_opset_version} ${set_enable_onnx_checker}"
+ eval $trans_model_cmd
+ last_status=${PIPESTATUS[0]}
+ status_check $last_status "${trans_model_cmd}" "${status_log}"
+ # python inference
+ set_gpu=$(func_set_params "${use_gpu_key}" "${use_gpu_value}")
+ set_model_dir=$(func_set_params "${model_key}" "${save_file_value}")
+ set_img_dir=$(func_set_params "${image_dir_key}" "${image_dir_value}")
+ infer_model_cmd="${python} ${inference_py} ${set_img_dir} ${set_model_dir} > ${_save_log_path} 2>&1 "
+ eval $infer_model_cmd
+ status_check $last_status "${infer_model_cmd}" "${status_log}"
+}
+
+
+echo "################### run test ###################"
+
+export Count=0
+IFS="|"
+func_paddle2onnx
diff --git a/tutorials/mobilenetv3_prod/Step6/test_tipc/test_serving_infer_python.sh b/tutorials/mobilenetv3_prod/Step6/test_tipc/test_serving_infer_python.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4569a84d084019b6113cb917fea59345fb7643ec
--- /dev/null
+++ b/tutorials/mobilenetv3_prod/Step6/test_tipc/test_serving_infer_python.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+source test_tipc/common_func.sh
+
+FILENAME=$1
+dataline=$(awk 'NR==1, NR==18{print}' $FILENAME)
+MODE=$2
+
+# parser params
+IFS=$'\n'
+lines=(${dataline})
+
+# parser serving
+model_name=$(func_parser_value "${lines[1]}")
+python_list=$(func_parser_value "${lines[2]}")
+trans_model_py=$(func_parser_value "${lines[3]}")
+infer_model_dir_key=$(func_parser_key "${lines[4]}")
+infer_model_dir_value=$(func_parser_value "${lines[4]}")
+model_filename_key=$(func_parser_key "${lines[5]}")
+model_filename_value=$(func_parser_value "${lines[5]}")
+params_filename_key=$(func_parser_key "${lines[6]}")
+params_filename_value=$(func_parser_value "${lines[6]}")
+serving_server_key=$(func_parser_key "${lines[7]}")
+serving_server_value=$(func_parser_value "${lines[7]}")
+serving_client_key=$(func_parser_key "${lines[8]}")
+serving_client_value=$(func_parser_value "${lines[8]}")
+serving_dir_value=$(func_parser_value "${lines[9]}")
+web_service_py=$(func_parser_value "${lines[10]}")
+pipeline_py=$(func_parser_value "${lines[11]}")
+image_dir_key=$(func_parser_key "${lines[12]}")
+image_dir_value=$(func_parser_value "${lines[12]}")
+
+
+LOG_PATH="./log/${model_name}/${MODE}"
+mkdir -p ${LOG_PATH}
+status_log="${LOG_PATH}/results_serving.log"
+
+function func_serving(){
+ IFS='|'
+ _python=$1
+ _script=$2
+ _model_dir=$3
+ # pdserving
+ set_dirname=$(func_set_params "${infer_model_dir_key}" "${infer_model_dir_value}")
+ set_model_filename=$(func_set_params "${model_filename_key}" "${model_filename_value}")
+ set_params_filename=$(func_set_params "${params_filename_key}" "${params_filename_value}")
+ set_serving_server=$(func_set_params "${serving_server_key}" "${serving_server_value}")
+ set_serving_client=$(func_set_params "${serving_client_key}" "${serving_client_value}")
+ python_list=(${python_list})
+ python=${python_list[0]}
+ trans_model_cmd="${python} ${trans_model_py} ${set_dirname} ${set_model_filename} ${set_params_filename} ${set_serving_server} ${set_serving_client}"
+ eval $trans_model_cmd}
+ cd ${serving_dir_value}
+ echo $PWD
+ unset https_proxy
+ unset http_proxy
+
+ web_service_cmd="${python} ${web_service_py} &"
+ eval $web_service_cmd
+ sleep 2s
+ _save_log_path="../../log/${model_name}/${MODE}/server_infer_gpu_batchsize_1.log"
+ set_image_dir=$(func_set_params "${image_dir_key}" "${image_dir_value}")
+ pipeline_cmd="${python} ${pipeline_py} ${set_image_dir} > ${_save_log_path} 2>&1 "
+ eval $pipeline_cmd
+ last_status=${PIPESTATUS[0]}
+ eval "cat ${_save_log_path}"
+ cd ../../
+ status_check $last_status "${pipeline_cmd}" "${status_log}"
+ ps ux | grep -E 'web_service|pipeline' | awk '{print $2}' | xargs kill -s 9
+}
+
+
+# set cuda device
+GPUID=$3
+if [ ${#GPUID} -le 0 ];then
+ env=" "
+else
+ env="export CUDA_VISIBLE_DEVICES=${GPUID}"
+fi
+set CUDA_VISIBLE_DEVICES
+eval $env
+
+
+echo "################### run test ###################"
+
+export Count=0
+IFS="|"
+func_serving "${web_service_cmd}"
diff --git a/tutorials/tipc/paddle2onnx/README.md b/tutorials/tipc/paddle2onnx/README.md
index 04c334d71f229e31bed2e3a180a82aefde394bb5..cd8e4f24afdd5446efe872334b770a9a55208c9d 100644
--- a/tutorials/tipc/paddle2onnx/README.md
+++ b/tutorials/tipc/paddle2onnx/README.md
@@ -38,7 +38,7 @@ Paddle2ONNX 开发过程可以分为下面6个步骤。
-更多的介绍可以参考:[Paddle2ONNX 开发文档](./paddle2onnx.md)。
+更多的介绍可以参考:[Paddle2ONNX 功能开发文档](https://github.com/PaddlePaddle/models/blob/release/2.2/tutorials/tipc/paddle2onnx/paddle2onnx.md)。
@@ -56,4 +56,37 @@ Paddle2ONNX 开发过程可以分为下面6个步骤。
# 3. Paddle2ONNX 功能测试开发与规范
-coming soon!
+## 3.1 开发流程
+
+基础训练推理测试开发的流程如下所示。
+
+
+
+
+
+更多的介绍可以参考:[Paddle2ONNX 测试开发规范](./test_paddle2onnx.md)。
+
+## 3.2 核验点
+
+### 3.2.1 目录结构
+
+在repo根目录下面新建`test_tipc`文件夹,目录结构如下所示。
+
+```
+test_tipc
+ |--configs # 配置目录
+ | |--model_name # 您的模型名称
+ | |--paddle2onnx_infer_python.txt # paddle2onnx测试配置文件
+ |--docs # 文档目录
+ | |--test_paddle2onnx.md # paddle2onnx测试说明文档
+ |----README.md # TIPC说明文档
+ |----test_paddle2onnx.sh # TIPC paddle2onnx解析脚本,无需改动
+ |----common_func.sh # TIPC基础训练推理测试常用函数,无需改动
+```
+
+
+#### 3.2.2 配置文件和测试文档
+
+* `test_tipc/README.md` 文档中对该模型支持的的功能进行总体介绍。
+* `test_tipc/docs/test_paddle2onnx.md ` 文档中对**Paddle2ONNX**的功能支持情况进行介绍。
+* 根据测试文档,基于配置文件,跑通训练推理全流程测试。
diff --git a/tutorials/tipc/paddle2onnx/test_paddle2onnx.md b/tutorials/tipc/paddle2onnx/test_paddle2onnx.md
index 240eaa31dbf43eddda1d1cfb8b8be0182078fe0a..22d8407397c183f309e96658ccd3e57dac2a40ef 100644
--- a/tutorials/tipc/paddle2onnx/test_paddle2onnx.md
+++ b/tutorials/tipc/paddle2onnx/test_paddle2onnx.md
@@ -2,6 +2,289 @@
# 目录
-- [1. 简介](#1---)
-- [2. Paddle2ONNX功能测试开发](#2---)
-- [3. FAQ](#3---)
+- [1. 简介](#1)
+- [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)
+
+
+
+## 1. 简介
+
+本文档主要关注Linux GPU/CPU 下模型的Paddle2ONNX全流程功能测试,具体测试点如下:
+
+- 模型转换:Paddle2ONNX模型转换跑通
+- 模型推理:推理过程跑通
+
+为了一键跑通上述所有功能,本文档提供了`训推一体全流程`功能自动化测试工具,它包含3个脚本文件和1个配置文件,分别是:
+
+* `test_paddle2onnx.sh`: 测试Paddle2ONNX模型转换和模型推理过程的脚本,会对`paddle2onnx_infer_python.txt`进行解析,得到具体的执行命令。**该脚本无需修改**。
+* `prepare.sh`: 准备测试需要的数据或需要的预训练模型。
+* `common_func.sh`: 在配置文件一些通用的函数,如配置文件的解析函数等,**该脚本无需修改**。
+* `paddle2onnx_infer_python.txt`: 配置文件,其中的内容会被`test_paddle2onnx.sh`解析成具体的执行命令字段。
+
+
+
+## 2. 命令与配置文件解析
+
+
+
+### 2.1 命令解析
+
+Paddle2ONNX模型转换和模型预测的运行命令差别很大,但是都可以拆解为3个部分:
+
+```
+python run_script set_configs
+```
+
+例如:
+
+* 对于通过argparse传参的场景来说,`python3.7 deploy/onnx_python/infer.py --onnx_file=./inference/mobilenetv3_model_onnx/model.onnx`
+ * `python`部分为`python3.7`
+ * `run_script`部分为`deploy/onnx_python/infer.py`
+ * `set_configs`部分为`--onnx_file=./inference/mobilenetv3_model_onnx/model.onnx`
+
+其中,可修改参数`set_configs`一般通过`=`进行分隔,`=`前面的内容可以认为是key,后面的内容可以认为是value,那么通过给定配置文件模板,解析配置,得到其中的key和value,结合`python`和`run_script`,便可以组合出一条完整的命令。
+
+
+
+### 2.2 配置文件和运行命令映射解析
+
+完整的`paddle2onnx_infer_python.txt`配置文件共有13行,包含2个方面的内容。
+
+* Paddle2ONNX模型转换:第4~10行
+* 模型Inference推理:第11~13行
+
+具体内容见[paddle2onnx_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt)
+
+配置文件中主要有以下3种类型的字段。
+
+* 一行内容以冒号为分隔符:该行可以被解析为`key:value`的格式,需要根据实际的含义修改该行内容,下面进行详细说明。
+* 一行内容为`======xxxxx=====`:该行内容为注释信息,无需修改。
+* 一行内容为`##`:该行内容表示段落分隔符,没有实际意义,无需修改。
+
+#### 2.2.1 模型转换配置参数
+
+在配置文件中,可以通过下面的方式配置一些常用的超参数,如:Paddle模型路径、ONNX模型路径等,下面给出了常用的训练配置以及需要修改的内容。
+
+
+模型转换配置参数(点击以展开详细内容或者折叠)
+
+
+
+| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
+|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
+| 2 | model_name:mobilenet_v3_small | 模型名字 | 否 | 是 | value修改为自己的模型名字 |
+| 3 | python:python3.7 | python环境 | 否 | 是 | value修改为自己的python环境 |
+| 4 | 2onnx: paddle2onnx | paddle2onnx 命令 | 否 | 否 | - |
+| 5 | --model_dir:./inference/mobilenet_v3_small_infer/ | Paddle inference 模型保存路径 | 否 | 是 | value修改为自己 Inference 模型的路径 |
+| 6 | --model_filename:inference.pdmodel | pdmodel 文件名 | 否 | 是 | value修改为 pdmodel 文件名 |
+| 7 | --params_filename:inference.pdiparams | pdiparams 文件名 | 否 | 是 | value修改为 pdiparams 文件名 |
+| 8 | --save_file:./inference/mobilenet_v3_small_onnx/model.onnx | 转换出的 onnx 模型目录 | 否 | 是 | value修改为onnx模型保存路径 |
+
+
+
+以模型转换命令 `paddle2onnx --model_dir=./inference/resnet50_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/resnet50_onnx/model.onnx` 为例,总共包含4个超参数。
+
+* inference 模型路径: `--model_dir=./inference/resnet50_infer/` 则需要修改第5行, 修改后内容为`--model_dir:./inference/resnet50_infer/`。
+* pdmodel文件名: `--model_filename=inference.pdmodel ` 则需要修改第6行, 修改后内容为 `--model_filename:inference.pdmodel`。
+* 其他参数以此类推
+
+
+#### 2.2.2 模型Inference推理配置参数
+
+下面给出了配置文件中的模型Inference推理配置参数(点击以展开详细内容或者折叠)
+
+
+模型Inference推理配置参数(点击以展开详细内容或者折叠)
+
+
+| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
+|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
+| 11 | inference:deploy/onnx_python/infer.py | 启动 inference 预测命令 | 否 | 是 | value修改为预测脚本路径 |
+| 12 | --onnx_file:./inference/mobilenetv3_model_onnx/model.onnx | onnx 模型目录 | 否 | 是 | value修改为待预测的onnx模型(与转换出的onnx模型目录一致) |
+| 13 | --img_path:./lite_data/test/demo.jpg | 预测图片路径 | 否 | 是 | value修改为预测图片路径 |
+
+
+
+
+以推理命令 `python3.7 inference:deploy/onnx_python/infer.py --onnx_file=./inference/resnet50_model_onnx/model.onnx --img_path=./my_data/test_img.png` 为例,总共包含2个超参数。
+
+* onnx模型路径:`--onnx_file=./inference/resnet50_model_onnx/model.onnx `,则需要修改配置文件的第12行,`key`为`--onnx_file`, `value`为`./inference/resnet50_model_onnx/model.onnx`,修改后内容为`--onnx_file:./inference/resnet50_model_onnx/model.onnx`。
+* 预测图片路径:`--img_path=./my_data/test_img.png`, 则需要修改配置文件的第13行,`key`为`--img_path`, `value` 为 `./my_data/test_img.png`,修改后内容为`--img_path:./my_data/test_img.png`。
+
+
+## 3. Paddle2ONNX功能测试开发
+
+Paddle2ONNX功能测试开发过程主要分为以下6个步骤。
+
+
+
+
+
+
+其中设置了2个核验点,下面详细介绍开发过程。
+
+
+
+### 3.1 准备待测试的命令
+
+**【基本内容】**
+
+准备模型转换、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。
+
+**【实战】**
+
+MobileNetV3的Paddle2ONNX模型转换、推理示例运行命令如下所示。
+
+```bash
+# Paddle2ONNX
+paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ \
+--model_filename=inference.pdmodel \
+--params_filename=inference.pdiparams \
+--save_file=./inference/mobilenet_v3_small_onnx/model.onnx \
+--opset_version=10 \
+--enable_onnx_checker=True
+# 推理
+python3.7 deploy/onnx_python/infer.py --onnx_file=./inference/mobilenetv3_model_onnx/model.onnx --img_path=./lite_data/test/demo.jpg
+```
+
+
+
+### 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`
+
+
+
+
+### 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_paddle2onnx.sh](../../mobilenetv3_prod/Step6/test_tipc/test_paddle2onnx.sh) 分别拷贝到`test_tipc`目录中。
+
+
+**【注意事项】**
+
+* 上述3个脚本文件无需改动,在实际使用时,直接修改配置文件即可。
+
+
+
+### 3.4 填写配置文件
+
+**【基本内容】**
+
+在repo的`test_tipc/`目录中新建`configs/model_name`,将文件 [paddle2onnx_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt) 拷贝到该目录中,其中`model_name`需要修改为您自己的模型名称。
+
+**【实战】**
+
+配置文件的含义解析可以参考 [2.2节配置文件解析](#2.2) 部分。
+
+mobilenet_v3_small的测试开发配置文件可以参考:[paddle2onnx_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt)。
+
+
+
+### 3.5 验证配置正确性
+
+**【基本内容】**
+
+基于修改完的配置,运行
+
+```bash
+bash test_tipc/prepare.sh ${your_params_file} paddle2onnx_infer
+bash test_tipc/test_paddle2onnx.sh ${your_params_file} paddle2onnx_infer
+```
+
+**【注意事项】**
+
+如果运行失败,会输出具体的报错命令,可以根据输出的报错命令排查下配置文件的问题并修改,示例报错如下所示。
+
+```
+Run failed with command - paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/mobilenet_v3_small_onnx/model.onnx --opset_version=10 --enable_onnx_checker=True!
+```
+
+**【实战】**
+
+以mobilenet_v3_small的`Linux GPU/CPU 离线量化训练推理功能测试` 为例,命令如下所示。
+
+```bash
+bash test_tipc/test_paddle2onnx.sh ./test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt paddle2onnx
+```
+
+输出结果如下,表示命令运行成功。
+
+```bash
+Run successfully with command - paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/mobilenet_v3_small_onnx/model.onnx --opset_version=10 --enable_onnx_checker=True!
+
+Run successfully with command - python3.7 deploy/onnx_python/infer.py --img_path=./lite_data/test/demo.jpg --onnx_file=./inference/mobilenet_v3_small_onnx/model.onnx > ./log/mobilenet_v3_small//paddle2onnx_infer_cpu.log 2>&1 !
+```
+
+**【核验】**
+
+基于修改后的配置文件,测试通过,全部命令成功
+
+
+
+### 3.6 撰写说明文档
+
+**【基本内容】**
+
+撰写TIPC功能总览和测试流程说明文档,分别为
+
+1. TIPC功能总览文档:test_tipc/README.md
+2. Linux GPU/CPU 离线量化训练推理功能测试说明文档:test_tipc/docs/test_paddle2onnx.md
+
+2个文档模板分别位于下述位置,可以直接拷贝到自己的repo中,根据自己的模型进行修改。
+
+1. [README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
+2. [test_paddle2onnx.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_paddle2onnx.md)
+
+**【实战】**
+
+mobilenet_v3_small中`test_tipc`文档如下所示。
+
+1. TIPC功能总览文档:[README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
+2. Paddle2ONNX 测试说明文档:[test_paddle2onnx.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_paddle2onnx.md)
+
+**【核验】**
+
+repo中最终目录结构如下所示。
+
+```
+test_tipc
+ |--configs # 配置目录
+ | |--model_name # 您的模型名称
+ | |--paddle2onnx_infer_python.txt # paddle2onnx测试配置文件
+ |--docs # 文档目录
+ | |--test_paddle2onnx.md # paddle2onnx测试说明文档
+ |----README.md # TIPC说明文档
+ |----test_paddle2onnx.sh # TIPC paddle2onnx解析脚本,无需改动
+ |----common_func.sh # TIPC基础训练推理测试常用函数,无需改动
+```
+
+基于`test_paddle2onnx.md`文档,跑通`Paddle2ONNX功能测试`流程。
+
+
+
+## 4. FAQ
diff --git a/tutorials/tipc/serving_python/README.md b/tutorials/tipc/serving_python/README.md
index e2d475438a0a0e7a7fce77251b9a43218f29267d..5fd2dd19e321ce9d5d9a77048c072a55fbbe3a17 100644
--- a/tutorials/tipc/serving_python/README.md
+++ b/tutorials/tipc/serving_python/README.md
@@ -57,4 +57,39 @@ Linux GPU/CPU PYTHON 服务化部署功能开发过程以分为下面8个步骤
## 3. 服务化部署测试开发规范
-coming soon!
+## 3.1 开发流程
+
+基础训练推理测试开发的流程如下所示。
+
+
+
+
+
+
+
+更多的介绍可以参考:[Linux GPU/CPU PYTHON 服务化部署测试开发文档](./test_serving_python.md)。
+
+## 3.2 核验点
+
+### 3.2.1 目录结构
+
+在repo根目录下面新建`test_tipc`文件夹,目录结构如下所示。
+
+
+```
+test_tipc
+ |--configs # 配置目录
+ | |--model_name # 您的模型名称
+ | |--serving_infer_python.txt # python服务化部署测试配置文件
+ |--docs # 文档目录
+ | |--test_serving_infer_python.md # python服务化部署测试说明文档
+ |----README.md # TIPC说明文档
+ |----test_serving_infer_python.sh # TIPC python服务化部署解析脚本,无需改动
+ |----common_func.sh # TIPC基础训练推理测试常用函数,无需改动
+```
+
+#### 3.2.2 配置文件和测试文档
+
+* `test_tipc/README.md` 文档中对该模型支持的的功能进行总体介绍。
+* `test_tipc/docs/test_serving_infer_python.md ` 文档中对**PaddleServing**的功能支持情况进行介绍。
+* 根据测试文档,基于配置文件,跑通训练推理全流程测试。
diff --git a/tutorials/tipc/serving_python/test_serving_python.md b/tutorials/tipc/serving_python/test_serving_python.md
index 3a35fd84a348f6501440273102b3d183a3eb958d..42cde5bd5b1cbb8c756af951f7fc4f97cdf0c5ab 100644
--- a/tutorials/tipc/serving_python/test_serving_python.md
+++ b/tutorials/tipc/serving_python/test_serving_python.md
@@ -3,7 +3,286 @@
# 目录
- [1. 简介](#1)
-- [2. 基本服务化部署功能测试开发](#2---)
-- [3. 高级服务化部署功能测试开发](#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)
+
+
+## 1. 简介
+
+本文档主要关注Linux GPU/CPU 下模型的PYTHON 服务化部署功能测试,具体测试点如下:
+
+- 模型转换:部署模型转换跑通
+- 模型部署:python服务部署过程跑通
+
+为了一键跑通上述所有功能,本文档提供了`训推一体全流程`功能自动化测试工具,它包含3个脚本文件和1个配置文件,分别是:
+
+* `test_serving_infer_python.sh`: 测试部署模型转换和python服务部署预测的脚本,会对`serving_infer_python.txt`进行解析,得到具体的执行命令。**该脚本无需修改**。
+* `prepare.sh`: 准备测试需要的数据或需要的预训练模型。
+* `common_func.sh`: 在配置文件一些通用的函数,如配置文件的解析函数等,**该脚本无需修改**。
+* `serving_infer_python.txt`: 配置文件,其中的内容会被`test_serving_infer_python.sh`解析成具体的执行命令字段。
+
+
+
+## 2. 命令与配置文件解析
+
+
+
+### 2.1 命令解析
+
+部署模型转换和服务部署的运行命令差别很大,但是都可以拆解为3个部分:
+
+```
+python run_script set_configs
+```
+
+例如:
+
+* 对于通过argparse传参的场景来说,`python3.7 pipeline_http_client.py --image_dir=../../lite_data/test/`
+ * `python`部分为`python3.7`
+ * `run_script`部分为`pipeline_http_client.py`
+ * `set_configs`部分为`--image_dir=../../lite_data/test/`
+
+其中,可修改参数`set_configs`一般通过`=`进行分隔,`=`前面的内容可以认为是key,后面的内容可以认为是value,那么通过给定配置文件模板,解析配置,得到其中的key和value,结合`python`和`run_script`,便可以组合出一条完整的命令。
+
+
+
+### 2.2 配置文件和运行命令映射解析
+
+完整的`serving_infer_python.txt`配置文件共有13行,包含2个方面的内容。
+
+* Serving 部署模型转换:第4~10行
+* Serving 启动部署服务:第10~13行
+
+具体内容见[serving_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt)
+
+配置文件中主要有以下3种类型的字段。
+
+* 一行内容以冒号为分隔符:该行可以被解析为`key:value`的格式,需要根据实际的含义修改该行内容,下面进行详细说明。
+* 一行内容为`======xxxxx=====`:该行内容为注释信息,无需修改。
+* 一行内容为`##`:该行内容表示段落分隔符,没有实际意义,无需修改。
+
+#### 2.2.1 模型转换配置参数
+
+在配置文件中,可以通过下面的方式配置一些常用的超参数,如:Paddle模型路径、部署模型路径等,下面给出了常用的训练配置以及需要修改的内容。
+
+
+模型转换配置参数(点击以展开详细内容或者折叠)
+
+
+
+| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
+|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
+| 2 | model_name:mobilenet_v3_small | 模型名字 | 否 | 是 | value修改为自己的模型名字 |
+| 3 | python:python3.7 | python环境 | 否 | 是 | value修改为自己的python环境 |
+| 5 | --dirname:./inference/mobilenet_v3_small_infer/ | Paddle inference 模型保存路径 | 否 | 是 | value修改为自己 Inference 模型的路径 |
+| 6 | --model_filename:inference.pdmodel | pdmodel 文件名 | 否 | 是 | value修改为 pdmodel 文件名 |
+| 7 | --params_filename:inference.pdiparams | pdiparams 文件名 | 否 | 是 | value修改为 pdiparams 文件名 |
+| 8 | --serving_server:./deploy/serving_infer_python.serving_server/ | 转换出的部署模型目录 | 否 | 是 | value修改为部署模型模型保存路径 |
+| 9 | --serving_client:./deploy/serving_infer_python.serving_client/ | 转换出的服务模型目录 | 否 | 是 | value修改为服务模型保存路径 |
+
+
+以模型转换命令 `python3.7 -m paddle_serving_client.convert --dirname=./inference/resnet50_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --serving_server=./deploy/serving_infer_python.serving_server/ --serving_client=./deploy/serving_infer_python.serving_client/` 为例,总共包含5个超参数。
+
+* inference 模型路径: `--dirname=./inference/resnet50_infer/` 则需要修改第5行, 修改后内容为`--dirname:./inference/resnet50_infer/`。
+* pdmodel文件名: `--model_filename=inference.pdmodel ` 则需要修改第6行, 修改后内容为 `--model_filename:inference.pdmodel`。
+* 其他参数以此类推
+
+
+#### 2.2.2 python服务部署配置参数
+
+下面给出了配置文件中的python服务部署配置参数(点击以展开详细内容或者折叠)
+
+
+服务部署配置参数(点击以展开详细内容或者折叠)
+
+
+| 行号 | 参考内容 | 含义 | key是否需要修改 | value是否需要修改 | 修改内容 |
+|----|-------------------------------------|---------------|-----------|-------------|----------------------------------|
+| 10 | serving_dir:./deploy/serving_infer_python.| python部署执行目录 | 否 | 是 | value修改为python部署工作目录 |
+| 11 | web_service:web_service.py | 启动部署服务命令 | 否 | 是 | value修改为自定义的服务部署脚本 |
+| 12 | pipline:pipeline_http_client.py | 启动访问客户端 | 否 | 是 | value修改为自定义的客户端启动脚本 |
+| 13 | --image_dir:../../lite_data/test/ | 预测图片路径 | 否 | 是 | value修改为预测图片路径 |
+
+
+
+
+以启动客户端命令 `python3.7 pipeline_http_client.py --image_dir=./my_data/test_img.png` 为例,总共包含1个超参数。
+
+* 预测图片路径:`--image_dir=./my_data/test_img.png`, 则需要修改配置文件的第13行,`key`为`--image_dir`, `value` 为 `./my_data/test_img.png`,修改后内容为`--image_dir=:./my_data/test_img.png`。
+
+
+## 3. python 服务化部署功能测试开发
+
+服务化部署功能测试开发主要分为以下6个步骤。
+
+
+
+
+
+
+其中设置了2个核验点,下面详细介绍开发过程。
+
+
+
+### 3.1 准备待测试的命令
+
+**【基本内容】**
+
+准备模型转换、模型推理的命令,后续会将这些命令按照[第2节](#2)所述内容,映射到配置文件中。
+
+**【实战】**
+
+MobileNetV3的Serving模型转换、服务部署运行命令如下所示。
+
+```bash
+# 模型转换
+python3.7 -m paddle_serving_client.convert
+--dirnam=./inference/mobilenet_v3_small_infer/ \
+--model_filename=inference.pdmodel \
+--params_filename=inference.pdiparams \
+--serving_server=./deploy/serving_infer_python.serving_server/ \
+--serving_client=./deploy/serving_infer_python.serving_client/
+# 部署
+python3.7 web_service.py
+python3.7 pipeline_http_client.py --image_dir=../../lite_data/test/
+```
+
+
+
+### 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`
+
+
+
+
+### 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_serving_infer_python.sh](../../mobilenetv3_prod/Step6/test_tipc/test_serving_infer_python.sh) 分别拷贝到`test_tipc`目录中。
+
+
+**【注意事项】**
+
+* 上述3个脚本文件无需改动,在实际使用时,直接修改配置文件即可。
+
+
+
+### 3.4 填写配置文件
+
+**【基本内容】**
+
+在repo的`test_tipc/`目录中新建`configs/model_name`,将文件 [serving_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt) 拷贝到该目录中,其中`model_name`需要修改为您自己的模型名称。
+
+**【实战】**
+
+配置文件的含义解析可以参考 [2.2节配置文件解析](#2.2) 部分。
+
+mobilenet_v3_small的测试开发配置文件可以参考:[serving_infer_python.txt](../../mobilenetv3_prod/Step6/test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt)。
+
+
+
+### 3.5 验证配置正确性
+
+**【基本内容】**
+
+基于修改完的配置,运行
+
+```bash
+bash test_tipc/prepare.sh ${your_params_file} serving_infer
+bash test_tipc/test_serving_infer_python.sh ${your_params_file} serving_infer
+```
+
+**【注意事项】**
+
+如果运行失败,会输出具体的报错命令,可以根据输出的报错命令排查下配置文件的问题并修改,示例报错如下所示。
+
+```
+Run failed with command - python3.7 pipeline_http_client.py > ../../log/mobilenet_v3_small/serving_infer/server_infer_gpu_batchsize_1.log 2>&1 !
+```
+
+**【实战】**
+
+以mobilenet_v3_small的`Linux GPU/CPU 离线量化训练推理功能测试` 为例,命令如下所示。
+
+```bash
+bash test_tipc/test_serving_infer_python.sh test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt serving_infer
+```
+
+输出结果如下,表示命令运行成功。
+
+```bash
+Run successfully with command - python3.7 pipeline_http_client.py > ../../log/mobilenet_v3_small/serving_infer/server_infer_gpu_batchsize_1.log 2>&1 !
+```
+
+**【核验】**
+
+基于修改后的配置文件,测试通过,全部命令成功
+
+
+
+### 3.6 撰写说明文档
+
+**【基本内容】**
+
+撰写TIPC功能总览和测试流程说明文档,分别为
+
+1. TIPC功能总览文档:test_tipc/README.md
+2. Linux GPU/CPU 离线量化训练推理功能测试说明文档:test_tipc/docs/test_serving_infer_python.md
+
+2个文档模板分别位于下述位置,可以直接拷贝到自己的repo中,根据自己的模型进行修改。
+
+1. [README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
+2. [test_serving_infer_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_serving_infer_python.md)
+
+**【实战】**
+
+mobilenet_v3_small中`test_tipc`文档如下所示。
+
+1. TIPC功能总览文档:[README.md](../../mobilenetv3_prod/Step6/test_tipc/README.md)
+2. Python Serving 测试说明文档:[test_serving_infer_python.md](../../mobilenetv3_prod/Step6/test_tipc/docs/test_serving_infer_python.md)
+
+**【核验】**
+
+repo中最终目录结构如下所示。
+
+```
+test_tipc
+ |--configs # 配置目录
+ | |--model_name # 您的模型名称
+ | |--serving_infer_python.txt # python服务化部署测试配置文件
+ |--docs # 文档目录
+ | |--test_serving_infer_python.md # python服务化部署测试说明文档
+ |----README.md # TIPC说明文档
+ |----test_serving_infer_python.sh # TIPC python服务化部署解析脚本,无需改动
+ |----common_func.sh # TIPC基础训练推理测试常用函数,无需改动
+```
+
+基于`test_serving_infer_python.md`文档,跑通`python服务化部署功能测试`流程。
+
+
+
+## 4. FAQ
diff --git a/tutorials/tipc/train_infer_python/README.md b/tutorials/tipc/train_infer_python/README.md
index 9e9adca22fc775f4262de4d4db3d6b4995e44dd6..66c2ab26f49b08135374a83287627ed83797e4cc 100644
--- a/tutorials/tipc/train_infer_python/README.md
+++ b/tutorials/tipc/train_infer_python/README.md
@@ -145,9 +145,10 @@ repo中包含`lite_data`小数据集压缩包,解压之后可以获取`lite_da
基础训练推理测试开发的流程如下所示。
-
+
+
更多的介绍可以参考:[Linux GPU/CPU 基础训练推理测试开发规范](./test_train_infer_python.md)。