☰
基于 FastDeploy 的 ERNIE 3.0 模型多硬件部署指南:PaddleNLP 文本分类与序列标注实战
2026/9/26 18:08:35 网站建设 项目流程
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

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

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

本篇技术指南以 PaddleNLP 仓库中 ERNIE 3.0 轻量级模型部署文档 为核心,系统讲解如何基于 FastDeploy 将训练好的 ERNIE 3.0 模型在 CPU、GPU 及多种推理引擎后端上完成部署,覆盖 Python 直连部署与服务化(Serving)部署两条完整路径。读完本文,你将掌握 ERNIE 3.0 在文本分类(以 CLUE AFQMC 为例)与序列标注(以 MSRA_NER 为例)两类任务上的模型准备、命令启动、参数调优与客户端请求方法,并理解底层推理代码与模型配置的实现细节。

FastDeploy 与 ERNIE 3.0 部署概览

FastDeploy 是一款面向全场景的 AI 推理部署工具,主打易用灵活与极致高效,满足开发者多硬件、多平台的产业部署需求。开发者可以基于 FastDeploy 将训练好的预测模型部署到不同的硬件和不同的推理引擎后端上,目前 FastDeploy 提供 C++、Python、Java 等多种编程语言的 SDK。

在部署 ERNIE 3.0 模型之前,需要先安装 FastDeploy SDK。请参考 FastDeploy 官方 SDK 安装文档(build_and_install/download_prebuilt_libraries.md),确认部署环境满足 FastDeploy 的环境要求,并按照介绍安装对应的 SDK。

本项目对应的部署示例位于 slm/model_zoo/ernie-3.0/deploy,目录下包含三条部署路径:

目录说明
python/FastDeploy + Paddle Inference 的 Python 直连部署,提供seq_cls_infer.py与token_cls_infer.py
serving/基于 Triton 架构的服务化部署,提供模型仓库、服务配置与 gRPC 客户端
simple_serving/基于 PaddleNLP SimpleServing 的轻量 HTTP 服务化部署

硬件与推理引擎支持矩阵

目前,ERNIE 3.0 模型支持在如下硬件以及推理引擎上进行部署。符号说明:✅ 表示已经支持;❔ 表示正在进行中;N/A 表示暂不支持。

硬件可用的推理引擎是否支持 Paddle 新格式量化模型是否支持 FP16 模式
CPUPaddle Inference✅N/A
CPUONNX Runtime✅N/A
CPUOpenVINO✅N/A
GPUPaddle Inference✅N/A
GPUONNX Runtime✅❔
GPUPaddle TensorRT✅✅
GPUTensorRT✅✅
昆仑芯 XPUPaddle LiteN/A✅
华为昇腾Paddle Lite❔✅
Graphcore IPUPaddle Inference❔N/A

从上表可以看出,ERNIE 3.0 的部署覆盖面很广:CPU 侧三条引擎路径全部就绪,GPU 侧四种引擎路径可用且 TensorRT 家族支持 FP16 与量化模型,同时覆盖昆仑芯 XPU、华为昇腾、Graphcore IPU 等国产与异构硬件。若需要在 CPU/GPU 或其他推理引擎上切换运行,主要通过服务端配置文件(config.pbtxt)完成,详见下文"服务化部署"章节。

支持的任务列表与部署方式

ERNIE 3.0 支持文本分类与序列标注两大 NLP 任务的部署,每种任务均提供 Python、C++ 与 Serving 三种部署形态。符号说明与上节一致。

任务 Task部署方式是否支持
文本分类Python✅
文本分类C++✅
文本分类Serving✅
序列标注Python✅
序列标注C++✅
序列标注Serving✅

本文后续将重点展开 Python 与 Serving 两条路径的实操。

Python 直连部署

