news 2026/10/9 7:00:05

MobileNetV3 生产实践 Step6:Linux GPU/CPU Python 服务化部署(Paddle Serving)TIPC 自动化测试指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MobileNetV3 生产实践 Step6:Linux GPU/CPU Python 服务化部署(Paddle Serving)TIPC 自动化测试指南
  • 人工智能
  • 深度学习
  • 计算机视觉
  • NLP
  • 语音

【免费下载链接】models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.

项目地址:https://gitcode.com/gh_mirrors/mo/models
点击查看免费下载

本指南聚焦于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_CPUdevice_GPUbatchsize
MobileNetV3mobilenet_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_namemobilenet_v3_small被测模型名,决定日志目录与状态日志命名
第 3 行pythonpython3.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_filenameinference.pdmodel模型结构文件
第 7 行--params_filenameinference.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_serviceweb_service.py --config=config.yml服务端启动命令(Python Pipeline Web 服务)
第 12 行--optop.imagenet.local_service_conf.devices:"0"|null计算设备开关:"0"表示 GPU(第 0 号卡),null表示 CPU,脚本据此循环执行两轮测试
第 13 行piplinepipeline_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 $env

5.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_num20最大并发数;build_dag_each_worker=True时每个 worker 进程内构建 gRPC Server 与 DAG
http_port18093HTTP 端口,客户端请求地址据此拼接(http://127.0.0.1:18093/imagenet/prediction)
rpc_port9993gRPC 端口,http_port与rpc_port不允许同时为空
dag.is_thread_opFalseop 资源类型:False 为进程模型,True 为线程模型
op.imagenet.concurrency1op 并发数,与测试结论中 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_typelocal_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. 常见问题与排查

  1. 模型转换报错AttributeError: 'Program' object has no attribute '_remove_training_info':通常是 PaddlePaddle 版本过低所致,将 paddle 更新到 2.2 版本即可解决(0.7.0 版 Paddle Serving 需搭配 PaddlePaddle 2.2+ 使用)。

  2. 客户端访问服务不成功:很可能是本机设置了代理,用下面命令取消代理后再试:

unset http_proxy unset https_proxy
  1. 服务启动失败或端口冲突:检查config.yml中http_port(18093)与rpc_port(9993)是否被占用;同时确认model_config: "./serving_server"指向的目录确为第 5.3 节模型转换生成的serving_server输出。

  2. 版本与环境不匹配:本项目 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.

项目地址:https://gitcode.com/gh_mirrors/mo/models
点击查看免费下载

相关推荐

上一篇:shadcn-vue 组件注册表 FAQ 实战指南:复杂组件结构、自定义 Tailwind 颜色与动画配置
下一篇:Android形状加载动画性能测试报告:内存占用与CPU使用率深度分析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 6:59:54

AI智能体实战:从大模型问答到自动化干活的核心指南

很多人已经用AI大模型写文章、写代码、做翻译,但大多数人的使用方式还停留在"打开对话框,问一句,等答案"的阶段。我见过太多人抱怨"AI也就那样,回答看着挺像回事,但最后活还得自己干"。如果你也有…

作者头像 李华
网站建设 2026/10/9 6:59:18

谷歌下架免费Gemini API,开发者如何应对模型迁移

这几天应该有不少人和我一样,打开 Google AI Studio 或者翻到 Gemini API 的文档页,发现之前一直"白嫖"得很舒服的免费模型突然不见了。谷歌这次的动作比以往都大,不是悄悄把某个旧模型下架,也不是简单把限流调低&#…

作者头像 李华
网站建设 2026/10/9 6:58:37

故障排查伪原因:8个认知陷阱与一套根因分析闭环

1. 为什么原因分析这么容易翻车:先认清我们的认知坑前阵子我们服务一台数据库服务器,监控连续三天报磁盘空间不足,一看使用率已经96%。团队第一反应非常一致:清日志、扩磁盘、删备份。结果折腾了两小时,空间只降了三个…

作者头像 李华
网站建设 2026/10/9 6:56:40

共聚焦与激光共聚焦:空间滤波定乾坤,选购前必读

先问大家一个问题:你在采购单上写“共聚焦显微镜”,和写“激光共聚焦显微镜”,拿到的机器真的有区别吗?我在实验室这几年,经常遇到课题组成员把这两个词混着用,合同上也经常出现“激光共聚焦显微镜”这种叫…

作者头像 李华
网站建设 2026/10/9 6:54:37

ABAQUS轨道仿真扣件非线性刚度脚本批量建模与收敛调试

做轨道仿真的人,迟早都会碰到一个绕不开的问题:扣件刚度到底取多少?我见过不少项目的做法是:要么在设计图纸上抄一个常数,要么查规范取一个范围值,然后整个线路所有扣件全用同一个线性弹簧。结果算完轮轨力…

作者头像 李华
网站建设 2026/10/9 6:54:36

Agent-Reach:AI Agent 与外部工具连接框架的设计与实操

1. 项目缘起与核心定位Agent-Reach 这个名字第一次出现在我视野里的时候,我正被一堆零散的 AI Agent 脚本搞得焦头烂额。手头有五六个不同场景的小助手,有的负责抓取信息,有的负责整理文档,有的负责定时提醒,每个都是独…

作者头像 李华