☰
基于 Triton Inference Server 的 ERNIE 层次文本分类服务化部署指南(PaddleNLP 实战)
2026/9/27 22:58:50 网站建设 项目流程
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

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

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

本文以 PaddleNLP 层次文本分类应用(slm/applications/text_classification/hierarchical)为背景,系统讲解如何基于 NVIDIA Triton Inference Server 将训练好的 ERNIE 文本层次分类模型封装为支持批量推理的在线 pipeline 服务。读者将完整掌握「模型仓库搭建 → Paddle 静态图导出 → Paddle2ONNX 转换 → Triton 多后端 pipeline 编排 → gRPC 客户端请求」的全链路部署方法,并理解 ensemble 调度、Python 后端 tokenizer 与后处理等关键实现细节。

服务端环境准备

Triton 服务端的运行依赖 NVIDIA 容器镜像,其前后处理环节则依赖 PaddleNLP 提供的 tokenizer 等组件,因此需要在容器内同时安装 PaddlePaddle 与 PaddleNLP。

拉取并启动 Triton Server 镜像

拉取官方 Triton Server 镜像:

docker pull nvcr.io/nvidia/tritonserver:21.10-py3

启动容器,将宿主机上的模型仓库目录挂载到容器内的/models:

docker run -it --gpus all --net=host --name triton_server -v /path/triton/models:/models nvcr.io/nvidia/tritonserver:21.10-py3 bash

注意事项:

  1. Triton 版本号21.10可根据自身需求调整,不同 Triton 版本对应的 Driver、CUDA、TensorRT 和 ONNX Runtime 等后端版本存在兼容矩阵,尤其需要核对NVIDIA Driver版本,若低于文档要求,启动时可能报错。
  2. 可通过--gpus '"device=1"'指定具体 GPU 卡号,更多 GPU 指定方式参见 NVIDIA 官方容器工具包文档。

进入容器并准备 PaddleNLP 环境

服务的前后处理(tokenizer、标签解码)依赖 PaddleNLP,需要在容器内安装相关 Python 包:

docker exec -it triton_server bash python3 -m pip install paddlepaddle-gpu paddlenlp -i https://mirror.baidu.com/pypi/simple

注意事项:

  1. 默认使用百度镜像源加速下载,使用 HTTP 代理时可将-i https://mirror.baidu.com/pypi/simple去掉。
  2. 环境中paddlepaddle-gpu或paddlepaddle版本应大于等于 2.2(层次分类应用整体要求参见 层次分类运行环境,其中 python >= 3.6、paddlepaddle >= 2.3、paddlenlp >= 2.4.8),可依据自身环境选择合适的 PaddlePaddle 安装命令。
  3. 更多 PaddleNLP 安装细节可参考仓库内的安装相关文档。

模型获取和转换

使用 Triton 的 ONNX Runtime 后端运行模型,首先需要将训练得到的动态图参数转换为静态图参数,再通过 Paddle2ONNX 转换为 ONNX 格式。

导出静态图模型

层次分类目录下提供了静态图导出脚本 export_model.py。其核心逻辑是:

  1. 通过AutoModelForSequenceClassification.from_pretrained(args.params_path)加载动态图模型并置为评估模式;
  2. 使用paddle.static.InputSpec声明输入描述(input_ids与token_type_ids,均为[None, None]的 int64 张量);
  3. 通过paddle.jit.to_static将动态图模型转为静态图,再经paddle.jit.save保存,产物默认落在output_path/float32下,生成float32.pdmodel与float32.pdiparams。

执行导出命令(示例将导出结果放到当前目录的wos_infer_model):

python ../../export_model.py --params_path=../../checkpoint/model_state.pdparams --output_path=./wos_infer_model

脚本支持的参数如下:

参数默认值说明
--params_path./checkpoint/待加载的动态图模型参数路径
--output_path./export静态图模型保存路径
--multilingual关闭多语言任务开关,开启时仅使用input_ids单输入

使用 Paddle2ONNX 转换为 ONNX 模型

将 Paddle 静态图模型转换为 ONNX 格式:

paddle2onnx --model_dir infer_model/ --model_filename float32.pdmodel --params_filename float32.pdiparams --save_file model.onnx --opset_version 13 --enable_onnx_checker True --enable_dev_version True

命令成功运行后,会在当前目录生成model.onnx模型文件。其中--opset_version 13指定 ONNX operator set 版本,--enable_onnx_checker用于转换后校验,--enable_dev_version开启开发版特性支持。更多参数选项说明可查阅 Paddle2ONNX 项目文档。