Python 部署目录 slm/model_zoo/ernie-3.0/deploy/python 下提供seq_cls_infer.py(文本分类)与token_cls_infer.py(序列标注)两个脚本,可快速完成在 CPU/GPU 上的 Python 预测部署。两个脚本均基于paddle.inference的 Python API 编写,先通过AutoTokenizer完成分词,再通过paddle_infer.Config创建推理引擎执行预测。

文本分类任务快速开始

以下示例展示如何完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的 AFQMC 数据集(蚂蚁金融语义相似度任务)上的文本分类 Python 预测部署。示例中的模型是按照 ERNIE 3.0 训练文档 导出得到的部署模型,其模型目录为model_zoo/ernie-3.0/best_models/afqmc/export(用户可按实际情况设置)。

# CPU 推理 python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device cpu # GPU 推理 python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device gpu

运行完成后返回的结果如下(GPU 推理时日志会展示 Paddle Inference 的 PIR 图优化过程):

I0423 05:00:21.622229 8408 print_statistics.cc:44] --- detected [85, 273] subgraphs! --- Running PIR pass [dead_code_elimination_pass] I0423 05:00:21.622710 8408 print_statistics.cc:50] --- detected [113] subgraphs! --- Running PIR pass [replace_fetch_with_shadow_output_pass] I0423 05:00:21.622859 8408 print_statistics.cc:50] --- detected [1] subgraphs! --- Running PIR pass [remove_shadow_feed_pass] I0423 05:00:21.626749 8408 print_statistics.cc:50] --- detected [2] subgraphs! --- Running PIR pass [inplace_pass] I0423 05:00:21.631474 8408 print_statistics.cc:50] --- detected [2] subgraphs! I0423 05:00:21.631560 8408 analysis_predictor.cc:1186] ======= pir optimization completed ======= I0423 05:00:21.641817 8408 pir_interpreter.cc:1640] pir interpreter is running by trace mode ... Batch 0, example 0 | s1: 花呗收款额度限制 | s2: 收钱码,对花呗支付的金额有限制吗 | label: 1 | score: 0.5175 Batch 1, example 0 | s1: 花呗支持高铁票支付吗 | s2: 为什么友付宝不支持花呗付款 | label: 0 | score: 0.9873

输出中label为预测类别,score为 softmax 归一化后的置信度。

文本分类参数说明

seq_cls_infer.py支持通过命令行参数控制模型目录、运行设备、批大小与序列长度。以下为各命令行参数的说明:

参数参数说明
--model_dir指定部署模型的目录(必填)
--batch_size输入的 batch size,默认为 1
--max_length最大序列长度,默认为 128
--device运行的设备,可选范围:['cpu', 'gpu'],默认为'cpu'
--model_prefix模型文件前缀,默认'model'(在 token_cls 脚本中同样提供)
--vocab_pathtokenizer 词表路径,默认为空(自动从模型目录加载)
--log_interval日志打印间隔,默认为 10

文本分类脚本源码剖析

从 seq_cls_infer.py 的源码可以看到完整推理链路:

  • Predictor 初始化:通过AutoTokenizer.from_pretrained(args.model_dir)从部署模型目录加载分词器;通过paddle_infer.Config(model_path, params_path)创建推理配置,其中模型文件名与参数文件名由model_prefix分别与PADDLE_INFERENCE_MODEL_SUFFIX、PADDLE_INFERENCE_WEIGHTS_SUFFIX拼接得到。
  • 引擎配置:device == "gpu"时调用config.enable_use_gpu(100, 0)(设置显存 100 MB、使用 0 号 GPU),否则调用config.disable_gpu();同时关闭 feed/fetch ops(switch_use_feed_fetch_ops(False))并开启内存优化(enable_memory_optim())。
  • 前处理:preprocess()调用 tokenizer 对文本对(text, text_pair)执行max_length截断、padding补齐,返回input_ids与token_type_ids两个 int64 张量。
  • 推理与后处理:infer()通过输入输出 handle 完成 CPU/GPU 数据搬运与predictor.run();postprocess()对 logits 做 softmax 归一化,输出label(argmax)与confidence(最大概率)。

