news 2026/9/25 2:27:20

PaddleNLP SimpleServing 部署 UIE 数据蒸馏封闭域信息抽取模型:从服务启动到多卡负载均衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleNLP SimpleServing 部署 UIE 数据蒸馏封闭域信息抽取模型:从服务启动到多卡负载均衡
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

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

本文面向已完成 UIE Slim 数据蒸馏训练、需要把封闭域信息抽取小模型(uie-data-distill-gp)落地为 HTTP 服务化接口的开发者,讲解基于 PaddleNLPSimpleServer的完整部署方案:环境版本要求、Server 端启动命令、Client 端请求方式,以及 schema 替换、模型路径设置、多卡负载均衡等自定义配置。读完本文,你将能够独立搭建一个可对外提供 JSON 信息抽取服务的 HTTP 接口,并通过轮询调度将请求均衡分发到多张显卡。

背景与适用场景

在 slm/applications/information_extraction/text/data_distill/README.md 描述的 UIE Slim 数据蒸馏流程中,经过「UIE 微调得到 Teacher → 大规模无标注数据合成训练数据 → 封闭域 Student Model 训练」三步之后,最终产物是一个以 ERNIE 3.0 轻量底座(默认ernie-3.0-mini-zh)训练出的封闭域信息抽取模型。它与通用 UIE 模型的关键差异在于:训练完成后 schema(标签体系)被固定下来,推理时不再需要动态解析 schema,因此体量更小、预测更快,更适合作为在线服务。

uie-data-distill-gp即该封闭域模型在 Taskflow 中对应的注册名。在 paddlenlp/taskflow/taskflow.py 中可以看到,"uie-data-distill-gp"被映射到GPTask任务类,走 GlobalPointer/GPLinker 的抽取路径,与通用的UIETask是不同的实现分支,这解释了为什么部署该模型需要指定model="uie-data-distill-gp"。

本文所用示例代码位于仓库 slm/applications/information_extraction/text/data_distill/deploy/simple_serving/ 目录下,包含server.py(服务端)与client.py(客户端)两个可直接运行的脚本。

环境准备

SimpleServing 能力内置于 PaddleNLP 的SimpleServer(基于 FastAPI 封装,见 paddlenlp/server/server.py),因此需要安装带该功能的 PaddleNLP 版本:

pip install paddlenlp >= 2.4.4
  • paddlenlp >= 2.4.4版本起提供 SimpleServing 功能;也可以直接使用最新的 develop 版本。
  • 由于服务端依赖 FastAPI、uvicorn 等 Web 组件,安装完成后建议确认fastapi、uvicorn、requests已就绪(client.py使用requests发送 HTTP 请求)。
  • 运行服务前,需要先完成数据蒸馏训练并得到学生模型,模型默认保存在数据蒸馏目录下的checkpoint/model_best/(详见 slm/applications/information_extraction/text/data_distill/README.md 中学生模型训练部分)。

Server 服务启动

在simple_serving目录下执行:

paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189

参数说明:

  • server:app:指明加载当前目录下server.py中的app对象(即SimpleServer实例)。启动器会基于该对象自动生成 FastAPI 应用与路由。
  • --workers 1:启动 1 个 worker 进程。生产环境如需更高的并发吞吐,可适当增大该值,但需注意模型显存占用会随进程数成倍增加。
  • --host 0.0.0.0:监听所有网卡地址,允许局域网内其他机器访问;若仅本机访问可改为127.0.0.1。
  • --port 8189:HTTP 服务端口号,需与 client.py 中请求 URL 的端口保持一致。

server.py的核心逻辑如下(完整代码见 server.py):

from paddlenlp import SimpleServer, Taskflow # The schema changed to your defined schema schema = {"武器名称": ["产国", "类型", "研发单位"]} # The task path changed to your best model path uie = Taskflow( "information_extraction", model="uie-data-distill-gp", schema=schema, task_path="../../checkpoint/model_best/" ) # If you want to define the finetuned uie service app = SimpleServer() app.register_taskflow("taskflow/uie", uie)

