基于 PaddleNLP SimpleServing 的层次文本分类服务化部署实践
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文以 PaddleNLP 层次文本分类Hierarchical Text Classification应用为例详细介绍如何借助 PaddleNLP SimpleServing 能力将训练好的 ERNIE 系列模型封装为可对外提供 HTTP 服务的在线推理服务。读完本文你将掌握从环境准备、Server 脚本编写、服务启动、客户端调用到max_seq_len/batch_size/prob_limit等关键推理参数调优的完整实战链路并理解 SimpleServer 注册机制、模型 Handler 与后处理 Handler 的底层实现原理能够独立把本地模型一键升级为可复用的 RESTful 分类服务。1. 方案背景层次分类模型如何走向在线服务层次文本分类任务要求模型从存在层级结构的标签集合如一级标签##二级标签中预测出输入文本对应的一个或多个细粒度标签。在 层次分类指南 中完整的应用链路是数据准备 → 模型训练 → 模型评估与优化 → 静态图导出 → 离线/在线部署。其中在线服务化部署正是本篇文章围绕的deploy/simple_serving模块。在进入服务化部署之前需要先完成模型的静态图导出。层次分类应用使用 export_model.py 将训练好的动态图参数转换为推理可用的静态图模型python export_model.py --params_path ./checkpoint/ --output_path ./export如果使用多语言模型 ERNIE-M 作为预训练模型则追加--multilingual参数python export_model.py --params_path ./checkpoint/ --output_path ./export --multilingual导出成功后./export目录下会生成float32.pdmodel、float32.pdiparams、float32.pdiparams.info三个文件它们是后续 SimpleServing 部署时model_path指向的目标server.py 中配置的model_path../../export正是相对本模块所在目录定位到该导出目录。2. 环境准备安装带 SimpleServing 能力的 PaddleNLPSimpleServing 是随 PaddleNLP 分发的一项能力需要安装包含该功能的 PaddleNLP 版本。官方推荐直接升级到最新版本pip install paddlenlp --upgrade同时为保证训练、导出与服务化部署链路完整可用建议参考层次分类应用的运行环境要求python 3.6、paddlepaddle 2.3、paddlenlp 2.4.8、scikit-learn 1.0.2。若网络环境访问 PyPI 较慢可以使用百度镜像源python3 -m pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple安装完成后可先确认paddlenlp命令可用——服务启动所依赖的paddlenlp serverCLI 即由该命令提供。3. Server 服务启动3.1 编写 Server 脚本注册层次分类模型deploy/simple_serving目录下提供两种 Server 脚本差别仅在于所服务的模型类型通用分类模型 ServerERNIE 3.0 系列见 server.pyfrom paddlenlp import SimpleServer from paddlenlp.server import CustomModelHandler, MultiLabelClassificationPostHandler app SimpleServer() app.register( models/cls_hierarchical, model_path../../export, tokenizer_nameernie-3.0-medium-zh, model_handlerCustomModelHandler, post_handlerMultiLabelClassificationPostHandler, )ERNIE-M 多语言模型 Server见 ernie_m_server.pyfrom paddlenlp import SimpleServer from paddlenlp.server import ERNIEMHandler, MultiLabelClassificationPostHandler app SimpleServer() app.register( models/cls_hierarchical, model_path../../export, tokenizer_nameernie-m-base, model_handlerERNIEMHandler, post_handlerMultiLabelClassificationPostHandler, )两者的关键差异有两点tokenizer_name不同ERNIE 3.0 中文模型使用ernie-3.0-medium-zh训练时也可以换成ernie-3.0-base-zh、ernie-3.0-mini-zh等其他规格ERNIE-M 使用ernie-m-basemodel_handler不同ERNIE 3.0 走CustomModelHandler其推理输入为input_ids token_type_idsERNIE-M 走ERNIEMHandler其输入仅为input_ids详见 custom_model_handler.py 中两个 Handler 的差异。从源码层面看app SimpleServer()创建的是继承自FastAPI的服务对象见 paddlenlp/server/server.py而app.register(...)则完成两件事见 server.py以task_name如models/cls_hierarchical和model_path、tokenizer_name、model_handler、post_handler、precision、device_id等参数构造一个ModelManager负责模型的加载、tokenizer 初始化和预测器管理通过HttpRouterManager.register_models_router(task_name)将该路由注册到 FastAPI 路由表使http://host:port/models/cls_hierarchical成为可对外访问的 HTTP 端点。因此注册时给出的第一个参数models/cls_hierarchical实际上就是 URL 路径的一部分客户端调用 URL 必须与之保持一致。此外register还支持precision默认fp32与device_id默认0两个可选参数可用于指定推理精度和使用的设备。3.2 启动分类 Server 服务在simple_serving目录下执行默认分类模型paddlenlp server server:app --host 0.0.0.0 --port 8189如果是 ERNIE-M 模型则启动paddlenlp server ernie_m_server:app --host 0.0.0.0 --port 8189命令解析server:app表示从server.py文件中加载名为app的 FastAPI 应用实例--host 0.0.0.0表示监听所有网卡地址便于局域网或远程客户端访问--port 8189指定服务端口。该命令底层由 PaddleNLP 的 CLI 实现见 paddlenlp/cli/main.pypaddlenlp server还支持以下可选项参数默认值说明--host127.0.0.1服务绑定的主机地址跨主机调用需设为0.0.0.0--port8000服务监听端口--app_dir当前工作目录应用app 脚本所在目录路径--workers$WEB_CONCURRENCY或 1worker 进程数与--reload不兼容--log_levelinfo日志级别--limit-concurrency无最大并发连接数--limit-max-requests无进程终止前可服务的最大请求数--timeout-keep-alive15Keep-Alive 连接空闲超时秒--reloadFalseapp 脚本变更时自动重载服务启动成功后日志会提示 uvicorn 已在指定 host:port 上运行接下来即可通过 HTTP 客户端调用推理接口。3.3 分类任务发送服务客户端调用服务启动后在另一个终端执行客户端脚本python client.pyclient.py 的实现非常简洁核心逻辑分三步构造请求体以 JSON 形式同时携带data待预测文本和parameters推理参数通过requests.post发送到http://0.0.0.0:8189/models/cls_hierarchical设置请求头headers {Content-Type: application/json}打印响应print(r.text)输出服务端返回的 JSON 字符串。客户端内置的示例文本为医疗问诊类短文本如请问木竭胶囊能同高血压药、氨糖同时服吗服务端会返回每个文本的预测标签列表及对应的置信度。值得注意的是URL 中的models/cls_hierarchical必须与 Server 脚本app.register(...)的第一个参数完全一致否则会返回 404。4. 其他参数设置max_seq_len / batch_size / prob_limit在 client 端可以通过请求体中的parameters字段设置三个推理参数data { data: { text: texts, }, parameters: { max_seq_len: args.max_seq_len, batch_size: args.batch_size, prob_limit: args.prob_limit } }在 client.py 中这三个参数通过命令行解析默认值分别为parser.add_argument(--max_seq_len, default128, typeint, helpThe maximum total input sequence length after tokenization.) parser.add_argument(--batch_size, default1, typeint, helpBatch size per GPU/CPU for predicting.) parser.add_argument(--prob_limit, default0.5, typefloat, helpThe limitation of probability for the label.)也就是说默认运行时每个文本的 token 长度不超过 128、每批预测 1 条、标签置信度阈值 0.5。实际使用时可这样覆盖默认值python client.py --max_seq_len 256 --batch_size 8 --prob_limit 0.6三个参数的语义与底层作用如下max_seq_len默认 128tokenizer 截断/补齐的最大序列长度。在 custom_model_handler.py 中CustomModelHandler.process读取parameters[max_seq_len]并传入tokenizer(text..., max_lengthmax_seq_len)ERNIEMHandler同样如此。该参数与训练时的max_seq_length保持一致效果最佳若文本较长且显存充足可调大反之调小。batch_size默认 1服务端将输入文本按该大小切分成多个 batch 依次送入预测器。从源码可见文本会被batches [examples[i : i batch_size] for i in range(0, len(examples), batch_size)]切分后逐个 batch 推理最后再合并结果因此增大batch_size有助于提升吞吐。prob_limit默认 0.5层次分类属于多标签任务一个文本可能命中多个标签。该阈值决定哪些标签被保留输出。在 cls_post_handler.py 的MultiLabelClassificationPostHandler.process中logits 先经过 sigmoid 映射到(0,1)区间再筛选p prob_limit的标签及其置信度输出。调低阈值会输出更多候选标签调高则只保留高置信标签。从更完整的视角看上述三个参数分别作用于推理链路的三个环节max_seq_len影响 tokenizer 预处理、batch_size影响批处理调度、prob_limit影响后处理阈值判定三者由服务端的parameters透传给对应的 Handler 消费。5. 源码视角服务化推理的完整调用链结合 paddlenlp/server 目录下的实现一个请求的完整处理流程可以拆解为路由分发客户端 POST 到/models/cls_hierarchicalHttpRouterManager依据注册的路由将请求派发到对应的模型服务模型预处理CustomModelHandler.process(predictor, tokenizer, data, parameters)或ERNIEMHandler先检查parameters中的max_seq_len与batch_size再调用 tokenizer 将文本转成input_ids以及 ERNIE 3.0 所需的token_type_ids按batch_size切分批次并做 padding推理执行底层根据predictor._predictor_type分支执行——若为paddle_inference则通过_input_handles拷贝输入并调用_predictor.run()再从_output_handles取回 logits否则调用 Paddle 动态图_predictor.run(None, {...})。多个输出会按results[i]累积后np.concatenate合并最终以{logits: ..., data: data}形式返回custom_model_handler.py后处理MultiLabelClassificationPostHandler.process(data, parameters)从结果中取出logits先做 sigmoid 归一化再以prob_limit过滤标签输出{label: [...], confidence: [...]}cls_post_handler.py。Handler 的统一抽象定义在 base_handler.py 中BaseModelHandler与BasePostHandler均以classmethodabstractmethod约定process方法签名这也意味着开发者完全可以通过自定义 Handler 把 SimpleServing 扩展到其他类型的模型和任务。6. 部署形态对照与延伸层次分类应用在deploy目录下还提供了其他部署方案可依据场景选型离线部署基于 ONNXRuntime 的 predictor 离线方案适合在脚本中直接加载./export静态图模型批量预测无需起 HTTP 服务Paddle Serving 在线方案paddle_serving 目录 提供基于 config 配置的服务化部署Triton 在线方案triton_serving 目录 将 tokenizer、模型推理、后处理拆分为独立的 Triton 模型组件适合对性能与弹性有更高要求的场景。相比之下SimpleServing 方案的优势在于无需额外编写服务框架代码只需一个app对象加一次register即可完成模型注册与路由暴露是训练 → 导出 → 上线最短路径的在线部署方式。7. 常见问题与注意事项404 错误客户端 URL 中的路径必须与app.register的第一个参数如models/cls_hierarchical严格一致。模型未导出导致加载失败model_path../../export指向的是静态图导出目录务必先执行 export_model.py 生成float32.pdmodel等文件再启动服务。Host 设置仅本机调试可保持默认127.0.0.1若需局域网或跨机调用启动时必须显式指定--host 0.0.0.0。多标签阈值调节层次分类输出往往希望覆盖更全的细粒度标签可适当调低prob_limit如 0.3反之若误报偏多则调高阈值。性能权衡batch_size增大可提升吞吐但会占用更多显存max_seq_len过长同样增加显存开销需结合模型规格如 ERNIE 3.0 Medium与硬件情况综合设置。结语借助 PaddleNLP SimpleServing层次文本分类模型可以在几分钟内从本地静态图模型升级为标准 HTTP 推理服务编写 Server 脚本完成注册、paddlenlp server一键启动、客户端以 JSON 提交文本与参数即可获得带置信度的多标签预测结果。配合max_seq_len、batch_size、prob_limit三个关键参数的灵活调节开发者可以针对不同的线上数据分布与硬件条件快速完成推理服务的调优与上线。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐基于 PaddleNLP SimpleServing 的多标签文本分类服务化部署实战指南基于 PaddleNLP SimpleServing 的多标签文本分类服务化部署实战指南 多标签文本分类模型如基于 ERNIE 3.0 / ERNIE M 微人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP基于 PaddleNLP SimpleServing 的多分类模型服务化部署实战基于 PaddleNLP SimpleServing 的多分类模型服务化部署实战 本文以 PaddleNLP 文本多分类应用中的 simple_serving人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP SimpleServing 服务化部署实战基于 UIE-X 的文档信息抽取 HTTP 服务搭建指南PaddleNLP SimpleServing 服务化部署实战基于 UIE X 的文档信息抽取 HTTP 服务搭建指南 本文面向需要在生产环境中上线 UIE人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇TradingAgents-CN实战部署从零构建智能投资分析平台下一篇如何在Windows 7系统上快速安装最新Python版本完整配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考