十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleNLP FastGeneration 快速推理解析:Transformer Encoder 融合加速 API 实战指南

PaddleNLP FastGeneration 快速推理解析:Transformer Encoder 融合加速 API 实战指南 PaddleNLP FastGeneration 快速推理解析Transformer Encoder 融合加速 API 实战指南【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP本文围绕 PaddleNLP FastGeneration 高性能预测体系中paddlenlp.ops.fast_transformer.transformer.encoder模块展开系统讲解其用于集成 FasterTransformer 的 Encoder 融合加速 APIinfer_transformer_encoder、encoder_forward、encoder_layer_forward、enable_fast_encoder、disable_fast_encoder、convert_to_fp16涵盖参数语义、张量形状约束、掩码约定、JIT 编译机制与工程使用建议。读完本文你将掌握如何为基于paddle.nn.TransformerEncoder的模型接入融合 Encoder 算子以及如何在 FastGeneration 生成管线中开启 Encoder 加速与 FP16 推理。一、背景FastGeneration 与 FasterTransformer 的集成在 PaddleNLP 中对于 Transformer 类模型的 GPU 快速预测官方推荐使用 FastGeneration 功能。根据仓库中的 FAQ.md 说明该功能集成了 NV FasterTransformer 并进行了功能增强用于在 GPU 上对 Transformer 类模型进行快速预测同时服务端部署也可配合 Paddle Inference 高性能预测引擎使用。FastGeneration 的封装定义于paddlenlp.ops.fast_transformer.transformer.fast_transformer模块见 fast_transformer.rstFastGeneration is a fast version for generation with the Transformer model. It uses a custom op based on and enhancing NV FasterTransformer to do fast generation.即FastGeneration 是基于 Transformer 模型的快速生成版本底层使用一个基于 NV FasterTransformer 并做了增强的自定义算子完成快速解码。而本文主角paddlenlp.ops.fast_transformer.transformer.encoder模块正是该体系中专司Encoder 端融合加速的组成部分。从仓库当前结构看paddlenlp/ops目录下如今主要保留custom_all_reduce、distributed、optimizer、triton_ops等模块fast_transformer 相关的算子源码已不在当前目录树中但其完整 API 文档仍保留在 docs/zh/source 及其英文翻译文件encoder.po中且 setup.py 的包数据列表仍将fast_transformer目录包含在内可以推断该功能历史上属于paddlenlp.ops包的一部分。本文以文档记录为准进行讲解。二、模块定位与 API 全景paddlenlp.ops.fast_transformer.transformer.encoder模块对外暴露以下 6 个核心 APIAPI作用类型infer_transformer_encoder集成 FasterTransformer Encoder 推理的融合 Encoder 推理入口函数encoder_forward重定义paddle.nn.TransformerEncoder.forward以接入 FasterTransformer 推理函数encoder_layer_forward重定义paddle.nn.TransformerEncoderLayer.forward以接入 FasterTransformer 推理函数enable_fast_encoder通过 JITJust-In-Time编译融合 Encoder 算子并替换继承自self的TransformerEncoder/TransformerEncoderLayer对象的forward方法disable_fast_encoder恢复被替换的TransformerEncoder/TransformerEncoderLayer对象的原始forward方法convert_to_fp16将paddle.nn.TransformerEncoder的参数由 float32 原地转换为 float16函数整体调用关系可以这样理解enable_fast_encoder是“总开关”它触发 JIT 编译并把encoder_forward/encoder_layer_forward安装到paddle.nn的 Encoder 对象上infer_transformer_encoder是编译后实际执行融合推理的底层入口convert_to_fp16负责把参数切成 FP16 以匹配 FasterTransformer 的 FP16 内核disable_fast_encoder负责在推理结束后还原原始前向逻辑。三、infer_transformer_encoder融合 Encoder 推理入口infer_transformer_encoder被文档描述为Fusion Encoder API integrating Encoder inference in FasterTransformer. It accepts the weight and bias of TransformerEncoder and some other parameters for inference.它接收TransformerEncoder的权重与偏置以及若干推理参数直接调用 FasterTransformer 中融合的 Encoder 内核完成前向计算。这是整个模块中真正“干活”的算子函数——encoder_forward等封装最终都会把paddle.nn层的参数抽取出来转交给infer_transformer_encoder执行。虽然当前仓库中已不包含该函数源码但结合其文档语义可以推断其典型输入应包括各层权重/偏置多头注意力的 Q/K/V/O 投影与 FFN 两层线性变换、num_heads、层数n_layers等结构参数以及输入encoder_input与attn_mask。在使用该 API 时务必保证传入的权重排列与 FasterTransformer 期望的布局一致一般由enable_fast_encoder内部完成参数抽取与排布。四、encoder_forward与encoder_layer_forward重定义 forward 接入融合推理encoder_forward与encoder_layer_forward分别重定义paddle.nn.TransformerEncoder与paddle.nn.TransformerEncoderLayer的forward函数目的是把标准 Paddle 前向替换为 FasterTransformer 融合前向。文档特别强调了两点替换并非无条件生效除非基类对象调用了enable_fast_encoder否则原始forward不会被替换替换无副作用替换之后paddle.nn.TransformerEncoder/TransformerEncoderLayer对象的成员变量与替换前保持一致。推理结束后可通过调用disable_fast_encoder恢复paddle.nn.TransformerEncoder与paddle.nn.TransformerEncoderLayer的原始forward函数。4.1encoder_layer_forward的参数与返回enc_inputTransformer Encoder 层的输入形状为[batch_size, sequence_length, d_model]数据类型应为float32 或 float64。attn_mask多头注意力中用于阻止对某些位置的注意力通常是 padding 位置或未来位置。形状为[batch_size, 1, 1, sequence_length]支持三种数据类型语义bool不希望被注意的位置为False其余为Trueint不希望被注意的位置为0其余为1float不希望被注意的位置为-INF其余为0。当无需屏蔽任何位置时可传None默认为None。返回与enc_input同形状、同数据类型的张量表示 Encoder 层的输出若cache不为None则返回一个元组除层输出外还包含新的 cache——它与传入的cache相同只是incremental_cache的长度有所增加细节可参考paddle.nn.MultiHeadAttention.gen_cache与paddle.nn.MultiHeadAttention.forward。4.2encoder_forward的参数与返回srcTransformer Encoder 的输入形状为[batch_size, sequence_length, d_model]数据类型应为float32 或 float16与 layer 版本相比允许 FP16配合convert_to_fp16使用。src_mask语义与 layer 版本的attn_mask相同形状为[batch_size, 1, 1, sequence_length]但文档强调其数据类型必须为 float不需要被注意的位置取-INF或其他非零值需要被注意的位置必须为0.0。返回与src同形状、同数据类型的张量表示整个 Encoder 的输出若cache不为None则返回元组其中incremental_cache的长度有所增加。实践要点两种 mask 的约定并不完全一致——encoder_layer_forward支持 bool/int/float 三种语义而encoder_forward明确要求 float 类型掩码。接入时务必按对应入口的要求构造掩码避免数据类型不匹配导致融合算子行为异常。五、enable_fast_encoder与disable_fast_encoderJIT 编译与前后向切换5.1enable_fast_encoderJIT 编译并替换 forwardenable_fast_encoder是接入融合 Encoder 的入口方法文档描述如下Compiles fusion encoder operator integrated FasterTransformer using the method of JIT (Just-In-Time) and replaces theforwardfunction ofpaddle.nn.TransformerEncoderandpaddle.nn.TransformerEncoderLayerobjects inherited fromselfto support inference using FasterTransformer.其工作流程可以拆解为三步JIT 编译融合算子在首次调用时通过即时编译Just-In-Time方式编译集成 FasterTransformer 的融合 Encoder 算子编译产物会被缓存后续调用直接复用替换 forward将继承自self的paddle.nn.TransformerEncoder与paddle.nn.TransformerEncoderLayer对象的forward替换为融合版本即上文encoder_forward/encoder_layer_forward保持对象状态替换后对象拥有的成员变量与之前保持一致因此对上层代码透明。由于是 JIT 编译首次调用会引入额外编译开销属于一次性的“预热成本”适合在推理会话开始时统一启用而不是在循环内反复开关。5.2disable_fast_encoder恢复原始前向disable_fast_encoder与enable_fast_encoder成对出现Restores the originalforwardfunction ofpaddle.nn.TransformerEncoderandpaddle.nn.TransformerEncoderLayerobjects inherited fromself.它将继承自self的TransformerEncoder/TransformerEncoderLayer对象的forward恢复为 Paddle 原始实现。典型用法是在融合推理结束后调用让模型回到可继续训练或使用标准前向的状态。推荐以 try/finally 或上下文管理的方式保证成对调用避免异常路径上留下被替换的 forward。5.3 与 FastGeneration 生成管线的衔接在更上层的FasterTransformer类定义见 fast_transformer.rst中存在两个与 Encoder 加速直接相关的构造参数enable_fast_encoderbool可选是否使用 fast 版本的 Encoder。文档标注这是一个实验性选项experimental option默认为 False。开启后会为生成模型接入上述融合 Encoder 算子加速源文本编码阶段use_fp16_encoderbool可选是否对 Encoder 使用 FP16。仅在enable_fast_encoder为 True 时生效默认为 False。它与生成侧独立的use_fp16_decoding参数互不干扰。因此一个完整的“快速 Encoder FP16”配置组合为enable_fast_encoderTrue, use_fp16_encoderTrue配合底层的convert_to_fp16将 Encoder 权重切换为半精度。六、convert_to_fp16将 Encoder 参数原地转换为半精度FP16 是 FasterTransformer 融合内核提速的关键之一。convert_to_fp16的函数签名与语义如下Convertpaddle.nn.TransformerEncoders parameter from float32 to float16.输入model一个待原地转换为 float16 的对象必须是paddle.nn.TransformerEncoder的实例isinstance 校验行为原地inplace转换所有参数不返回新模型。实践要点由于是原地修改调用前请确认原模型权重已保存或不再需要 float32 版本该函数只处理TransformerEncoder的参数若模型还有其他需要 FP16 的部分需另行处理开启 FP16 后请关注数值精度尤其当序列较长、层数较深时必要时可用 float32 版本做精度对照。七、在 Taskflow 中开启 FastGeneration 快速预测除了面向开发者的底层 APIPaddleNLP 的 Taskflow 也暴露了 FastGeneration 的开关。根据 taskflow.md 的说明use_fast表示是否开启基于 FastGeneration 的高性能预测注意 FastGeneration 的高性能预测仅支持 gpu默认为 False。即use_fastTrue时Taskflow 在 GPU 上会走 FastGeneration 高性能预测路径在 CPU 上该选项不生效。这与底层 API 的约束一致FastGeneration 依赖 NVIDIA GPU 上的 FasterTransformer 内核因此所有相关加速包括本模块的融合 Encoder都仅面向 GPU 环境。八、使用建议与限制总结综合文档与仓库信息使用paddlenlp.ops.fast_transformer.transformer.encoder模块时建议遵循以下原则环境前提融合 Encoder 加速依赖 GPU 上的 FasterTransformer 内核仅支持 GPU 环境参考 taskflow.md 对use_fast的说明成对开关enable_fast_encoder与disable_fast_encoder成对使用推理结束后恢复原始 forward一次性启用JIT 编译有一次性开销建议在推理会话开始时启用避免频繁开关掩码类型匹配encoder_forward要求 float 类型掩码不需要位置为-INF或非零、需要位置为0.0encoder_layer_forward支持 bool/int/float 三种语义按入口要求构造FP16 谨慎开启use_fp16_encoder仅在enable_fast_encoderTrue时生效开启前确保权重已保存开启后建议做精度验证实验性定位enable_fast_encoder在 FastGeneration 构造参数中标注为实验性选项默认 False生产接入前建议先在小规模样本上验证正确性与收益输入形状约定Encoder 输入统一为[batch_size, sequence_length, d_model]输出与其同形状同类型cache 存在时返回含增量 cache 的元组。通过本模块开发者可以在保留paddle.nn.TransformerEncoder上层编程接口的同时把 Encoder 前向切换到 FasterTransformer 融合内核配合 FastGeneration 的生成侧加速与 FP16 精度优化实现 Transformer 类模型 GPU 推理的端到端加速。更多相关文档可继续查阅 paddlenlp.ops.fast_transformer.transformer.rst、fast_transformer.rst 与 paddlenlp.ops.rst。【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表