这里的关键点:

  • Taskflow的task_path指向蒸馏训练产出的学生模型权重目录;相对于simple_serving目录,即数据蒸馏目录下的checkpoint/model_best/。
  • app.register_taskflow("taskflow/uie", uie)将该 Taskflow 注册为一个服务路由。从 paddlenlp/server/http_router/router.py 的源码可以看到,注册时会将task_name直接拼成 HTTP 路径:/taskflow/uie。请求模型与响应模型由 pydantic 动态生成,请求体字段为data,响应体字段为result。

Client 请求启动

服务启动后,在另一终端执行:

python client.py

client.py的请求逻辑(完整代码见 client.py):

import json import requests url = "http://0.0.0.0:8189/taskflow/uie" headers = {"Content-Type": "application/json"} texts = [ "威尔哥(Virgo)减速炸弹是由瑞典FFV军械公司专门为瑞典皇家空军的攻击机实施低空高速轰炸而研制,1956年开始研制,1963年进入服役,装备于A32“矛盾”、A35“龙”、和AJ134“雷”攻击机,主要用于攻击登陆艇、停放的飞机、高炮、野战火炮、轻型防护装甲车辆以及有生力量。" ] data = {"data": {"text": texts}} r = requests.post(url=url, headers=headers, data=json.dumps(data)) datas = json.loads(r.text) print(datas)

请求格式说明:

  • url必须与 Server 启动时的--port以及register_taskflow注册的task_name对应,即http://<host>:<port>/taskflow/uie。
  • 请求体为{"data": {"text": texts}},其中text接受字符串列表,可一次传入多条文本进行批量抽取。
  • headers声明Content-Type: application/json,data通过json.dumps序列化。
  • 返回结果为 JSON 文本,示例中的datas是解析后的 Python 对象,结构与 数据蒸馏 README 中 Taskflow 直接调用的输出一致:[{'武器名称': [{'start': 0, 'end': 14, 'text': '...', 'probability': 0.99, 'relations': {'产国': [...], '类型': [...], '研发单位': [...]}}]}]——即按 schema 组织的事件/实体/关系嵌套结构,包含文本片段位置(start/end)与置信度(probability)。

服务化自定义参数

Server 自定义参数

schema 替换

封闭域模型训练时 schema 已固定,但推理服务时仍需在构造 Taskflow 时显式声明,供结果后处理解析使用。默认示例:

# Default schema schema = {"武器名称": ["产国", "类型", "研发单位"]}

若你的蒸馏任务针对的是其他领域(例如医疗、金融、电商),需将schema替换为与训练数据标签一致的字典结构,键为实体/事件类型,值为对应的属性或关系标签列表。注意:schema 必须包含训练数据中的所有标签类型,否则预测结果的后处理会不完整。

设置模型路径
# Default task_path uie = Taskflow('information_extraction', model='uie-data-distill-gp', task_path='../../checkpoint/model_best/', schema=schema)
  • task_path:学生模型权重所在目录,即数据蒸馏 train.py 训练后保存在./checkpoint/model_best的模型(save_dir默认为./checkpoint)。若模型存放于其他位置,改为对应路径即可。
  • model='uie-data-distill-gp':必须保持该值,它决定 Taskflow 选用GPTask封闭域抽取实现(见 paddlenlp/taskflow/taskflow.py),与通用information_extraction的 UIE 任务走不同的推理分支。
多卡服务化预测

PaddleNLP SimpleServing 支持多卡负载均衡预测,做法是在服务注册时传入两个 Taskflow 实例的列表:

uie1 = Taskflow('information_extraction', model='uie-data-distill-gp', task_path='../../checkpoint/model_best/', schema=schema, device_id=0) uie2 = Taskflow('information_extraction', model='uie-data-distill-gp', task_path='../../checkpoint/model_best/', schema=schema, device_id=1) service.register_taskflow('uie', [uie1, uie2])

