ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于 Paddle Serving 的层次文本分类在线服务化部署实战指南

基于 Paddle Serving 的层次文本分类在线服务化部署实战指南 人工智能大模型预训练微调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项目中训练好的模型借助 Paddle Serving 搭建一套可对外提供在线服务的层次分类推理系统。读者将掌握从环境准备、静态图导出、Serving 模型转换、配置文件调优到 RPC / HTTP 客户端联调的完整实战流程并理解 service.py 内部的分词、推理与 sigmoid 阈值判定逻辑。部署方案概述与适用场景层次分类任务的数据样本具有多个标签且标签之间存在层级结构一级标签与二级标签用##连接如组织关系##裁员。训练完成之后若需要把模型以在线服务的形式对外提供预测能力推荐使用 Paddle Serving 完成服务化部署。它相对于 离线部署方案 的优势在于服务可以常驻运行通过 Pipeline 框架接收并发请求并以 RPC 或 HTTP 协议对外暴露接口便于接入上层业务系统。本方案位于仓库 slm/applications/text_classification/hierarchical/deploy/paddle_serving 目录下包含四个核心文件paddle_serving/ ├── config.yml # 层次分类任务启动服务端的配置文件 ├── rpc_client.py # 层次分类任务发送 pipeline 预测请求的脚本 ├── http_client.py # 层次分类任务发送 HTTP 预测请求的脚本 └── service.py # 层次分类任务启动服务端的脚本部署的整体链路为训练动态图模型 → 导出静态图模型export_model.py→ 转换为 Serving 格式paddle_serving_client.convert→ 编写/修改 config.yml 与 service.py → 启动服务 → 客户端发起预测请求。环境准备部署前需要同时准备 PaddleNLP 的运行环境和 Paddle Serving 的运行环境最低版本要求如下python 3.6paddlepaddle 2.3paddlenlp 2.4安装 PaddlePaddle环境中paddlepaddle-gpu或paddlepaddle版本应大于或等于 2.3请根据自身需求选择合适的 PaddlePaddle 下载命令完成安装。若使用 GPU 服务请确保驱动、CUDA 与 cuDNN 版本匹配文档中的 GPU server 安装示例覆盖 CUDA 10.1 / 10.2 / 11.2 等常见组合。安装 PaddleNLP安装 PaddleNLP 默认开启百度镜像源来加速下载如果您使用 HTTP 代理可以删去-i https://mirror.baidu.com/pypi/simplepython3 -m pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple安装 Paddle ServingServing 分两层安装client与app用于向服务发送请求server用于启动服务。先安装 client 和 serving apppip install paddle_serving_app paddle_serving_client再根据服务器设备选择安装 CPU server 或 GPU server安装 CPU serverpip install paddle_serving_server安装 GPU server注意选择与本地环境一致的命令# CUDA10.2 Cudnn7 TensorRT6 pip install paddle-serving-server-gpu0.8.3.post102 -i https://pypi.tuna.tsinghua.edu.cn/simple # CUDA10.1 TensorRT6 pip install paddle-serving-server-gpu0.8.3.post101 -i https://pypi.tuna.tsinghua.edu.cn/simple # CUDA11.2 TensorRT8 pip install paddle-serving-server-gpu0.8.3.post112 -i https://pypi.tuna.tsinghua.edu.cn/simpleNOTE默认开启国内清华镜像源来加速下载如果您使用 HTTP 代理可以关闭去掉-i https://pypi.tuna.tsinghua.edu.cn/simple。更多 wheel 包可参考 Serving 官方文档中的包列表依据你实际安装的 Serving 版本查阅对应文档。模型转换从静态图到 Serving 格式使用 Paddle Serving 做服务化部署时需要将保存的 inference 模型转换为 Serving 易于部署的模型。第一步导出静态图模型层次分类项目使用动态图训练训练结束后需要先将动态图参数导出为静态图参数。使用 静态图导出脚本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_model.py 的源码可以看出该脚本通过paddle.jit.to_static将AutoModelForSequenceClassification模型转换为静态图并指定了input_ids以及非多语言场景下的token_type_ids两个输入占位符paddle.static.InputSpec(shape[None, None], dtypeint64)最后保存为float32.pdmodel/float32.pdiparams等文件。这也是后续 Serving 转换的输入模型来源。第二步转换为 Serving 格式用已安装的paddle_serving_client将静态图参数模型转换成 serving 格式。其中--dirname为模型所在目录model_filename与params_filename根据实际导出的文件名填写python -m paddle_serving_client.convert --dirname ../../export --model_filename float32.pdmodel --params_filename float32.pdiparams可以通过命令查看各参数含义python -m paddle_serving_client.convert --help转换成功后的目录结构如下paddle_serving/ ├── serving_server │ ├── float32.pdiparams │ ├── float32.pdmodel │ ├── serving_server_conf.prototxt │ └── serving_server_conf.stream.prototxt └── serving_client ├── serving_client_conf.prototxt └── serving_client_conf.stream.prototxt其中serving_server供服务端启动使用serving_client_conf.prototxt中记录了 feed 输入名与 fetch 输出节点fetch_var的alias_name这些名字在下一步配置 config.yml 时会用到。部署模型启动服务端与客户端联调修改配置文件 config.yml目录中的 config.yml 文件逐项解释了每个参数的含义可以根据实际需要修改。常见修改项如下# 修改模型目录为下载的模型目录或自己的模型目录: model_config: serving_server model_config: erine-3.0-tiny/serving_server # 修改 rpc 端口号 rpc_port: 10231 rpc_port: 9998 # 修改使用 GPU 推理为使用 CPU 推理: device_type: 1 device_type: 0 # 开启 MKLDNN 加速 # use_mkldnn: False use_mkldnn: True # Fetch 结果列表以 serving_client/serving_client_conf.prototxt 中 fetch_var 的 alias_name 为准 fetch_list: [linear_147.tmp_1] fetch_list: [linear_75.tmp_1]结合仓库中 config.yml 的完整注释这里给出更完整的参数说明参数默认值含义rpc_port18090RPC 端口。rpc_port和http_port不允许同时为空当rpc_port为空且http_port不为空时会自动将rpc_port设置为http_port 1http_port9878HTTP 端口。当rpc_port可用且http_port为空时不自动生成http_portworker_num1最大并发数。当build_dag_each_workerTrue时框架会创建worker_num个进程每个进程内构建 gRPC Server 和 DAG为 False 时框架设置主线程 gRPC 线程池的max_workersworker_numbuild_dag_each_workerfalseFalse 表示进程内创建一条 DAGTrue 表示每个进程内创建多个独立 DAGdag.is_thread_opFalseop 资源类型True 为线程模型False 为进程模型dag.retry1重试次数dag.use_profilefalse是否使用性能分析生成 Timeline 性能数据对性能有一定影响op.seq_cls.concurrency1op 并发数。is_thread_opTrue时为线程并发否则为进程并发op.seq_cls.local_service_conf.client_typelocal_predictorclient 类型包括 brpc、grpc 和 local_predictor。local_predictor不启动独立 Serving 服务在进程内直接预测op.seq_cls.local_service_conf.model_configserving_server模型路径op.seq_cls.local_service_conf.fetch_list[linear_75.tmp_1]Fetch 结果列表以 client_config 中fetch_var的alias_name为准op.seq_cls.local_service_conf.device_type10cpu1gpu2tensorRT3arm cpu4kunlun xpuop.seq_cls.local_service_conf.devices0计算硬件 ID。为空或未写时为 CPU 预测为 0、0,1,2 时为 GPU 预测表示使用的 GPU 卡op.seq_cls.local_service_conf.use_mkldnnTrue是否开启 MKLDNN 加速op.seq_cls.local_service_conf.thread_num12线程数op.seq_cls.local_service_conf.ir_optimTrue是否开启 IR 优化op.seq_cls.local_service_conf.min_subgraph_size10注释状态开启 TensorRT 后进行优化的子图包含的最少节点数启动服务修改好配置文件后执行下面命令启动服务python service.py --max_seq_length 128 --model_name ernie-3.0-medium-zhservice.py 可支持配置的参数max_seq_length分词器 tokenizer 使用的最大序列长度ERNIE 模型最大不能超过 2048。请根据文本长度选择通常推荐 128、256 或 512若出现显存不足请适当调低这一参数默认为 128。model_name选择预训练模型可选 ernie-1.0-large-zh-cw、ernie-3.0-xbase-zh、ernie-3.0-base-zh、ernie-3.0-medium-zh、ernie-3.0-micro-zh、ernie-3.0-mini-zh、ernie-3.0-nano-zh、ernie-2.0-base-en、ernie-2.0-large-en、ernie-m-base、ernie-m-large默认为 ernie-3.0-medium-zh根据实际使用的预训练模型选择。服务启动后的输出大致如下[DAG] Succ init [PipelineServicer] succ init ...... --- Running analysis [ir_graph_to_program_pass] I0727 06:50:34.988327 43126 analysis_predictor.cc:1007] optimize end I0727 06:50:34.992336 43126 naive_executor.cc:102] --- skip [feed], feed - token_type_ids I0727 06:50:34.992357 43126 naive_executor.cc:102] --- skip [feed], feed - input_ids I0727 06:50:34.993671 43126 naive_executor.cc:102] --- skip [linear_75.tmp_1], fetch - fetch [2022-07-27 06:50:35,954] [ INFO] - We are using class paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer to load ernie-3.0-medium-zh. [2022-07-27 06:50:35,954] [ INFO] - Already cached /root/.paddlenlp/models/ernie-3.0-medium-zh/ernie_3.0_medium_zh_vocab.txt [OP Object] init success深入理解 service.py 的服务逻辑从 service.py 源码可以看到服务端是如何将请求与模型输出衔接起来的Fetch 节点映射FETCH_NAME_MAP不同预训练模型导出的静态图其输出线性层节点名不同。脚本内置了一张映射表例如ernie-3.0-medium-zh对应linear_75.tmp_1、ernie-3.0-base-zh对应linear_147.tmp_1。因此--model_name必须与实际使用的预训练模型一致否则 fetch 节点名对不上会导致请求失败。也可以通过查看serving_server下serving_server_conf.prototxt中的输出节点名确认。preprocess通过AutoTokenizer.from_pretrained(args.model_name, use_fastTrue)加载分词器对请求中的sentence字段进行编码按max_seq_length截断、padding并生成 int64 类型的input_ids/token_type_ids数组。postprocess对模型输出先做 sigmoid 变换1 / (1 np.exp(-result))再以0.5 为阈值判定每个标签是否命中命中的标签索引以逗号拼接返回。这正是多标签含层次标签分类与单标签 softmax 分类在推理后处理上的本质区别。Service 组装Service继承WebService在get_pipeline_response中注册名为seq_cls的 Op最后读取config.yml并启动服务。启动 RPC client 测试执行客户端请求时注意关闭代理并根据实际情况修改server_url地址启动服务所在的机器。在 rpc_client.py 中默认连接127.0.0.1:18090python rpc_client.py输出打印如下text: 消失的“外企光环”5月份在华裁员900余人香饽饽变“臭”了 label: 组织关系,组织关系##裁员 -------------------- text: 卡车超载致使跨桥侧翻没那么简单 label: 灾害/意外,灾害/意外##坍/垮塌 -------------------- text: 金属卡扣安装不到位上海乐扣乐扣贸易有限公司将召回捣碎器1162件 label: 产品行为,产品行为##召回 --------------------从 rpc_client.py 源码可以看出客户端通过PipelineClient连接服务将文本以sentence字段提交预测服务端返回的是标签索引的逗号串客户端再借助一份与训练时label.txt完全一致的label_list将索引还原为可读的层次标签文本如组织关系##裁员。因此如果你更换了训练数据集的标签集合务必同步更新客户端脚本中的label_list。启动 HTTP client 测试同样注意关闭代理并修改server_url。在 http_client.py 中默认请求http://127.0.0.1:9878/seq_cls/predictionpython http_client.py输出打印如下text: 消失的“外企光环”5月份在华裁员900余人香饽饽变“臭”了 label: 组织关系,组织关系##裁员 -------------------- text: 卡车超载致使跨桥侧翻没那么简单 label: 灾害/意外,灾害/意外##坍/垮塌 -------------------- text: 金属卡扣安装不到位上海乐扣乐扣贸易有限公司将召回捣碎器1162件 label: 产品行为,产品行为##召回 --------------------从 http_client.py 源码可以看到HTTP 客户端把文本封装为{key: [sentence], value: [sentence]}的 JSON 通过requests.post提交服务端返回的同样是标签索引串客户端再用label_list完成索引到层次标签的映射。常见问题与调优建议fetch 节点名不匹配更换预训练模型后若请求报错或返回空结果请核对--model_name与config.yml中fetch_list是否与 service.py 的FETCH_NAME_MAP对应例如ernie-3.0-medium-zh使用linear_75.tmp_1。CPU / GPU 切换通过config.yml中device_type0cpu、1gpu与devicesGPU 卡号控制CPU 场景建议开启use_mkldnn: True并适当调大thread_num。标签集合变化层次分类的标签列表如组织关系##裁员由训练数据决定部署时客户端脚本中的label_list必须与训练时的label.txt保持一致否则索引映射会错位。显存不足适当调低max_seq_length或减小请求批次也可考虑使用更轻量的 ERNIE 3.0 系列模型如 micro、nano或对模型做裁剪压缩后再部署。性能评估参考在主目录 层次分类 README 的“模型效果”一节中给出了 ERNIE 3.0 系列各尺寸模型在同一数据集2020 语言与智能技术竞赛事件抽取多标签层次数据集、Tesla V100-SXM2-32GB、batch size 32上的 Micro/Macro F1 与 latency 数据可作为选择部署模型的参考若要进一步压缩模型体积以降低推理开销可参考 模型裁剪 一节使用prune.py裁剪后导出再部署。更多部署方案层次分类项目在 deploy 目录 下还提供了多种部署形态可供选择基于 ONNXRuntime 的离线部署方案适合批量离线推理支持 GPU FP16 与 CPU INT8 量化加速。基于 Triton 的在线服务化部署方案适合对多模型管理、动态批处理有更高要求的场景。基于 PaddleNLP SimpleServing 的轻量部署方案无需额外安装 Serving 组件几行代码即可启动在线服务。本文所述 Paddle Serving 方案则更适合需要完整 Pipeline 调度DAG 编排、并发控制、性能分析的生产级在线服务场景可直接基于 部署目录 中的config.yml、service.py、rpc_client.py与http_client.py修改后投入使用。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐Python Gmail标签管理完全指南打造个人化邮件组织系统Python Gmail标签管理完全指南打造个人化邮件组织系统 想要高效管理海量邮件吗Python Gmail标签管理工具为您提供终极解决方案 在这个人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleDetection 模型 Python Serving 服务化部署实战基于 Paddle Serving Pipeline 框架的完整部署指南PaddleDetection 模型 Python Serving 服务化部署实战基于 Paddle Serving Pipeline 框架的完整部署指南 导人工智能深度学习计算机视觉PaddleDetection C Serving 预测部署实战基于 Paddle Serving 的高性能服务化推理PaddleDetection C Serving 预测部署实战基于 Paddle Serving 的高性能服务化推理 Paddle Serving 是飞人工智能深度学习计算机视觉上一篇8086tiny 开源项目使用教程下一篇Universal Extractor 2 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表