搭建 Triton 模型仓库

创建模型仓库目录并将转换好的 ONNX 模型移动到对应子目录:

mkdir /models/seqcls/1 mkdir /models/seqcls_model/1 mv model.onnx /models/seqcls_model/1

转换与整理完成后,models目录结构如下(该结构与仓库中 triton_serving/models 目录一一对应):

models ├── seqcls │ ├── 1 │ └── config.pbtxt ├── seqcls_model │ ├── 1 │ │ └── model.onnx │ └── config.pbtxt ├── seqcls_postprocess │ ├── 1 │ │ └── model.py │ └── config.pbtxt └── tokenizer ├── 1 │ └── model.py └── config.pbtxt

模型配置文件的编写细节可参见 Triton Server Model Configuration 官方文档。下面结合仓库内已有的配置文件逐一分析四个模型的分工。

seqcls:ensemble 调度器

seqcls/config.pbtxt 定义了一个platform: "ensemble"的调度模型,不承载实际计算,仅负责把三个子模型串成 pipeline:

  • 输入INPUT(TYPE_STRING,dims[1]),即原始文本;
  • 输出label(TYPE_INT64)与confidence(TYPE_FP32);
  • ensemble_scheduling.step依次串联 tokenizer → seqcls_model → seqcls_postprocess,并通过input_map/output_map完成张量名的对接(例如 tokenizer 的OUTPUT_0映射为tokenizer_input_ids,再作为seqcls_model的input_ids)。
seqcls_model:ONNX Runtime 推理后端

seqcls_model/config.pbtxt 使用platform: "onnxruntime_onnx"加载model.onnx:

  • 输入为input_ids与token_type_ids(TYPE_INT64,dims[-1]);
  • 输出为linear_75.tmp_1(TYPE_FP32,dims[74]),对应 74 类标签的 logits;
  • instance_group声明 GPU 实例(count: 1, kind: KIND_GPU);
  • optimization.graph.level: -1关闭图优化,避免算子变更破坏 ONNX 语义;
  • 通过parameters显式设置 ONNX Runtime 的线程与执行模式参数(intra_op_thread_count、inter_op_thread_count、execution_mode)。
tokenizer 与 seqcls_postprocess:Python 后端

两个模型均使用backend: "python"运行在 CPU 实例上(KIND_CPU),通过自定义TritonPythonModel类实现前后处理。

tokenizer/1/model.py 的initialize阶段加载 tokenizer:

self.tokenizer = AutoTokenizer.from_pretrained("ernie-3.0-medium-zh", use_fast=True)

execute阶段对每个请求取出原始字符串(bytes解码为 UTF-8),调用self.tokenizer(data, max_length=128, padding=True, truncation=True)完成编码,并将input_ids、token_type_ids转换为配置文件声明的输出 dtype,封装为pb_utils.InferenceResponse返回。

说明:仓库内tokenizer后端实际加载的是中文轻量级预训练模型ernie-3.0-medium-zh,客户端示例也是中文新闻文本;若按文档原意部署 ERNIE 2.0 英文模型(如 WOS 数据集场景),需要将此处模型名替换为训练时对应的英文 tokenizer,并保持与导出模型时的input_ids/token_type_ids语义一致。

seqcls_postprocess/1/model.py 接收 ONNX 输出的 74 维 logits 向量,先经过 Sigmoid 归一化:

data = 1 / (1 + (np.exp((-data[0]))))

随后以 0.5 为阈值做多标签判定,将大于阈值的位置(类别索引)与对应概率分别作为POST_label、POST_confidence输出。这正是层次/多标签分类"一个样本可命中多个标签"的典型后处理逻辑。

部署模型

triton目录(即 triton_serving)包含启动 pipeline 服务的配置与发送预测请求的代码:

models # Triton启动需要的模型仓库,包含模型和服务配置文件 seqcls_grpc_client.py # 层次分类任务发送pipeline预测请求的脚本

启动服务端

在容器内执行如下命令启动服务,默认加载models下所有模型:

tritonserver --model-repository=/models

也可以只启动单一任务服务:

tritonserver --model-repository=/models --model-control-mode=explicit --load-model=seqcls

服务启动成功后,终端会依次打印各后端的初始化日志,并在末尾输出模型加载状态表与监听端口信息:

... I0619 13:40:51.590901 5127 onnxruntime.cc:1999] TRITONBACKEND_Initialize: onnxruntime ... I0619 13:43:33.360018 5127 server.cc:592] +--------------------+---------+--------+ | Model | Version | Status | +--------------------+---------+--------+ | seqcls | 1 | READY | | seqcls_model | 1 | READY | | seqcls_postprocess | 1 | READY | | tokenizer | 1 | READY | +--------------------+---------+--------+ ... I0619 13:43:33.365824 5127 grpc_server.cc:4117] Started GRPCInferenceService at 0.0.0.0:8001 I0619 13:43:33.366221 5127 http_server.cc:2815] Started HTTPService at 0.0.0.0:8000 I0619 13:43:33.409775 5127 http_server.cc:167] Started Metrics Service at 0.0.0.0:8002

其中 8001 为 gRPC 服务端口,8000 为 HTTP 服务端口,8002 为 Metrics 监控端口。当四个模型均为READY状态时,pipeline 服务即可对外提供推理。

注意事项:Triton 的每个 Python 后端进程默认申请 64M 共享内存,默认启动的容器可能无法承载多个 Python 后端节点,有两种解决方案:

  1. 启动容器时设置shm-size参数:
docker run -it --net=host --name triton_server --shm-size="1g" -v /path/triton/models:/models nvcr.io/nvidia/tritonserver:21.10-py3 bash
  1. 启动服务时通过--backend-config调低 Python 后端默认内存:
tritonserver --model-repository=/models --backend-config=python,shm-default-byte-size=10485760

客户端请求

客户端环境准备

客户端请求有两种方式,可以任选其一。

方式一:在本地执行脚本,先安装依赖:

pip install grpcio pip install tritonclient==2.10.0

方式二:拉取官方 SDK 镜像并在容器中执行:

docker pull nvcr.io/nvidia/tritonserver:21.10-py3-sdk docker run -it --net=host --name triton_client -v /path/to/triton:/triton_code nvcr.io/nvidia/tritonserver:21.10-py3-sdk bash

启动客户端测试

仓库提供了 gRPC 客户端脚本 seqcls_grpc_client.py。其核心类SyncGRPCTritonRunner封装了完整的请求流程:

  • 初始化时通过InferenceServerClient连接server_url,并依次校验is_server_live()、is_server_ready()、is_model_ready(),确保服务端与模型已就绪;
  • 通过get_model_config/get_model_metadata动态获取模型的输入输出张量定义,避免硬编码张量名;
  • Run方法将文本列表按 UTF-8 编码构造为BYTES类型的InferInput(shape 为[len(data), 1]),调用client.infer发起推理,并把返回结果按输出名组织成字典;
  • 默认响应等待超时时间为 120 秒,可通过resp_wait_s调整。

main中默认连接localhost:8001,模型名为seqcls、版本为1,并内置了三段中文新闻文本作为测试样例:

if __name__ == "__main__": model_name = "seqcls" model_version = "1" url = "localhost:8001" runner = SyncGRPCTritonRunner(url, model_name, model_version) texts = [["消失的"外企光环",5月份在华裁员900余人,香饽饽变"臭"了"], ["卡车超载致使跨桥侧翻,没那么简单"], ["金属卡扣安装不到位,上海乐扣乐扣贸易有限公司将召回捣碎器1162件"]] for text in texts: result = runner.Run([text]) print(result)

执行客户端测试:

python seqcls_grpc_client.py

注意:执行客户端请求时建议关闭代理,并根据实际部署环境修改main函数中的 ip 地址(即启动服务所在机器的地址)。每个文本请求的返回结果中,label为该文本命中的标签索引集合,confidence为对应标签的预测概率,二者均由 pipeline 末端的seqcls_postprocessPython 后端生成。

小结

本方案的核心思路是将「tokenizer 编码、ONNX 模型推理、多标签后处理」拆分为 Triton 的三种模型类型,再通过 ensemble 调度串联为单一对外接口:tokenizer与seqcls_postprocess是 CPU 上的 Python 后端(复用 PaddleNLP 的 tokenizer 与 NumPy 实现),seqcls_model是 GPU 上的 ONNX Runtime 后端,seqcls则负责整体编排。这样既利用了 Triton 成熟的模型仓库、动态批处理与多后端能力,也把对 PaddleNLP 的依赖收敛在前后处理环节,可平滑适配 ERNIE 系列模型的层次/多标签文本分类在线服务。文中涉及的全部配置文件与脚本,均可直接在仓库 triton_serving 目录中查看或复用。

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

【免费下载链接】PaddleNLP

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

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

相关推荐

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询