其底层调度机制可以从 paddlenlp/server/taskflow_manager.py 的TaskflowManager.predict看到:每次请求到达时,以毫秒级时间戳对 Taskflow 列表长度取模(task_index = t % len(self._task))来选择目标实例,从而实现请求在多个 GPU 上轮流分发;同时用lock_predictor保证单实例的串行预测安全。

要点归纳:

  • 每个 Taskflow 通过device_id绑定到不同的显卡(如 0、1),同一模型权重加载两份,分别驻留于各自显存。
  • 注册时直接传入[uie1, uie2]列表,register_taskflow内部会逐个校验实例类型并交由TaskflowManager统一管理(见 paddlenlp/server/server.py)。
  • 注意示例代码中service.register_taskflow的路由名被省略为'uie',若照搬请改为你需要的路径(如'taskflow/uie'),并同步更新客户端请求 URL。

Client 自定义参数

客户端需要自定义的是待抽取的文本列表:

# Changed to input texts you wanted texts = ['威尔哥(Virgo)减速炸弹是由瑞典FFV军械公司专门为瑞典皇家空军的攻击机实施低空高速轰炸而研制,1956年开始研制,1963年进入服役,装备于A32“矛盾”、A35“龙”、和AJ134“雷”攻击机,主要用于攻击登陆艇、停放的飞机、高炮、野战火炮、轻型防护装甲车辆以及有生力量。']

将texts替换为业务中实际需要抽取的文本即可,client.py中的请求构造、发送与结果解析代码无需改动;如果要多文本批量抽取,直接向该列表追加元素。

常见问题与排查要点

  • 端口冲突:--port 8189被占用时,uvicorn 会启动失败,可更换端口并同步修改client.py中的url。
  • 模型路径错误:task_path指向的目录下应包含model_state.pdparams等权重文件;路径写错时 Taskflow 构造阶段即报错,可核对simple_serving目录与checkpoint/model_best的相对位置。
  • 客户端返回 404:检查注册的task_name(如taskflow/uie)与请求 URL 路径是否完全一致,路由由register_taskflow_router按/task_name直接生成(paddlenlp/server/http_router/router.py)。
  • 多卡显存溢出:每个device_id实例都会完整加载一份模型权重,卡数增多时请评估单卡显存余量。
  • 中文乱码或 JSON 解析失败:确认服务端与客户端文件均以 UTF-8 编码保存,且响应按json.loads(r.text)解析。

小结

本文完整覆盖了 PaddleNLP SimpleServing 部署 UIE 数据蒸馏封闭域信息抽取模型的全流程:安装paddlenlp >= 2.4.4、用paddlenlp server server:app启动服务、用client.py发起 HTTP 请求,并通过schema、task_path、device_id与 Taskflow 列表完成领域定制和多卡负载均衡。结合 server.py、client.py 以及 paddlenlp/server/ 下的源码实现,你可以在此基础上按业务需要扩展路由、增删实例或接入自定义后处理,将蒸馏小模型稳定地对外提供在线抽取服务。

  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

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

相关推荐

上一篇:urllib3 性能优化终极指南:7个提升HTTP请求速度的实用技巧
下一篇:21个效率神器:用Illustrator脚本将设计工作提速300%

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

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

人事档案管理系统部署与导入导出实战:功能拆解及五大避坑指南

简介&#xff1a;人事档案管理系统破解版是一款面向中小企业人力资源与行政办公场景的绿色免安装管理工具&#xff0c;主要解决员工信息录入、查询、统计与批量导入导出等问题。系统界面友好&#xff0c;支持摄像头采集身份证信息并自动校验真伪&#xff0c;同时可区分学历、性…

作者头像 李华
网站建设 2026/9/25 2:25:43

EKF+BP神经网络+粒子滤波:Matlab非线性状态估计融合实战与调参详解

做状态估计这块的研究&#xff0c;尤其是同时涉及扩展卡尔曼滤波EKF、BP神经网络和粒子滤波PF时&#xff0c;很多刚上手的朋友第一反应就是“三种方法混在一起该怎么理解”。这个看似复杂的组合&#xff0c;其实拆开来看就是一套完整的非线性状态估计排查流程&#xff1a;先用E…

作者头像 李华