PaddleNLP Transformer 机器翻译模型的 Paddle Serving 部署与推理完整指南

发布时间:2026/9/25 20:12:07
PaddleNLP Transformer 机器翻译模型的 Paddle Serving 部署与推理完整指南 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本指南基于 PaddleNLP 仓库中 Transformer 机器翻译示例位于slm/examples/machine_translation/transformer系统讲解如何将训练并导出的英德EN-DE翻译模型通过Paddle Serving以服务化方式部署到服务器并通过客户端发送文本完成在线推理与 BLEU 评估。读完本文你将掌握Paddle Inference 模型到 Serving 模型的转换方法、服务端与客户端的完整启动参数、Serving 请求/响应的数据流转机制以及如何对推理结果进行标准 BLEU 评测。Paddle Serving 简介与安装Paddle Serving 是 PaddlePaddle 提供的高性能、灵活可用的工业级在线服务框架支持模型管理、多模型部署、模型热加载与并发请求处理。与本地直接调用 Paddle Inference 不同Serving 将推理能力封装为可被远程调用的服务服务端加载模型并常驻监听请求客户端通过网络HTTP/RPC把待翻译数据发送给服务端并取回结果。安装时需要在服务端和客户端分别安装相关依赖具体安装方式可以参考 Paddle Serving 官方安装文档如安装 paddle-serving-server 与 paddle-serving-client 等对应版本的依赖包。本示例代码分别在服务端使用paddle_serving_server_gpu.web_service/paddle_serving_server.web_service模块、客户端使用paddle_serving_client.utils模块见 transformer_web_server.py 与 transformer_web_client.py请确保两侧环境都安装了对应的 Serving 包。第一步导出 Paddle Inference 预测模型Serving 部署的前置条件是拥有一份导出的预测模型。Transformer 示例提供了动态图 checkpoint 转静态图预测模型的脚本 export_model.py其核心流程是使用InferTransformerModel按配置文件重建推理模型包含beam_size、max_out_len、beam_search_version、alpha等解码超参加载init_from_params指向的训练权重transformer.pdparams并将 encoder/decoder 的 position encoding 重置为max_length 1对应的表通过paddle.jit.to_static将动态图模型转为静态图输入仅保留src_word一个int64的[None, None]张量即只需传入源语言句子调用paddle.jit.save保存到配置文件inference_model_dir指定的目录。导出命令如下# 进入示例目录 cd slm/examples/machine_translation/transformer python export_model.py --config ./configs/transformer.base.yaml模型导出后infer_model/下的目录结构如下. └── infer_model/ ├── transformer.pdiparams ├── transformer.pdiparams.info └── transformer.pdmodel其中transformer.pdmodel是静态图计算图transformer.pdiparams是模型参数。从源码结构看由于 Serving 转换脚本 export_serving_model.py 默认读取的就是这两个文件名model_filenametransformer.pdmodel、params_filenametransformer.pdiparams所以请不要修改导出文件名。注意如果是基于自定义数据集训练的模型导出时还需要通过--src_vocab、--trg_vocab、--bos_token、--eos_token等参数显式传入词表信息因为导出过程依赖词表构建模型输入。接着将存有导出模型的目录拷贝到 Serving 部署目录deploy/serving/下# 在 deploy/serving/ 目录下执行 cp -rf ../../infer_model/ ./第二步导出 Serving 模型与配置Paddle Inference 的模型不能直接被 Serving 使用需要通过paddle_serving_client.io提供的inference_model_to_serving接口做一次转换。示例脚本 export_serving_model.py 的实现非常简洁feed_names, fetch_names serving_io.inference_model_to_serving( dirnamemodel_dir, serving_servertransformer_server, serving_clienttransformer_client, model_filenametransformer.pdmodel, params_filenametransformer.pdiparams, )注意脚本入口处调用了paddle.enable_static()说明该转换基于静态图模式工作。执行转换python export_serving_model.py --model_dir ./infer_model/执行结束后shell 会打印出 Transformer 模型输入、输出变量的名称这是判断转换是否成功的关键标志model feed_names : dict_keys([src_word]) # 模型输入的变量的名称 model fetch_names : dict_keys([save_infer_model/scale_0.tmp_1]) # 模型输出的变量的名称feed_names只有src_word一个输入Serving 请求中只需携带源语言句子的 token id 序列fetch_names为save_infer_model/scale_0.tmp_1这是 beam search 解码输出的张量名服务端与客户端脚本中都硬编码了这个 fetch 名详见下文源码解析。转换成功后在当前路径下会生成两个新目录transformer_client/和transformer_server/. ├── transformer_client/ ├── serving_client_conf.prototxt └── serving_client_conf.stream.prototxt └── transformer_server/ ├── __model__ ├── __params__ ├── serving_server_conf.prototxt └── serving_server_conf.stream.prototxttransformer_server/供服务端加载__model__/__params__是 Serving 可识别的模型文件serving_server_conf.prototxt描述服务端的输入输出签名transformer_client/供客户端使用serving_client_conf.prototxt等文件让客户端知道如何构造请求、解析响应。第三步启动服务端Transformer 服务端基于 Paddle Serving 的WebService接口实现见 transformer_web_server.py。启动命令如下export CUDA_VISIBLE_DEVICES0 python transformer_web_server.py --config ../../configs/transformer.base.yaml --device gpu --model_dir ./transformer_server各个参数的解释如下参数说明--configyaml 配置文件和训练时使用的相同。不过因为模型导出时已经固定了模型结构模型超参相关配置将不会再起作用仅有reader相关配置如词表、inference_model_dir、bos_idx/eos_idx、pad_seq、n_best等仍会生效--device使用的设备可选gpu或cpu--model_dir导出的 Paddle Serving 可用的模型路径与配置文件中的inference_model_dir对应在这里特指transformer_server/的路径此外脚本还支持两个可选项--benchmark打印各卡日志并使用 benchmark 词表通常无需设置与--profile开启性能剖析。服务端源码机制解析从 transformer_web_server.py 源码可以看到完整的服务端执行链路加载配置启动时读取--config指定的 yaml 文件并打印全部配置项命令行传入的--model_dir会覆盖配置文件里的args.inference_model_dir加载模型service.load_model_config(args.inference_model_dir)加载transformer_server目录下的模型准备服务GPU 模式下service.set_gpus(0)并prepare_server(workdirworkdir, port9292, devicegpu, gpuid0)CPU 模式下devicecpu。默认服务端口为 9292自定义预处理/后处理自定义的TransformerService(WebService)覆写了两个关键钩子def preprocess(self, feed[], fetch[]): # 从请求中取出 src_word交给 TransformerReader 完成 tokenize 与 padding src_word self.transformer_reader.prepare_infer_input(src_sequence) feed_batch {src_word: src_word} fetch [save_infer_model/scale_0.tmp_1] return feed_batch, fetch, True def postprocess(self, feed{}, fetch[], fetch_mapNone): # 将 fetch 到的解码张量 [batch, seq_len, beam] 转置为 [batch, beam, seq_len] # 对每个 beam 调用 post_process_seq 去除 bos/eos再通过词表还原成 token 序列启动服务非 profile 模式先run_rpc_service()再run_web_service()从而同时支持 RPC 与 HTTP 两种调用方式。服务端的数据准备由 transformer_reader.py 中的TransformerReader.prepare_infer_input完成将句子按空格切词、vocab.to_indices转为 id、追加eos并按pad_seq对齐补齐到统一长度最终产出np.asarray(src_word)。其中pad_idx复用bos_idx与配置文件bos_idx: 0对应。第四步启动客户端完成推理在英德翻译的例子中客户端只需要把待翻译的句子发给服务端。这里的句子是经过 tokenize 以及 BPE 切词的序列、用空格连接而成的句子。客户端脚本 transformer_web_client.py 执行方式如下python transformer_web_client.py --config ../../configs/transformer.base.yaml --batch_size 8各个参数的解释如下参数说明--configyaml 配置文件和训练时使用的相同。由于模型结构已在导出时固定模型超参不再起作用仅有reader相关配置如使用的测试集、output_file、infer_batch_size、src_lang等仍有效--batch_size与配置文件中的infer_batch_size意义相同即使用 Paddle Serving 时一个 batch 的句子数目客户端请求机制源码解析从 transformer_web_client.py 源码可以看到客户端通过load_dataset(wmt14ende, splitstest)加载测试集即内置 WMT14 英德测试数据逐句取出sequence[args.src_lang]作为源句子按infer_batch_size攒成一个 batch 后向服务端发起 HTTP 请求url http://127.0.0.1:9292/transformer/prediction data {feed: [{src_word: batch}], fetch: [finished_sequence]} r requests.post(urlurl, headersheaders, datajson.dumps(data))URL 中/transformer对应服务端TransformerService(nametransformer)注册的服务名/prediction是 WebService 的预测端点fetch字段的finished_sequence对应服务端postprocess返回的{finished_sequence: outputs}。收到响应后把每个样本的finished_sequence[0]即n_best中得分最高的翻译逐行写入args.output_file指定的文件配置文件默认output_file: predict.txt。执行完客户端的脚本会在本地生成predict.txt文件存有推理结果。多线程与性能剖析客户端脚本还支持--threads默认 1与--profile两个参数。当开启--profile时会借助paddle_serving_client.utils.MultiThreadRunner启动多线程并发请求并使用 recorder.py 记录每批请求的耗时并输出性能报告可用于服务化部署后的吞吐与延迟基准测试。仓库中还提供了 benchmark_serving.sh 与 benchmark.py 供进一步做 Serving 推理性能压测。模型评估BLEU推理结果中每行输出是对应行输入的得分最高的翻译。对于使用 BPE 的数据预测出的翻译结果也将是 BPE 表示的数据要先还原成 tokenize 后的数据才能进行正确评估BLEU 是翻译任务常用的自动评估指标# 还原 predict.txt 中的预测结果为 tokenize 后的数据 sed -r s/( )|( ?$)//g predict.txt predict.tok.txt # 若无 BLEU 评估工具需先进行下载 git clone https://github.com/moses-smt/mosesdecoder.git # 以英德翻译 newstest2014 测试数据为例 perl mosesdecoder/scripts/generic/multi-bleu.perl ~/.paddlenlp/datasets/WMT14ende/WMT14.en-de/wmt14_ende_data/newstest2014.tok.de predict.tok.txt其中sed命令用于剥掉 BPE 切分符把 BPE 表示还原为 tokenize 后的文本multi-bleu.perl是 Moses 解码器提供的标准 BLEU 计算脚本参考译文路径为 PaddleNLP 数据集缓存目录下 WMT14 测试集的 tokenize 后德语参考newstest2014.tok.de。执行上述操作后可以看到类似如下的结果此处结果是 big model 在 newstest2014 上的 BLEU 结果BLEU 27.48, 58.6/33.2/21.1/13.9 (BP1.000, ratio1.012, hyp_len65312, ref_len64506)BLEU 值越高代表翻译质量越好其后的四元数字分别是 1-gram 到 4-gram 的精确率BP为长度惩罚因子hyp_len/ref_len分别为译文与参考的长度。常见问题与调优提示结合配置文件 transformer.base.yaml 与 transformer.big.yaml 的注释部署时还需注意以下几点推理长度限制配置文件中的max_length决定 position encoding 表的大小。若测试样本长度超过该值超长样本会在预处理阶段被过滤导致预测结果条数少于输入条数同时由于训练时的max_length决定了导出模型 position encoding 的大小预测长度超过训练长度时应调大该值并重新导出导出脚本会按max_length 1重新初始化 position encoding 表。解码相关配置以导出时为准beam_size、max_out_len、n_best、beam_search_version、alpha等解码超参在模型导出时已固化进静态图Serving 部署阶段修改配置文件不会影响解码行为服务端postprocess中n_best截断、bos_idx/eos_idx过滤则读取部署时的配置文件。自定义词表场景若使用自定义数据集训练导出与部署各环节都必须显式传入与训练一致的词表与特殊 tokens、/s、unk等确保 Serving 侧TransformerReader加载的Vocab与模型训练时一致。设备选择--device支持gpu与cpuGPU 部署时需通过CUDA_VISIBLE_DEVICES指定可见卡号服务默认监听9292端口可按需修改 transformer_web_server.py 中的port参数。总结至此我们完成了 PaddleNLP Transformer 机器翻译模型从「Paddle Inference 静态图导出 → Serving 模型转换 → 服务端启动 → 客户端推理 → BLEU 评估」的完整闭环。核心要点可以归纳为四条链路export_model.py负责动转静并产出infer_model/export_serving_model.py通过inference_model_to_serving生成transformer_client/与transformer_server/transformer_web_server.py基于WebService承载模型并提供preprocess/postprocess前后处理transformer_web_client.py以 HTTP POST 访问http://127.0.0.1:9292/transformer/prediction完成批量翻译。读者如需了解本地推理的另一种方案可进一步参阅 使用 Paddle Inference 推理 以及 Python 推理指南、C 推理指南。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP Transformer 机器翻译模型使用 Paddle Inference Python API 部署推理实践PaddleNLP Transformer 机器翻译模型使用 Paddle Inference Python API 部署推理实践 本文基于 PaddleNLP人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Transformer 机器翻译模型 C 部署基于 Paddle Inference C API 的推理、编译与 BLEU 评估实战PaddleNLP Transformer 机器翻译模型 C 部署基于 Paddle Inference C API 的推理、编译与 BLEU 评估实人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Transformer 机器翻译实战从 WMT14 英德翻译的训练、推理到静态图部署PaddleNLP Transformer 机器翻译实战从 WMT14 英德翻译的训练、推理到静态图部署 机器翻译Machine Translation是人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考