序列标注任务快速开始

以下示例展示如何完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的 MSRA_NER 数据集上的序列标注 Python 预测部署。示例中的模型按照 ERNIE 3.0 训练文档 导出,模型目录为model_zoo/ernie-3.0/best_models/msra_ner/export(用户可按实际情况设置)。

# CPU 推理 python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device cpu # GPU 推理 python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device gpu

运行完成后返回的结果如下:

...... --- Running PIR pass [inplace_pass] I0423 09:51:42.250245 4644 print_statistics.cc:50] --- detected [1] subgraphs! I0423 09:51:42.250334 4644 analysis_predictor.cc:1186] ======= pir optimization completed ======= I0423 09:51:42.261358 4644 pir_interpreter.cc:1640] pir interpreter is running by trace mode ... input data: 北京的涮肉,重庆的火锅,成都的小吃都是极具特色的美食。 The model detects all entities: entity: 北京 label: LOC pos: [0, 1] entity: 重庆 label: LOC pos: [6, 7] entity: 成都 label: LOC pos: [12, 13] ----------------------------- input data: 乔丹、科比、詹姆斯和姚明都是篮球界的标志性人物。 The model detects all entities: entity: 乔丹 label: PER pos: [0, 1] entity: 科比 label: PER pos: [3, 4] entity: 詹姆斯 label: PER pos: [6, 8] entity: 姚明 label: PER pos: [10, 11] -----------------------------

序列标注参数说明

token_cls_infer.py支持的命令行参数与文本分类脚本基本一致,额外多出--model_prefix:

参数参数说明
--model_dir指定部署模型的目录(必填)
--batch_size输入的 batch size,默认为 1
--max_length最大序列长度,默认为 128
--device运行的设备,可选范围:['cpu', 'gpu'],默认为'cpu'
--model_prefix模型文件前缀,前缀会分别与PADDLE_INFERENCE_MODEL_SUFFIX和PADDLE_INFERENCE_WEIGHTS_SUFFIX拼接得到模型文件名和参数文件名,默认为'model'

序列标注脚本源码剖析

从 token_cls_infer.py 的源码可以看到,序列标注的关键差异在于后处理:

  • 标签体系:脚本内置["B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC", "O"]共 7 类 BIO 标签,与 MSRA 数据集的实体类别(人名 PER、机构名 ORG、地名 LOC)对应。
  • 前处理:preprocess()会根据isinstance(texts[0], list)判断输入是否已按词切分(is_split_into_words),并将input_ids、token_type_ids转为 int64。
  • 实体解码:postprocess()对每个 token 的 logits 取 argmax 得到标签序列,然后扫描 BIO 标签——遇到B-开始记录实体起点,遇到O或新的B-结束当前实体,最终以{"pos": [start, end], "entity": ..., "label": ...}的形式输出实体列表,再由token_cls_print_ret()打印 "The model detects all entities" 格式的结果。

Serving 服务化部署

服务化部署基于 FastDeploy 的 Triton 兼容服务框架,支持将分词、模型推理、后处理拆分组合为 pipeline 服务,通过 gRPC 对外提供预测能力。示例代码位于 slm/model_zoo/ernie-3.0/deploy/serving。

在服务化部署前,需先确认服务化镜像的软硬件环境要求,并按照 FastDeploy 服务化部署文档拉取对应镜像。

准备模型

以下示例展示如何基于 FastDeploy 完成 ERNIE 3.0 模型在 CLUE Benchmark 的 AFQMC 数据集(文本分类)以及 MSRA_NER 数据集(序列标注)上的服务化部署。按照 ERNIE 3.0 训练文档 分别训练并导出文本分类模型与序列标注模型,并将导出的模型移动到models目录下相应位置。

注意:模型与参数文件必须命名为model.pdmodel和model.pdiparams。

