- 人工智能
- 深度学习
- 计算机视觉
- NLP
- 语音
【免费下载链接】models
Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
本指南聚焦于tutorials/mobilenetv3_prod/Step6中基于 Paddle Serving Pipeline 框架的 Python 服务化部署 TIPC 测试:从测试结论、数据与环境准备,到test_serving_infer_python.sh自动化测试的完整执行流程与日志解读,并深入结合仓库源码剖析模型转换、服务启动、HTTP 客户端请求及 Pipeline 配置的底层实现。读完本文,你将掌握如何在 Linux GPU/CPU 环境下对 MobileNetV3 等图像分类模型一键跑通服务化部署回归测试,并能独立排查部署过程中的常见故障。
1. 测试定位与结论汇总
Linux GPU/CPU Python 服务化部署测试的主程序为test_tipc/test_serving_infer_python.sh,它用于验证基于 Python 的 Paddle Serving 服务化部署功能是否在指定软硬件环境下可以端到端跑通。该脚本被 TIPC(Training, Inference and Production Cycle)测试体系调用,属于模型生产化验证链条中"服务化部署(serving)"一环,与训练、推理测试共同构成完整的自动化回归矩阵。
针对 MobileNetV3 的推理相关测试结论如下:
| 算法名称 | 模型名称 | device_CPU | device_GPU | batchsize |
|---|---|---|---|---|
| MobileNetV3 | mobilenet_v3_small | 支持 | 支持 | 1 |
从该表可以看出,mobilenet_v3_small在 CPU 与 GPU 两种计算设备上均支持 Python 服务化部署测试,测试 batchsize 固定为 1。这与服务端 Pipeline 配置(config.yml 中 op 并发数concurrency: 1)及客户端单图请求的实现保持一致。
2. 测试流程概览与配置骨架
2.1 主程序与配置文件
整个测试由两个脚本协同完成:
- 数据/模型准备:
test_tipc/prepare.sh,负责解压测试数据、下载推理模型; - 测试执行:
test_tipc/test_serving_infer_python.sh,负责模型转换、服务启动、客户端请求与状态检查。
两者的行为均由参数配置文件驱动,本案例对应的配置文件为test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt,内容如下:
===========================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 --config=config.yml --opt op.imagenet.local_service_conf.devices:"0"|null pipline:pipeline_http_client.py --image_dir:../../lite_data/test/所有相对路径均以tutorials/mobilenetv3_prod/Step6/为基准,因此运行测试前需先进入该目录。
2.2 配置参数详解
结合 test_serving_infer_python.sh 的解析逻辑(awk 'NR==1, NR==18{print}'读取前 18 行,再经func_parser_key/func_parser_value按冒号拆分为键值对),各字段含义如下:
| 配置行 | 键(key) | 值(value) | 说明 |
|---|---|---|---|
| 第 2 行 | model_name | mobilenet_v3_small | 被测模型名,决定日志目录与状态日志命名 |
| 第 3 行 | python | python3.7 | 执行转换/服务/客户端脚本的 Python 解释器,需为 3.6/3.7/3.8 |
| 第 4 行 | trans_model | -m paddle_serving_client.convert | 静态图模型转 Serving 模型的转换命令入口 |
| 第 5 行 | --dirname | ./inference/mobilenet_v3_small_infer/ | 静态图推理模型所在目录(含 *.pdmodel 与 *.pdiparams) |
| 第 6 行 | --model_filename | inference.pdmodel | 模型结构文件 |
| 第 7 行 | --params_filename | inference.pdiparams | 模型参数文件 |
| 第 8 行 | --serving_server | ./deploy/serving_python/serving_server/ | 转换生成的服务端模型目录 |
| 第 9 行 | --serving_client | ./deploy/serving_python/serving_client/ | 转换生成的客户端模型目录 |
| 第 10 行 | serving_dir | ./deploy/serving_python | 服务代码工作目录,脚本执行cd进入 |
| 第 11 行 | web_service | web_service.py --config=config.yml | 服务端启动命令(Python Pipeline Web 服务) |
| 第 12 行 | --opt | op.imagenet.local_service_conf.devices:"0"|null | 计算设备开关:"0"表示 GPU(第 0 号卡),null表示 CPU,脚本据此循环执行两轮测试 |
| 第 13 行 | pipline | pipeline_http_client.py | 客户端请求脚本 |
| 第 14 行 | --image_dir | ../../lite_data/test/ | 客户端使用的测试图片目录 |
其中第 12 行的--opt参数即 web_service.py 中ArgsParser的-o/--opt选项:它支持以点号分隔的路径(op.imagenet.local_service_conf.devices)在命令行直接覆盖 config.yml 中对应字段,从而在不修改配置文件的前提下切换 CPU/GPU 设备。测试脚本会在"0"与null两个值间循环,分别完成 GPU 与 CPU 两轮服务化部署验证。
3. 准备数据
用于服务化部署测试的数据位于test_images/lite_data.tar,直接解压即可(若已解压完成则无需重复执行):
tar -xf test_images/lite_data.tar该步骤也被 prepare.sh 的serving_infer模式自动化:脚本在准备阶段执行tar -xf ./test_images/lite_data.tar解压数据,同时下载mobilenet_v3_small_infer.tar推理模型包到./inference/目录并解压:
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 ../解压完成后,./inference/mobilenet_v3_small_infer/下即包含inference.pdmodel(结构)与inference.pdiparams(参数)两个静态图文件,供后续 Serving 模型转换使用。
4. 准备环境
4.1 安装 PaddlePaddle(2.2 及以上)
服务化部署测试依赖 PaddlePaddle 运行时,已安装 2.2 及以上版本可跳过本步:
# 需要安装2.2及以上版本的Paddle # 安装GPU版本的Paddle pip install paddlepaddle-gpu==2.2.0 # 安装CPU版本的Paddle pip install paddlepaddle==2.2.0版本匹配是部署成功的关键:0.7.0 版本的 Paddle Serving 需要与 PaddlePaddle 2.2 之后的版本搭配进行模型转换,若版本过低会出现下文 FAQ 中的AttributeError报错。
4.2 安装 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说明:GPU 版 whl 包的
post102/post101后缀对应 CUDA 10.2 / CUDA 10.1 环境,请按实际环境选择;下载较慢时可使用国内镜像源加速(如在 pip 命令中追加-i https://mirror.baidu.com/pypi/simple)。
4.3 安装依赖
在Step6目录下安装项目依赖:
pip3 install -r requirements.txt此外,deploy/serving_python/README.md 还推荐使用 Docker 进行 Serving 部署以隔离环境:CPU 镜像为paddlepaddle/serving:0.7.0-devel,GPU 镜像为paddlepaddle/serving:0.7.0-cuda10.2-cudnn7-devel,并通过nvidia-docker挂载运行。若本机已具备等价环境可跳过 Docker 步骤。
5. 功能测试执行
5.1 数据与模型准备(prepare.sh)
MODE 参数serving_infer表示服务化部署测试模式,命令如下:
bash test_tipc/prepare.sh test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt serving_infer该命令完成三件事:解压lite_data.tar测试数据、下载并解压mobilenet_v3_small_infer.tar推理模型、unset https_proxy/unset http_proxy清除代理设置(代理可能导致 Serving 请求失败)。
5.2 运行测试主程序
测试方法如下:更换为自己的参数配置文件,即可完成对应模型的测试。
bash test_tipc/test_serving_infer_python.sh ${your_params_file} lite_train_lite_infer以mobilenet_v3_small的 Linux GPU/CPU Python 服务化部署测试为例:
bash test_tipc/test_serving_infer_python.sh test_tipc/configs/mobilenet_v3_small/serving_infer_python.txt serving_infer脚本第三个可选参数为 GPUID(CUDA 设备号),缺省时使用当前环境默认设备:
GPUID=$3 if [ ${#GPUID} -le 0 ];then env=" " else env="export CUDA_VISIBLE_DEVICES=${GPUID}" fi eval $env5.3 测试脚本源码级执行流程
test_serving_infer_python.sh 的核心逻辑封装在func_serving()函数中,完整流程如下:
① 静态图模型 → Serving 模型转换
python3.7 -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/转换日志写入python_trans_model_${model_name}.log,转换成功后本地生成serving_server(服务端实际加载)与serving_client(客户端配置)两个目录。
② 启动 Web 服务
脚本cd进入serving_dir(./deploy/serving_python),随后按配置循环处理 GPU/CPU 两个设备分支:
- GPU 分支(
use_gpu="0"):
python3.7 web_service.py --config=config.yml --opt op.imagenet.local_service_conf.devices=0 > python_server_gpu.log 2>&1- CPU 分支(
use_gpu=null,devices 置空):
python3.7 web_service.py --config=config.yml --opt op.imagenet.local_service_conf.devices='' > python_server_cpu.log 2>&1服务启动后sleep 5s等待就绪,再执行客户端请求。
③ 客户端请求
python3.7 pipeline_http_client.py --image_dir=../../lite_data/test/ > python_client_gpu.log 2>&1④ 状态检查与进程回收
每次命令执行后调用 common_func.sh 中的status_check(),依据退出码($last_status)判定成败并追加写入状态日志:
if [ $last_status -eq 0 ]; then echo "Run successfully with command - ${model_name} - ${run_command}!" | tee -a ${run_log} else echo "Run failed with command - ${model_name} - ${run_command}!" | tee -a ${run_log} fi测试完成后通过ps ux | grep -E 'web_service' | awk '{print $2}' | xargs kill -s 9回收服务进程,避免残留进程占用端口。
⑤ 日志归档
所有阶段日志统一写入./test_tipc/output/${model_name}/${MODE}/目录,汇总状态日志为serving_infer_python.log,其中包含各阶段命令与成功/失败标记,便于 CI 自动化回归结果采集。
6. 服务端与客户端实现原理
6.1 服务端:web_service.py
web_service.py 基于paddle_serving_server.web_service的WebService/Op基类实现 Pipeline 服务:
- MobileNetV3Op(Op 子类)定义了完整的预处理与后处理逻辑:
init_op:构建与训练推理一致的预处理流水线ResizeImage(256) → CenterCropImage(224) → NormalizeImage() → ToCHW(),实现见 preprocess_ops.py(短边缩放 256、中心裁剪 224、按 ImageNet 均值 [0.485,0.456,0.406] 与方差 [0.229,0.224,0.225] 归一化、HWC 转 CHW);preprocess:将客户端传入的 base64 图片解码为 RGB 图像,逐张预处理后np.concatenate拼接成 batch,以{"input": input_imgs}送入模型;postprocess:从模型输出softmax_1.tmp_0中取每张图的最大概率对应的class_id与prob并序列化返回。
- MobileNetV3Service(WebService 子类):
get_pipeline_response中创建MobileNetV3Op(name="imagenet", input_ops=[read_op]),op 名称imagenet必须与 config.yml 中op.imagenet节点严格一致,否则服务无法正确装配 DAG。 - ArgsParser:支持
-c/--config指定 yaml 配置与-o/--opt覆盖配置项,-o参数以点号路径定位深层字段(如op.imagenet.local_service_conf.devices),这正是测试脚本实现 CPU/GPU 切换的入口。
6.2 Pipeline 运行参数:config.yml
config.yml 控制服务端运行时行为,关键参数及含义如下:
| 参数 | 值 | 说明 |
|---|---|---|
| worker_num | 20 | 最大并发数;build_dag_each_worker=True时每个 worker 进程内构建 gRPC Server 与 DAG |
| http_port | 18093 | HTTP 端口,客户端请求地址据此拼接(http://127.0.0.1:18093/imagenet/prediction) |
| rpc_port | 9993 | gRPC 端口,http_port与rpc_port不允许同时为空 |
| dag.is_thread_op | False | op 资源类型:False 为进程模型,True 为线程模型 |
| op.imagenet.concurrency | 1 | op 并发数,与测试结论中 batchsize=1 对应 |
| op.imagenet.local_service_conf.model_config | ./serving_server | 服务端加载的 Serving 模型目录 |
| op.imagenet.local_service_conf.devices | "0" | 计算硬件 ID:""或不写为 CPU 预测;"0"/"0,1,2"为 GPU 预测,表示使用的 GPU 卡 |
| op.imagenet.local_service_conf.client_type | local_predictor | 客户端类型;local_predictor不启动独立 Serving 服务,在进程内直接预测 |
6.3 客户端:pipeline_http_client.py
pipeline_http_client.py 实现 HTTP 请求逻辑:
- 请求地址硬编码为
http://127.0.0.1:18093/imagenet/prediction,路径中的imagenet与 op 名称、18093与http_port一一对应; - 读取
--image_dir(默认../../images/demo.jpg,测试时由脚本替换为../../lite_data/test/)下的图片,经cv2_to_base64编码; - 构造 JSON 载荷
{"key": ["image"], "value": [base64], "logid": 10000}并以requests.post发送; - 逐张打印服务端返回的 JSON 结果,作为测试断言的人工/自动比对依据。
7. 预期输出与日志解读
执行成功后,终端输出如下(status_check的成功标记):
Run successfully with command - python3.7 pipeline_http_client.py > ../../log/mobilenet_v3_small/serving_infer/server_infer_gpu_batchsize_1.log 2>&1 !预测结果保存在服务端/客户端日志中,可以看到 Paddle Serving 的运行结果:
{'err_no': 0, 'err_msg': '', 'key': ['class_id', 'prob'], 'value': ['[8]', '[0.9091243743896484]'], 'tensors': []}err_no: 0表示请求处理成功、无错误;key/value对返回分类结果:class_id=[8](预测类别编号 8)、prob=[0.9091243743896484](置信度约 0.909),与基于 Paddle Inference 的本地推理结果一致,验证了服务化部署的正确性。
在当前仓库实现中,各阶段日志实际归档于./test_tipc/output/mobilenet_v3_small/serving_infer/目录(含python_trans_model_mobilenet_v3_small.log、python_server_gpu.log、python_client_gpu.log、python_server_cpu.log、python_client_cpu.log与汇总的serving_infer_python.log),可据此追溯每个环节的执行情况。
如果运行失败,终端会输出运行失败的日志信息以及对应的运行命令。可基于该命令在本地复现执行,从而定位失败原因(模型转换失败、服务未就绪、端口被占用或代理拦截等)。
8. 常见问题与排查
模型转换报错
AttributeError: 'Program' object has no attribute '_remove_training_info':通常是 PaddlePaddle 版本过低所致,将 paddle 更新到 2.2 版本即可解决(0.7.0 版 Paddle Serving 需搭配 PaddlePaddle 2.2+ 使用)。客户端访问服务不成功:很可能是本机设置了代理,用下面命令取消代理后再试:
unset http_proxy unset https_proxy服务启动失败或端口冲突:检查
config.yml中http_port(18093)与rpc_port(9993)是否被占用;同时确认model_config: "./serving_server"指向的目录确为第 5.3 节模型转换生成的serving_server输出。版本与环境不匹配:本项目 Serving 部署仅支持 Python 3.6/3.7/3.8,所有 pip 安装与脚本执行均需使用对应版本的 Python;建议在 Docker 容器(
paddlepaddle/serving:0.7.0-devel或paddlepaddle/serving:0.7.0-cuda10.2-cudnn7-devel)中部署,环境版本已预先对齐。
若在使用过程中遇到更多问题,可在 Paddle Serving 官方仓库提交 Issue 获取支持。
- 人工智能
- 深度学习
- 计算机视觉
- NLP
- 语音
【免费下载链接】models
Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
相关推荐
MobileNetV3 生产化 Step6:PaddlePaddle Linux GPU/CPU C++ 推理功能测试(TIPC)全流程指南
MobileNetV3 生产化 Step6:PaddlePaddle Linux GPU/CPU C++ 推理功能测试(TIPC)全流程指南 本文面向已完成 M
人工智能深度学习计算机视觉NLP语音Paddle Serving 服务化部署测试开发实战指南:Linux GPU/CPU 环境下的 TIPC 测试体系搭建
Paddle Serving 服务化部署测试开发实战指南:Linux GPU/CPU 环境下的 TIPC 测试体系搭建 本文是 PaddlePaddle 模型仓
人工智能深度学习计算机视觉NLP语音飞桨 Paddle Serving 服务化部署开发全流程指南:Linux GPU/CPU 下的功能开发与 TIPC 自动化测试
飞桨 Paddle Serving 服务化部署开发全流程指南:Linux GPU/CPU 下的功能开发与 TIPC 自动化测试 Paddle Serving 是
人工智能深度学习计算机视觉NLP语音
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考