ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PaddleNLP SimpleServing 服务化部署实践:ERNIE 3.0 中文文本分类、实体识别与问答服务搭建

PaddleNLP SimpleServing 服务化部署实践:ERNIE 3.0 中文文本分类、实体识别与问答服务搭建 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文基于 PaddleNLP 开源仓库中 ERNIE 3.0 轻量级模型 的simple_serving部署目录系统讲解如何使用 PaddleNLP 内置的SimpleServing组件将微调并导出后的 ERNIE 3.0 模型快速发布为 HTTP 推理服务。读者将掌握如何编写服务端注册脚本与客户端请求脚本如何分别部署文本分类Sequence Classification、命名实体识别Token Classification与机器阅读理解MRC/QA三类典型中文 NLP 任务以及如何通过max_seq_len、batch_size、doc_stride等参数控制推理行为。文中所有命令与配置均可在仓库目录 slm/model_zoo/ernie-3.0/deploy/simple_serving 中直接复现。一、SimpleServing 是什么SimpleServing 是 PaddleNLP 提供的一套轻量级服务化部署方案用于将训练/压缩后的模型快速封装为基于 HTTP 的在线推理服务。在 ERNIE 3.0 的部署体系中它位于 deploy 目录 的simple_serving子目录与 FastDeploy Python 部署deploy/python、Triton Serving 部署deploy/serving并列对应 ERNIE 3.0 主 README 中的服务化部署章节。其核心组件是paddlenlp.server.SimpleServer。从源码看它直接继承自fastapi.FastAPI见 paddlenlp/server/server.py因此天然具备 FastAPI/Uvicorn 的异步 Web 能力同时通过register()方法把模型推理注册为一个 POST 路由。开发者只需提供一个模型目录与若干 Handler 类即可零门槛对外提供预测服务。SimpleServing 的服务端通常由三层组件协作完成一次预测可对照 model_manager.py 的predict调用链Model Handler模型处理器负责接收原始文本请求调用 Tokenizer 完成编码、调用底层推理引擎执行模型前向输出logits等原始结果Post Handler后处理处理器负责将原始logits翻译成对人类友好的结果例如分类任务的label与confidence、NER 任务的实体pos/entity/label、QA 任务的answerModelManager模型管理器负责在服务启动时创建推理引擎Predictor、加载AutoTokenizer并串起上述两个 Handler 的调用。三者均以Handler 抽象基类base_handler.py为规范BaseModelHandler.process(predictor, tokenizer, data, parameters)与BasePostHandler.process(data, parameters)是两个必须实现的类方法签名这也是我们自定义后处理逻辑的扩展点。二、环境准备SimpleServing 依赖 PaddleNLP 内置的SimpleServer与paddlenlp serverCLI 命令因此请使用带 SimpleServing 功能的 PaddleNLP 版本对应 ERNIE 3.0 README 的环境要求python 3.7、paddlepaddle 2.3、paddlenlp 2.4并通过pip安装paddlenlp本体及requests客户端脚本使用。注意paddlenlp server命令是由 CLI 入口实现的见 paddlenlp/cli/main.py其底层调用 Uvicorn 启动 FastAPI 应用。因此无论本机是否安装 GPU 版 Paddle均可在 CPU 环境完成服务化部署验证如需 GPU 推理请安装对应版本的 paddlepaddle-gpu。此外服务化部署的对象是已导出export的静态图推理模型。在 ERNIE 3.0 主目录 中完成微调后模型会导出到best_models/任务/export/目录下。simple_serving 中的服务端脚本默认引用如下三个导出目录分类任务../../best_models/afqmc/export/命名实体识别../../best_models/msra_ner/export/阅读理解../../best_models/cmrc2018/export/三、启动服务前的目录约定与工作目录paddlenlp server在解析服务脚本时默认将**当前工作目录os.getcwd()**作为应用目录见 paddlenlp/cli/main.py因此推荐在simple_serving目录下执行启动命令保证脚本中的相对路径../../best_models/...能正确解析到slm/model_zoo/ernie-3.0/best_models/...。若在其他目录启动需通过--app_dir参数显式指定应用目录。四、文本分类Sequence Classification任务部署4.1 启动文本分类 Server 服务在 simple_serving 目录 下执行paddlenlp server server_seq_cls:app --host 0.0.0.0 --port 8189该命令将server_seq_cls.py中的app对象发布为一个 Web 服务。server_seq_cls.py的核心注册逻辑见 server_seq_cls.py如下from paddlenlp import SimpleServer from paddlenlp.server import CustomModelHandler, MultiClassificationPostHandler app SimpleServer() app.register( models/ernie_cls, # 路由名/models/ernie_cls model_path../../best_models/afqmc/export/, # 导出模型目录 tokenizer_nameernie-3.0-medium-zh, # 分词器名称 model_handlerCustomModelHandler, # 模型处理器 post_handlerMultiClassificationPostHandler, # 后处理处理器 )各注册参数含义如下参数说明task_name第一个位置参数服务路由名注册后生成POST /models/ernie_cls端点路由机制见 http_router/router.pymodel_path导出的静态图模型目录含 inference model 文件tokenizer_name分词器预训练名服务端通过AutoTokenizer.from_pretrained加载见 model_manager.pymodel_handler模型前向处理器此处选用CustomModelHandlercustom_model_handler.py支持text与text_pair双文本输入post_handler结果后处理器MultiClassificationPostHandlercls_post_handler.py对logits做 softmax输出label与confidence4.2 分类任务发送服务另开一个终端执行python client_seq_cls.py --dataset afqmcclient_seq_cls.py见 client_seq_cls.py的工作流程是通过paddlenlp.datasets.load_dataset(clue, args.dataset)加载 CLUE 基准的指定数据集如afqmc的验证集前 10 条样本通过seq_convert_example将不同 CLUE 数据集的样本统一转换为sentence1/sentence2针对含keyword的 CSL 数据集与含target的 WSC 数据集做了特化处理构造 JSON 请求体发送到POST http://0.0.0.0:8189/models/ernie_cls。请求体结构如下该结构同样适用于 NER 与 QA 客户端仅data字段不同{ data: { text: [样本文本1, 样本文本2], text_pair: [配对文本1, 配对文本2] }, parameters: { max_seq_len: 128, batch_size: 1 } }五、命名实体识别Token Classification任务部署5.1 启动命名实体识别 Server 服务paddlenlp server server_token_cls:app --host 0.0.0.0 --port 8189server_token_cls.py见 server_token_cls.py注册逻辑为app SimpleServer() app.register( models/ernie_ner, model_path../../best_models/msra_ner/export/, tokenizer_nameernie-3.0-medium-zh, model_handlerTokenClsModelHandler, post_handlerNERPostHandler, )与分类任务不同这里使用了TokenClsModelHandlertoken_model_handler.py面向序列标注任务的模型处理器对输入文本逐 token 输出标签logits自定义NERPostHandler该示例没有直接使用框架内置后处理而是在脚本内自定义了NERPostHandler(BasePostHandler)内置 BIO 标签体系[B-PER, I-PER, B-ORG, I-ORG, B-LOC, I-LOC, O]对logits做argmax得到每个 token 的标签后进一步按B-/I-/O规则拼接出连续实体并返回每个实体的起止位置pos、实体文本entity与类别label。这一示例展示了 SimpleServing 的自定义后处理扩展能力——只需继承BasePostHandler并实现process(cls, data, parameters)类方法。5.2 命名实体识别 Client 发送服务python client_token_cls.pyclient_token_cls.py见 client_token_cls.py内置了两条中文测试样本texts [ 北京的涮肉重庆的火锅成都的小吃都是极具特色的美食。, 乔丹、科比、詹姆斯和姚明都是篮球界的标志性人物。, ]请求发送至http://0.0.0.0:8189/models/ernie_ner响应中将返回value实体列表与tokens_label逐 token 标签。运行后应能看到类似北京→LOC、重庆→LOC、成都→LOC以及乔丹/科比/詹姆斯/姚明→PER的抽取结果。六、问答MRC任务部署6.1 启动问答 Server 服务paddlenlp server server_qa:app --host 0.0.0.0 --port 8189server_qa.py见 server_qa.py注册逻辑为app SimpleServer() app.register( models/ernie_qa, model_path../../best_models/cmrc2018/export/, tokenizer_nameernie-3.0-medium-zh, model_handlerQAModelHandler, post_handlerQAPostHandler, )问答任务与分类、NER 的关键差异在于输入是context篇章 question问题的二元组且模型输出是start_logits end_logits两个头。对应源码QAModelHandlerqa_model_handler.py调用 Tokenizer 时传入stridedoc_stride、return_offsets_mappingTrue、pad_to_max_seq_lenTrue得到input_ids、token_type_ids与offset_mapping模型前向输出保存在logits起始位置与logits_1终止位置中自定义QAPostHandler对每个样本分别取start_logits与end_logits的argmax得到起止 token 下标再借助offset_mapping将 token 下标映射回原文的字符区间[start_id, end_id)最终返回{context: ..., question: ..., answer: ...}。其中end_position start_position的判断保证了只返回合法的起始早于终止区间。6.2 问答 Client 发送服务python client_qa.pyclient_qa.py见 client_qa.py携带了一段《战国无双3》的篇章作为 context并针对该篇章提出两个问题例如《战国无双3》是由哪两个公司合作开发的请求发送至http://0.0.0.0:8189/models/ernie_qa。由于篇章较长该脚本将max_seq_len的默认值提高到512并通过doc_stride128让模型在长文本上滑动窗口确保答案区间能被完整覆盖。七、其他参数设置max_seq_len、batch_size 与 doc_stride原文档指出可以在 client 端设置max_seq_len与batch_size参数其请求体结构为data { data: { text: texts, text_pair: text_pairs if len(text_pairs) 0 else None }, parameters: { max_seq_len: args.max_seq_len, batch_size: args.batch_size } }这些参数并非客户端本地生效而是随 JSON 请求体传入服务端由对应 Handler 解析后实际控制 tokenizer 截断长度与分批推理粒度。结合仓库源码各参数的作用与默认值如下参数默认值作用max_seq_len128QA 客户端为 512单个样本分词后的最大序列长度超过部分被截断过短可能丢失语义过长会放大 padding 开销batch_size1分类/ 2NER、QA模型推理时的分批大小决定每次前向送入多少样本CustomModelHandler与TokenClsModelHandler均按examples[i : i batch_size]切分批见 custom_model_handler.pydoc_stride128QA 专属长篇章滑动窗口的重叠步长仅在QAModelHandler中解析见 qa_model_handler.py用于处理超长 context 的阅读理解切片以分类客户端为例三个参数均在命令行提供python client_seq_cls.py --dataset afqmc --max_seq_len 256 --batch_size 4从源码可见CustomModelHandler会读取parameters中的max_seq_len与batch_size来逐条调用tokenizer(text..., max_lengthmax_seq_len)并按batch_size分批调用底层PredictorMultiClassificationPostHandler则对每个批次的logits计算 softmax返回{label: ..., confidence: ...}。这意味着在不动服务端代码的前提下仅通过修改 client 请求体即可动态调整推理策略这是 SimpleServing 相比静态部署脚本的明显优势。八、服务启动参数与多模型扩展paddlenlp server命令除--host/--port外还支持以下常用选项完整定义见 paddlenlp/cli/main.py选项默认值说明--app_dir当前工作目录指定应用server_*.py所在目录--workers环境变量$WEB_CONCURRENCY或 1工作进程数--log_levelinfo日志级别--limit-concurrencyNone最大并发连接数--limit-max-requestsNone进程终止前服务的最大请求数--timeout-keep-alive15秒Keep-Alive 连接空闲超时--reloadFalse应用目录变更时自动重载另外SimpleServer的register方法还接收precisionfp32与device_id0两个可选参数见 server.py可用于切换 FP16 推理精度或在多 GPU 场景下指定设备。若业务需要同时发布多个模型可以在一个app对象中多次调用register为每个模型注册不同的task_name从而形成多模型共存的单服务。对于 Taskflow 类能力如文本生成、情感分析等SimpleServer还提供register_taskflow入口见 server.py扩展方式与之类似。九、一次请求的完整调用链将 client 与 server 两端的源码串联起来一次分类请求的完整链路可概括为客户端构造{data: {...}, parameters: {...}}并requests.post到/models/ernie_clsHttpRouterManager在FastAPI上动态注册POST /models/ernie_cls路由router.py收到请求后调用ModelManager.predict(data, parameters)ModelManager轮询选择一个 Predictor_get_predict_id见 model_manager.py在加锁保护下依次调用model_handler与post_handler见 model_manager.pyCustomModelHandler用AutoTokenizer完成input_ids/token_type_ids编码按batch_size分批送入Predictor汇总得到logitsMultiClassificationPostHandler对logits计算 softmax 并输出label与confidence结果以{result: {...}}形式返回客户端router.py。十、相关代码与扩展阅读如需继续深入可阅读仓库中以下文件服务端脚本server_seq_cls.py、server_token_cls.py、server_qa.py客户端脚本client_seq_cls.py、client_token_cls.py、client_qa.pySimpleServing 核心实现server.py、model_manager.py、handlers 目录、http_router/router.py模型训练与压缩run_seq_cls.py、run_token_cls.py、run_qa.py、压缩配置 configs/default.ymlERNIE 3.0 全流程总览slm/model_zoo/ernie-3.0/README.md其中部署章节同时给出 FastDeploy 与 Triton Serving 的备选方案综上基于 PaddleNLP SimpleServing 的服务化部署只需一个注册脚本 一个请求脚本即可完成且三类主流中文 NLP 任务分类、序列标注、阅读理解共用同一套注册框架仅需替换 Handler 与模型目录。这种模型与后处理可插拔的设计使 ERNIE 3.0 微调产物的上线成本被压缩到分钟级非常适合中小规模业务快速验证与内网服务发布。赞分享人工智能大模型预训练微调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 的层次文本分类服务化部署实践 导读 本文以 PaddleNLP 层次文本分类Hierarchical T人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP基于 PaddleNLP SimpleServing 的多标签文本分类服务化部署实战指南基于 PaddleNLP SimpleServing 的多标签文本分类服务化部署实战指南 多标签文本分类模型如基于 ERNIE 3.0 / ERNIE M 微人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP SimpleServing 服务化部署实战基于 UIE-X 的文档信息抽取 HTTP 服务搭建指南PaddleNLP SimpleServing 服务化部署实战基于 UIE X 的文档信息抽取 HTTP 服务搭建指南 本文面向需要在生产环境中上线 UIE人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇BilibiliDown免费跨平台B站视频下载的终极解决方案下一篇Citra 3DS模拟器完全指南如何在PC上完美运行任天堂3DS游戏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表