模型移动好之后,文本分类任务的models目录结构如下:

models ├── ernie_seqcls # 分类任务的 pipeline │ ├── 1 │ └── config.pbtxt # 通过这个文件组合前后处理和模型推理 ├── ernie_seqcls_model # 分类任务的模型推理 │ ├── 1 │ │ ├── model.pdiparams │ │ └── model.pdmodel │ └── config.pbtxt ├── ernie_seqcls_postprocess # 分类任务后处理 │ ├── 1 │ │ └── model.py │ └── config.pbtxt └── ernie_seqcls_tokenizer # 预处理分词 ├── 1 │ └── model.py └── config.pbtxt

序列标注任务的models目录结构如下:

models ├── ernie_tokencls # 序列标注任务的 pipeline │ ├── 1 │ └── config.pbtxt # 通过这个文件组合前后处理和模型推理 ├── ernie_tokencls_model # 序列标注任务的模型推理 │ ├── 1 │ │ ├── model.pdiparams │ │ └── model.pdmodel │ └── config.pbtxt ├── ernie_tokencls_postprocess # 序列标注任务后处理 │ ├── 1 │ │ └── model.py │ └── config.pbtxt └── ernie_tokencls_tokenizer # 预处理分词 ├── 1 │ └── model.py └── config.pbtxt

从目录结构可以看出,每个任务被拆成四个模型单元:_tokenizer(Python 后端执行分词预处理)、_model(FastDeploy 后端执行模型推理)、_postprocess(Python 后端执行后处理)、以及无后缀的 pipeline 名(通过ensemble_scheduling把前三者串成完整推理流程)。

拉取并运行镜像

# x.y.z 为镜像版本号,需参照 serving 文档替换为数字 # GPU 镜像 docker pull registry.baidubce.com/paddlepaddle/fastdeploy:x.y.z-gpu-cuda11.4-trt8.4-21.10 # CPU 镜像 docker pull registry.baidubce.com/paddlepaddle/fastdeploy:x.y.z-cpu-only-21.10 # GPU 运行 nvidia-docker run -it --net=host --name fastdeploy_server --shm-size="1g" -v /path/serving/models:/models registry.baidubce.com/paddlepaddle/fastdeploy:x.y.z-gpu-cuda11.4-trt8.4-21.10 bash # CPU 运行 docker run -it --net=host --name fastdeploy_server --shm-size="1g" -v /path/serving/models:/models registry.baidubce.com/paddlepaddle/fastdeploy:x.y.z-cpu-only-21.10 bash

注意:启动服务时,Server 的每个 Python 后端进程默认申请 64M 内存,默认启动的 Docker 容器无法启动多个 Python 后端节点。有两种解决方案:

  1. 启动容器时设置shm-size参数(如上面的命令,--shm-size="1g")。
  2. 启动服务时设置 Python 后端的shm-default-byte-size参数,将 Python 后端的默认内存降为 10M:
fastdeployserver --model-repository=/models --backend-config=python,shm-default-byte-size=10485760

部署模型:启动服务

serving 目录包含启动 pipeline 服务的配置和发送预测请求的代码,包括:

models # 服务化启动需要的模型仓库,包含模型和服务配置文件 seq_cls_grpc_client.py # AFQMC 分类任务发送 pipeline 预测请求的脚本 token_cls_grpc_client.py # 序列标注任务发送 pipeline 预测请求的脚本
分类任务

在容器内执行下面命令启动服务:

# 默认启动 models 下所有模型 fastdeployserver --model-repository=/models # 可通过参数只启动分类任务 fastdeployserver --model-repository=/models --model-control-mode=explicit --load-model=ernie_seqcls

服务启动成功后的输出打印如下:

