- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
本文以 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注意事项:
- Triton 版本号
21.10可根据自身需求调整,不同 Triton 版本对应的 Driver、CUDA、TensorRT 和 ONNX Runtime 等后端版本存在兼容矩阵,尤其需要核对NVIDIA Driver版本,若低于文档要求,启动时可能报错。 - 可通过
--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注意事项:
- 默认使用百度镜像源加速下载,使用 HTTP 代理时可将
-i https://mirror.baidu.com/pypi/simple去掉。 - 环境中
paddlepaddle-gpu或paddlepaddle版本应大于等于 2.2(层次分类应用整体要求参见 层次分类运行环境,其中 python >= 3.6、paddlepaddle >= 2.3、paddlenlp >= 2.4.8),可依据自身环境选择合适的 PaddlePaddle 安装命令。 - 更多 PaddleNLP 安装细节可参考仓库内的安装相关文档。
模型获取和转换
使用 Triton 的 ONNX Runtime 后端运行模型,首先需要将训练得到的动态图参数转换为静态图参数,再通过 Paddle2ONNX 转换为 ONNX 格式。
导出静态图模型
层次分类目录下提供了静态图导出脚本 export_model.py。其核心逻辑是:
- 通过
AutoModelForSequenceClassification.from_pretrained(args.params_path)加载动态图模型并置为评估模式; - 使用
paddle.static.InputSpec声明输入描述(input_ids与token_type_ids,均为[None, None]的 int64 张量); - 通过
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 后端节点,有两种解决方案:
- 启动容器时设置
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- 启动服务时通过
--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.
相关推荐
基于 Triton Inference Server 的 ERNIE 3.0 中文文本多标签分类 Pipeline 服务化部署指南
基于 Triton Inference Server 的 ERNIE 3.0 中文文本多标签分类 Pipeline 服务化部署指南 本文基于 PaddleNLP
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP基于 Triton Inference Server 部署 ERNIE 3.0 中文文本多分类 Pipeline 在线服务
基于 Triton Inference Server 部署 ERNIE 3.0 中文文本多分类 Pipeline 在线服务 本文档是 PaddleNLP 多分类
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP基于 PaddleNLP SimpleServing 的层次文本分类服务化部署实践
基于 PaddleNLP SimpleServing 的层次文本分类服务化部署实践 导读 本文以 PaddleNLP 层次文本分类(Hierarchical T
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考