I0209 09:15:49.314029 708 model_repository_manager.cc:1183] successfully loaded 'ernie_seqcls_model' version 1 I0209 09:15:49.314917 708 model_repository_manager.cc:1022] loading: ernie_seqcls:1 I0209 09:15:49.417014 708 model_repository_manager.cc:1183] successfully loaded 'ernie_seqcls' version 1 ... I0209 09:15:49.417394 708 server.cc:549] +------------+---------------------------------------------------------------+--------+ | Backend | Path | Config | +------------+---------------------------------------------------------------+--------+ | python | /opt/tritonserver/backends/python/libtriton_python.so | {} | | fastdeploy | /opt/tritonserver/backends/fastdeploy/libtriton_fastdeploy.so | {} | +------------+---------------------------------------------------------------+--------+ I0209 09:15:49.417552 708 server.cc:592] +--------------------------+---------+--------+ | Model | Version | Status | +--------------------------+---------+--------+ | ernie_seqcls | 1 | READY | | ernie_seqcls_model | 1 | READY | | ernie_seqcls_postprocess | 1 | READY | | ernie_seqcls_tokenizer | 1 | READY | +--------------------------+---------+--------+
序列标注任务

在容器内执行下面命令启动序列标注服务(同时演示 shm 内存参数的用法):

fastdeployserver --model-repository=/models --model-control-mode=explicit --load-model=ernie_tokencls --backend-config=python,shm-default-byte-size=10485760

输出打印如下:

I0209 09:15:49.314029 708 model_repository_manager.cc:1183] successfully loaded 'ernie_tokencls_model' version 1 I0209 09:15:49.314917 708 model_repository_manager.cc:1022] loading: ernie_tokencls:1 I0209 09:15:49.417014 708 model_repository_manager.cc:1183] successfully loaded 'ernie_tokencls' version 1 ... I0209 09:15:49.417394 708 server.cc:549] +------------+---------------------------------------------------------------+--------+ | Backend | Path | Config | +------------+---------------------------------------------------------------+--------+ | python | /opt/tritonserver/backends/python/libtriton_python.so | {} | | fastdeploy | /opt/tritonserver/backends/fastdeploy/libtriton_fastdeploy.so | {} | +------------+---------------------------------------------------------------+--------+ I0209 09:15:49.417552 708 server.cc:592] +----------------------------+---------+--------+ | Model | Version | Status | +----------------------------+---------+--------+ | ernie_tokencls | 1 | READY | | ernie_tokencls_model | 1 | READY | | ernie_tokencls_postprocess | 1 | READY | | ernie_tokencls_tokenizer | 1 | READY | +----------------------------+---------+--------+

客户端请求

客户端请求既可以在本地执行脚本发起,也可以在容器内执行。本地执行脚本需要先安装依赖:

pip install grpcio pip install tritonclient[all] # 如果 bash 无法识别括号,可以使用如下指令安装: pip install tritonclient\[all\]
分类任务

注意:执行客户端请求时关闭代理,并根据实际情况修改脚本main函数中的 ip 地址(即启动服务所在的机器)。

python seq_cls_grpc_client.py

输出打印如下:

{'label': array([0, 0]), 'confidence': array([0.54437345, 0.98503494], dtype=float32)} acc: 0.7224281742354032

从 seq_cls_grpc_client.py 的源码可以看到,客户端通过tritonclient.grpc.InferenceServerClient连接服务地址(默认localhost:8001),将文本以BYTES类型封装为InferInput发送请求,并通过test_afqmc_dataset()加载 CLUE AFQMC 的 dev 集(load_dataset("clue", "afqmc", splits="dev"))批量评估准确率,最终打印acc。

序列标注任务

同样注意执行客户端请求时关闭代理,并根据实际情况修改main函数中的 ip 地址。

python token_cls_grpc_client.py

输出打印如下:

input data: 北京的涮肉,重庆的火锅,成都的小吃都是极具特色的美食。 The model detects all entities: entity: 北京 label: LOC pos: [0, 1] entity: 重庆 label: LOC pos: [6, 7] entity: 成都 label: LOC pos: [12, 13] input data: 乔丹、科比、詹姆斯和姚明都是篮球界的标志性人物。 The model detects all entities: entity: 乔丹 label: PER pos: [0, 1] entity: 科比 label: PER pos: [3, 4] entity: 詹姆斯 label: PER pos: [6, 8] entity: 姚明 label: PER pos: [10, 11]

服务配置与引擎切换

服务端各模型单元的config.pbtxt决定了推理引擎与调度方式。以仓库中 ernie_seqcls_model/config.pbtxt 为例,其关键配置包括:

  • backend: "fastdeploy":指定模型推理使用 FastDeploy 后端;
  • max_batch_size: 64:最大动态批大小;
  • input/output:声明input_ids(TYPE_INT64)、token_type_ids(TYPE_INT64)两个输入,以及linear_75.tmp_1(TYPE_FP32,dims 为[2])输出——该输出名需按实际导出模型的输出 tensor 名称修改;
  • instance_group:设置实例数量与设备类型(KIND_GPU/KIND_CPU);
  • optimization.execution_accelerators:配置加速器,如 CPU 上使用 paddle 加速并设置cpu_threads。

而 ernie_seqcls/config.pbtxt 通过platform: "ensemble"与ensemble_scheduling将 tokenizer(输出tokenizer_input_ids、tokenizer_token_type_ids)、模型推理(输出OUTPUT_2)、后处理(输出label、confidence)三级串联,完成从原始文本TEXT/TEXT_PAIR到预测结果的完整 pipeline。

仓库内 Python 后端的实现同样值得参考:ernie_seqcls_tokenizer/1/model.py 以TritonPythonModel类在initialize()中加载AutoTokenizer.from_pretrained("ernie-3.0-medium-zh", use_fast=True),在execute()中对请求文本批量执行max_length=128的 padding/truncation 编码。

当前分类任务默认配置在 GPU 上运行(instance_group.kind: KIND_GPU),序列标注任务默认配置也有相应的引擎预设。如果要在 CPU/GPU 或其他推理引擎上运行,需要修改对应config.pbtxt的instance_group、optimization与backend配置,详情可参考 FastDeploy 服务化的模型配置文档。

延伸:基于 PaddleNLP SimpleServing 的轻量部署

除了 FastDeploy 的 Triton 服务化方案,仓库还在 slm/model_zoo/ernie-3.0/deploy/simple_serving 提供了基于 PaddleNLP SimpleServing 的轻量服务化部署方式,适合快速验证。使用具有 SimpleServing 功能的 PaddleNLP 版本即可。

文本分类服务:

# 启动文本分类 Server 服务 paddlenlp server server_seq_cls:app --host 0.0.0.0 --port 8189 # 分类任务发送请求 python client_seq_cls.py --dataset afqmc

命名实体识别服务:

# 启动命名实体识别 Server 服务 paddlenlp server server_token_cls:app --host 0.0.0.0 --port 8189 # 命名实体识别 Client 发送请求 python client_token_cls.py

问答服务:

# 启动问答 Server 服务 paddlenlp server server_qa:app --host 0.0.0.0 --port 8189 # 问答 Client 发送请求 python client_qa.py

SimpleServing 还支持在 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 } }

该方案启动命令简洁(一条paddlenlp server即可拉起服务),适合原型验证;而 FastDeploy Serving 方案支持多后端引擎与 Python 前后处理编排,更适合生产级多模型、多实例的服务场景。

相关文档

  • ERNIE 3.0 模型详细介绍与训练文档:了解在线蒸馏技术、模型效果与训练/导出流程
  • FastDeploy ERNIE 3.0 Python 部署示例:文本分类与序列标注直连部署
  • FastDeploy ERNIE 3.0 Serving 部署示例:服务化部署模型仓库与 gRPC 客户端
  • SimpleServing 服务化部署:轻量 HTTP 服务化方案
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • 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),仅供参考

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

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

立即咨询