From b9c92e579c5fb143b950b9b068c4d4e2a800c4b4 Mon Sep 17 00:00:00 2001 From: Wanglongzhi2001 <583087864@qq.com> Date: Mon, 25 Nov 2024 17:55:38 +0800 Subject: [PATCH 1/3] Add document for speculative decoding --- llm/docs/predict/inference.md | 87 ++++++++++++++++++++--------------- llm/predict/predictor.py | 4 +- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/llm/docs/predict/inference.md b/llm/docs/predict/inference.md index c85bc4711add..e688630d46e9 100644 --- a/llm/docs/predict/inference.md +++ b/llm/docs/predict/inference.md @@ -1,25 +1,25 @@ # 大模型推理教程 -PaddleNLP以一站式体验、极致性能为设计理念,实现大模型的快速推理。 +PaddleNLP 以一站式体验、极致性能为设计理念,实现大模型的快速推理。 -PaddleNLP大模型推理构建了高性能推理方案: +PaddleNLP 大模型推理构建了高性能推理方案: - 内置动态插入和全环节算子融合策略 -- 支持PageAttention、FlashDecoding优化 +- 支持 PageAttention、FlashDecoding 优化 -- 支持Weight Only INT8及INT4推理,支持权重、激活、Cache KV进行INT8、FP8量化的推理 +- 支持 Weight Only INT8及 INT4推理,支持权重、激活、Cache KV 进行 INT8、FP8量化的推理 - 提供动态图推理和静态图推理两种方式 -PaddleNLP大模型推理提供压缩、推理、服务全流程体验 : +PaddleNLP 大模型推理提供压缩、推理、服务全流程体验 : -- 提供多种PTQ技术,提供WAC(权重/激活/缓存)灵活可配的量化能力,支持INT8、FP8、4Bit量化能力 +- 提供多种 PTQ 技术,提供 WAC(权重/激活/缓存)灵活可配的量化能力,支持 INT8、FP8、4Bit 量化能力 -- 支持多硬件大模型推理,包括[昆仑XPU](../../xpu/llama/README.md)、[昇腾NPU](../../npu/llama/README.md)、[海光K100](../dcu_install.md)、[燧原GCU](../../gcu/llama/README.md)、[X86 CPU](../cpu_install.md)等 +- 支持多硬件大模型推理,包括[昆仑 XPU](../../xpu/llama/README.md)、[昇腾 NPU](../../npu/llama/README.md)、[海光 K100](../dcu_install.md)、[燧原 GCU](../../gcu/llama/README.md)、[X86 CPU](../cpu_install.md)等 -- 提供面向服务器场景的部署服务,支持连续批处理(continuous batching)、流式输出等功能,HTTP协议的服务接口 +- 提供面向服务器场景的部署服务,支持连续批处理(continuous batching)、流式输出等功能,HTTP 协议的服务接口 ## 1. 模型支持 @@ -40,7 +40,7 @@ PaddleNLP 中已经添加高性能推理模型相关实现,已验证过的模 PaddleNLP 提供了多种硬件平台和精度支持,包括: -| Precision | Hopper| Ada | Ampere | Turing | Volta | 昆仑XPU | 昇腾NPU | 海光K100 | 燧原GCU | x86 CPU | +| Precision | Hopper| Ada | Ampere | Turing | Volta | 昆仑 XPU | 昇腾 NPU | 海光 K100 | 燧原 GCU | x86 CPU | |:--------------:|:-----:|:---:|:------:|:------:|:-----:|:------:|:-------:|:-------:|:------:|:-------:| | FP32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | FP16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | @@ -55,61 +55,73 @@ PaddleNLP 提供了多种参数,用于配置推理模型和优化推理性能 ### 3.1 常规参数 -- `model_name_or_path`: 必需,预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为None。 +- `model_name_or_path`: 必需,预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为 None。 -- `dtype`: 必需,模型参数dtype,默认为None。如果没有传入`lora_path`或`prefix_path`则必须传入`dtype`参数。 +- `dtype`: 必需,模型参数 dtype,默认为 None。如果没有传入`lora_path`或`prefix_path`则必须传入`dtype`参数。 -- `lora_path`: LoRA参数和配置路径,对LoRA参数进行初始化,默认为None。 +- `lora_path`: LoRA 参数和配置路径,对 LoRA 参数进行初始化,默认为 None。 -- `prefix_path`: Prefix Tuning参数和配置路径,对Prefix Tuning参数进行初始化,默认为None。 +- `prefix_path`: Prefix Tuning 参数和配置路径,对 Prefix Tuning 参数进行初始化,默认为 None。 - `batch_size`: 批处理大小,默认为1。该参数越大,占用显存越高;该参数越小,占用显存越低。 -- `data_file`: 待推理json文件,默认为None。样例数据: +- `data_file`: 待推理 json 文件,默认为 None。样例数据: ```json {"tgt":"", "src": "写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事"} {"tgt":"", "src": "我要采访一位科幻作家,创建一个包含5个问题的列表"} ``` -- `output_file`: 保存推理结果文件,默认为output.json。 +- `output_file`: 保存推理结果文件,默认为 output.json。 -- `device`: 运行环境,默认为gpu,可选的数值有gpu、[cpu](../cpu_install.md)、[xpu](../../xpu/llama/README.md)、[npu](../../npu/llama/README.md)、[gcu](../../gcu/llama/README.md)等([dcu](../dcu_install.md)与gpu推理命令一致)。 +- `device`: 运行环境,默认为 gpu,可选的数值有 gpu、[cpu](../cpu_install.md)、[xpu](../../xpu/llama/README.md)、[npu](../../npu/llama/README.md)、[gcu](../../gcu/llama/README.md)等([dcu](../dcu_install.md)与 gpu 推理命令一致)。 - `model_type`: 初始化不同类型模型,gpt-3: GPTForCausalLM; ernie-3.5-se: Ernie35ForCausalLM; 默认为 None。 - `mode`: 使用动态图或者静态图推理,可选值有`dynamic`、 `static`,默认为`dynamic`。 -- `avx_model`: 当使用CPU推理时,是否使用AvxModel,默认为False。参考[CPU推理教程](../cpu_install.md)。 +- `avx_model`: 当使用 CPU 推理时,是否使用 AvxModel,默认为 False。参考[CPU 推理教程](../cpu_install.md)。 -- `avx_type`: avx计算类型,默认为None。可选的数值有`fp16`、 `bf16`。 +- `avx_type`: avx 计算类型,默认为 None。可选的数值有`fp16`、 `bf16`。 -- `src_length`: 模型输入上下文最大token长度,默认为1024。 +- `src_length`: 模型输入上下文最大 token 长度,默认为1024。 -- `max_length`:模型输入(上下文+生成内容)的最大token长度, 默认为2048。 +- `max_length`:模型输入(上下文+生成内容)的最大 token 长度, 默认为2048。 ### 3.2 性能优化参数 - `inference_model`: 是否使用 Inference Model 推理,默认值为 False。Inference Model 内置动态插入和全环节算子融合策略,开启后性能更优。 -- `block_attn`: 是否使用 Block Attention 推理, 默认值为False。Block Attention 是基于 PageAttention 的思想设计并实现的,在保持高性能推理和动态插入的基础上可以动态地为 cachekv 分配存储空间,极大地节省显存并提升推理的吞吐。 +- `block_attn`: 是否使用 Block Attention 推理, 默认值为 False。Block Attention 是基于 PageAttention 的思想设计并实现的,在保持高性能推理和动态插入的基础上可以动态地为 cachekv 分配存储空间,极大地节省显存并提升推理的吞吐。 -- `append_attn`: Append Attention 在 Block Attention 实现的基础上,进一步借鉴 FlashInfer 的实现对 Attention 模块进行了优化,并增加了C4的高性能支持,极大地提升了推理性能。属于是 Block Attention 实现的升级版,此选项可替代`block_attn`单独开启。 +- `append_attn`: Append Attention 在 Block Attention 实现的基础上,进一步借鉴 FlashInfer 的实现对 Attention 模块进行了优化,并增加了 C4的高性能支持,极大地提升了推理性能。属于是 Block Attention 实现的升级版,此选项可替代`block_attn`单独开启。 - `block_size`: 如果使用 Block Attention 或者 Append Attention 推理,指定一个 Block 可以存储的 token 数量,默认值为64。 ### 3.3 量化参数 -PaddleNLP 提供了多种量化策略,支持Weight Only INT8及INT4推理,支持WAC(权重、激活、Cache KV)进行INT8、FP8量化的推理 +PaddleNLP 提供了多种量化策略,支持 Weight Only INT8及 INT4推理,支持 WAC(权重、激活、Cache KV)进行 INT8、FP8量化的推理 -- `quant_type`: 是否使用量化推理,默认值为None。可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。`a8w8`与`a8w8_fp8`需要额外的act和weight的scale校准表,推理传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +- `quant_type`: 是否使用量化推理,默认值为 None。可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。`a8w8`与`a8w8_fp8`需要额外的 act 和weight 的scale 校准表,推理传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 -- `cachekv_int8_type`: 是否使用cachekv int8量化,默认值为None。可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的cache kv的scale校准表,传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +- `cachekv_int8_type`: 是否使用 cachekv int8量化,默认值为 None。可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的 cache kv 的scale 校准表,传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +### 3.5 投机解码参数 -### 3.4 解码策略参数 +- `speculate_method`: 推理解码算法,默认值为`None`,可选的数值有`None`、`inference_with_reference`。为`None`时为正常自回归解码,为`inference_with_reference`时为基于上下文的投机解码[论文地址](https://arxiv.org/pdf/2304.04487)。 + +- `speculate_max_draft_token_num`: 投机解码算法中每轮产生的最大 draft tokens 数目,默认值为 1。 + +- `speculate_max_ngram_size`: ngram 匹配 draft tokens 时的最大窗口大小,默认值为`1`。inference_with_reference 算法中会先从 prompt 中使用 ngram 窗口滑动匹配 draft tokens,窗口大小和输入输出重叠程度共同决定了产生 draft tokens 的开销从而影响 inference_with_reference 算法的加速效果。 + +- `speculate_verify_window`: 投机解码 verify 策略默认采用 TopP + TopK 验证中的 K,默认值为`2`。 + +- `speculate_max_candidate_len`: 产生的最大候选 tokens 数目,根据候选 tokens 与 draft tokens 比较来进行 verify,默认值为`5`。 + + +### 3.6 解码策略参数 - `decode_strategy`: 推理解码策略,默认值为`sampling`,可选的数值有`greedy_search`、`beam_search`和`sampling`。 @@ -117,11 +129,11 @@ PaddleNLP 提供了多种量化策略,支持Weight Only INT8及INT4推理, - `top_p`:“采样”策略中 top-p 过滤的累积概率。默认值为1.0,表示不起作用。 -- `temperature`:“采样”策略中会对输出logit除以temperature。默认值为1.0,表示不起作用。 +- `temperature`:“采样”策略中会对输出 logit 除以 temperature。默认值为1.0,表示不起作用。 -### 3.4 性能分析参数 +### 3.7 性能分析参数 -- `benchmark`: 是否开启性能分析,默认值为False。如果设为true,会将模型输入填充为src_length并强制解码到max_length,并计算模型推理吞吐量、记录推理时间。 +- `benchmark`: 是否开启性能分析,默认值为 False。如果设为 true,会将模型输入填充为 src_length 并强制解码到 max_length,并计算模型推理吞吐量、记录推理时间。 ## 4. 快速开始 @@ -132,7 +144,7 @@ PaddleNLP 提供了多种量化策略,支持Weight Only INT8及INT4推理, ### 4.2 推理示例 -下面给出Llama2-7B的动态图推理示例: +下面给出 Llama2-7B 的动态图推理示例: ```shell # 动态图模型推理命令参考 @@ -157,8 +169,8 @@ python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat -- **Note:** 1. `quant_type`可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。 -2. `a8w8`与`a8w8_fp8`需要额外的act和weight的scale校准表,推理传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 -3. `cachekv_int8_type`可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的cache kv的scale校准表,传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +2. `a8w8`与`a8w8_fp8`需要额外的 act 和weight 的scale 校准表,推理传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +3. `cachekv_int8_type`可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的 cache kv 的scale 校准表,传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 更多大模型推理教程: @@ -181,13 +193,12 @@ python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat -- 更多硬件大模型推理教程: -- [昆仑XPU](../../xpu/llama/README.md) -- [昇腾NPU](../../npu/llama/README.md) -- [海光K100](../dcu_install.md) -- [燧原GCU](../../gcu/llama/README.md) +- [昆仑 XPU](../../xpu/llama/README.md) +- [昇腾 NPU](../../npu/llama/README.md) +- [海光 K100](../dcu_install.md) +- [燧原 GCU](../../gcu/llama/README.md) - [X86 CPU](../cpu_install.md) ## 致谢 -我们参考[FlashInfer框架](https://github.com/flashinfer-ai/flashinfer),在FlashInfer的基础上,实现了append attention。参考[PageAttention](https://github.com/vllm-project/vllm)的page分块的思想实现了generation阶段的block attention。基于[Flash Decoding](https://github.com/Dao-AILab/flash-attention)的KV分块思想实现了长sequence场景下的推理加速。基于[Flash Attention2](https://github.com/Dao-AILab/flash-attention)实现了prefill阶段的attention加速。FP8 GEMM基于[CUTLASS](https://github.com/NVIDIA/cutlass)的高性能模板库实现。有部分算子如gemm_dequant参考了[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM)和[FasterTransformer](https://github.com/NVIDIA/FasterTransformer.git)的实现和优化思路。 - +我们参考[FlashInfer 框架](https://github.com/flashinfer-ai/flashinfer),在 FlashInfer 的基础上,实现了 append attention。参考[PageAttention](https://github.com/vllm-project/vllm)的 page 分块的思想实现了 generation 阶段的 block attention。基于[Flash Decoding](https://github.com/Dao-AILab/flash-attention)的 KV 分块思想实现了长 sequence 场景下的推理加速。基于[Flash Attention2](https://github.com/Dao-AILab/flash-attention)实现了 prefill 阶段的 attention 加速。FP8 GEMM 基于[CUTLASS](https://github.com/NVIDIA/cutlass)的高性能模板库实现。有部分算子如 gemm_dequant 参考了[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM)和[FasterTransformer](https://github.com/NVIDIA/FasterTransformer.git)的实现和优化思路。 diff --git a/llm/predict/predictor.py b/llm/predict/predictor.py index 8e8770f138d8..38175df140cc 100644 --- a/llm/predict/predictor.py +++ b/llm/predict/predictor.py @@ -139,9 +139,7 @@ class PredictorArgument: ) speculate_method: str = field( default=None, - metadata={ - "help": "speculate method, it should be one of ['None', 'autoregressive', 'inference_with_reference']" - }, + metadata={"help": "speculate method, it should be one of ['None', 'inference_with_reference']"}, ) speculate_max_draft_token_num: int = field( default=1, From 87571387695f7e355cc2b72d1ae5dce3aa921645 Mon Sep 17 00:00:00 2001 From: Wanglongzhi2001 <583087864@qq.com> Date: Mon, 25 Nov 2024 19:05:57 +0800 Subject: [PATCH 2/3] update --- llm/docs/predict/inference.md | 78 ++++++++++++------------ llm/docs/predict/speculative_decoding.md | 19 ++++++ 2 files changed, 58 insertions(+), 39 deletions(-) create mode 100644 llm/docs/predict/speculative_decoding.md diff --git a/llm/docs/predict/inference.md b/llm/docs/predict/inference.md index e688630d46e9..1411567a2ec3 100644 --- a/llm/docs/predict/inference.md +++ b/llm/docs/predict/inference.md @@ -1,25 +1,25 @@ # 大模型推理教程 -PaddleNLP 以一站式体验、极致性能为设计理念,实现大模型的快速推理。 +PaddleNLP以一站式体验、极致性能为设计理念,实现大模型的快速推理。 -PaddleNLP 大模型推理构建了高性能推理方案: +PaddleNLP大模型推理构建了高性能推理方案: - 内置动态插入和全环节算子融合策略 -- 支持 PageAttention、FlashDecoding 优化 +- 支持PageAttention、FlashDecoding优化 -- 支持 Weight Only INT8及 INT4推理,支持权重、激活、Cache KV 进行 INT8、FP8量化的推理 +- 支持Weight Only INT8及INT4推理,支持权重、激活、Cache KV进行INT8、FP8量化的推理 - 提供动态图推理和静态图推理两种方式 -PaddleNLP 大模型推理提供压缩、推理、服务全流程体验 : +PaddleNLP大模型推理提供压缩、推理、服务全流程体验 : -- 提供多种 PTQ 技术,提供 WAC(权重/激活/缓存)灵活可配的量化能力,支持 INT8、FP8、4Bit 量化能力 +- 提供多种PTQ技术,提供WAC(权重/激活/缓存)灵活可配的量化能力,支持INT8、FP8、4Bit量化能力 -- 支持多硬件大模型推理,包括[昆仑 XPU](../../xpu/llama/README.md)、[昇腾 NPU](../../npu/llama/README.md)、[海光 K100](../dcu_install.md)、[燧原 GCU](../../gcu/llama/README.md)、[X86 CPU](../cpu_install.md)等 +- 支持多硬件大模型推理,包括[昆仑XPU](../../xpu/llama/README.md)、[昇腾NPU](../../npu/llama/README.md)、[海光K100](../dcu_install.md)、[燧原GCU](../../gcu/llama/README.md)、[X86 CPU](../cpu_install.md)等 -- 提供面向服务器场景的部署服务,支持连续批处理(continuous batching)、流式输出等功能,HTTP 协议的服务接口 +- 提供面向服务器场景的部署服务,支持连续批处理(continuous batching)、流式输出等功能,HTTP协议的服务接口 ## 1. 模型支持 @@ -40,7 +40,7 @@ PaddleNLP 中已经添加高性能推理模型相关实现,已验证过的模 PaddleNLP 提供了多种硬件平台和精度支持,包括: -| Precision | Hopper| Ada | Ampere | Turing | Volta | 昆仑 XPU | 昇腾 NPU | 海光 K100 | 燧原 GCU | x86 CPU | +| Precision | Hopper| Ada | Ampere | Turing | Volta | 昆仑XPU | 昇腾NPU | 海光K100 | 燧原GCU | x86 CPU | |:--------------:|:-----:|:---:|:------:|:------:|:-----:|:------:|:-------:|:-------:|:------:|:-------:| | FP32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | FP16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | @@ -55,60 +55,60 @@ PaddleNLP 提供了多种参数,用于配置推理模型和优化推理性能 ### 3.1 常规参数 -- `model_name_or_path`: 必需,预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为 None。 +- `model_name_or_path`: 必需,预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为None。 -- `dtype`: 必需,模型参数 dtype,默认为 None。如果没有传入`lora_path`或`prefix_path`则必须传入`dtype`参数。 +- `dtype`: 必需,模型参数dtype,默认为None。如果没有传入`lora_path`或`prefix_path`则必须传入`dtype`参数。 -- `lora_path`: LoRA 参数和配置路径,对 LoRA 参数进行初始化,默认为 None。 +- `lora_path`: LoRA参数和配置路径,对LoRA参数进行初始化,默认为None。 -- `prefix_path`: Prefix Tuning 参数和配置路径,对 Prefix Tuning 参数进行初始化,默认为 None。 +- `prefix_path`: Prefix Tuning参数和配置路径,对Prefix Tuning参数进行初始化,默认为None。 - `batch_size`: 批处理大小,默认为1。该参数越大,占用显存越高;该参数越小,占用显存越低。 -- `data_file`: 待推理 json 文件,默认为 None。样例数据: +- `data_file`: 待推理json文件,默认为None。样例数据: ```json {"tgt":"", "src": "写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事"} {"tgt":"", "src": "我要采访一位科幻作家,创建一个包含5个问题的列表"} ``` -- `output_file`: 保存推理结果文件,默认为 output.json。 +- `output_file`: 保存推理结果文件,默认为output.json。 -- `device`: 运行环境,默认为 gpu,可选的数值有 gpu、[cpu](../cpu_install.md)、[xpu](../../xpu/llama/README.md)、[npu](../../npu/llama/README.md)、[gcu](../../gcu/llama/README.md)等([dcu](../dcu_install.md)与 gpu 推理命令一致)。 +- `device`: 运行环境,默认为gpu,可选的数值有gpu、[cpu](../cpu_install.md)、[xpu](../../xpu/llama/README.md)、[npu](../../npu/llama/README.md)、[gcu](../../gcu/llama/README.md)等([dcu](../dcu_install.md)与gpu推理命令一致)。 - `model_type`: 初始化不同类型模型,gpt-3: GPTForCausalLM; ernie-3.5-se: Ernie35ForCausalLM; 默认为 None。 - `mode`: 使用动态图或者静态图推理,可选值有`dynamic`、 `static`,默认为`dynamic`。 -- `avx_model`: 当使用 CPU 推理时,是否使用 AvxModel,默认为 False。参考[CPU 推理教程](../cpu_install.md)。 +- `avx_model`: 当使用CPU推理时,是否使用AvxModel,默认为False。参考[CPU推理教程](../cpu_install.md)。 -- `avx_type`: avx 计算类型,默认为 None。可选的数值有`fp16`、 `bf16`。 +- `avx_type`: avx计算类型,默认为None。可选的数值有`fp16`、 `bf16`。 -- `src_length`: 模型输入上下文最大 token 长度,默认为1024。 +- `src_length`: 模型输入上下文最大token长度,默认为1024。 -- `max_length`:模型输入(上下文+生成内容)的最大 token 长度, 默认为2048。 +- `max_length`:模型输入(上下文+生成内容)的最大token长度, 默认为2048。 ### 3.2 性能优化参数 - `inference_model`: 是否使用 Inference Model 推理,默认值为 False。Inference Model 内置动态插入和全环节算子融合策略,开启后性能更优。 -- `block_attn`: 是否使用 Block Attention 推理, 默认值为 False。Block Attention 是基于 PageAttention 的思想设计并实现的,在保持高性能推理和动态插入的基础上可以动态地为 cachekv 分配存储空间,极大地节省显存并提升推理的吞吐。 +- `block_attn`: 是否使用 Block Attention 推理, 默认值为False。Block Attention 是基于 PageAttention 的思想设计并实现的,在保持高性能推理和动态插入的基础上可以动态地为 cachekv 分配存储空间,极大地节省显存并提升推理的吞吐。 -- `append_attn`: Append Attention 在 Block Attention 实现的基础上,进一步借鉴 FlashInfer 的实现对 Attention 模块进行了优化,并增加了 C4的高性能支持,极大地提升了推理性能。属于是 Block Attention 实现的升级版,此选项可替代`block_attn`单独开启。 +- `append_attn`: Append Attention 在 Block Attention 实现的基础上,进一步借鉴 FlashInfer 的实现对 Attention 模块进行了优化,并增加了C4的高性能支持,极大地提升了推理性能。属于是 Block Attention 实现的升级版,此选项可替代`block_attn`单独开启。 - `block_size`: 如果使用 Block Attention 或者 Append Attention 推理,指定一个 Block 可以存储的 token 数量,默认值为64。 ### 3.3 量化参数 -PaddleNLP 提供了多种量化策略,支持 Weight Only INT8及 INT4推理,支持 WAC(权重、激活、Cache KV)进行 INT8、FP8量化的推理 +PaddleNLP 提供了多种量化策略,支持Weight Only INT8及INT4推理,支持WAC(权重、激活、Cache KV)进行INT8、FP8量化的推理 -- `quant_type`: 是否使用量化推理,默认值为 None。可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。`a8w8`与`a8w8_fp8`需要额外的 act 和weight 的scale 校准表,推理传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +- `quant_type`: 是否使用量化推理,默认值为None。可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。`a8w8`与`a8w8_fp8`需要额外的act和weight的scale校准表,推理传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 -- `cachekv_int8_type`: 是否使用 cachekv int8量化,默认值为 None。可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的 cache kv 的scale 校准表,传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +- `cachekv_int8_type`: 是否使用cachekv int8量化,默认值为None。可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的cache kv的scale校准表,传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 -### 3.5 投机解码参数 +### 3.4 投机解码参数 - `speculate_method`: 推理解码算法,默认值为`None`,可选的数值有`None`、`inference_with_reference`。为`None`时为正常自回归解码,为`inference_with_reference`时为基于上下文的投机解码[论文地址](https://arxiv.org/pdf/2304.04487)。 @@ -120,8 +120,7 @@ PaddleNLP 提供了多种量化策略,支持 Weight Only INT8及 INT4推理, - `speculate_max_candidate_len`: 产生的最大候选 tokens 数目,根据候选 tokens 与 draft tokens 比较来进行 verify,默认值为`5`。 - -### 3.6 解码策略参数 +### 3.5 解码策略参数 - `decode_strategy`: 推理解码策略,默认值为`sampling`,可选的数值有`greedy_search`、`beam_search`和`sampling`。 @@ -129,11 +128,11 @@ PaddleNLP 提供了多种量化策略,支持 Weight Only INT8及 INT4推理, - `top_p`:“采样”策略中 top-p 过滤的累积概率。默认值为1.0,表示不起作用。 -- `temperature`:“采样”策略中会对输出 logit 除以 temperature。默认值为1.0,表示不起作用。 +- `temperature`:“采样”策略中会对输出logit除以temperature。默认值为1.0,表示不起作用。 -### 3.7 性能分析参数 +### 3.6 性能分析参数 -- `benchmark`: 是否开启性能分析,默认值为 False。如果设为 true,会将模型输入填充为 src_length 并强制解码到 max_length,并计算模型推理吞吐量、记录推理时间。 +- `benchmark`: 是否开启性能分析,默认值为False。如果设为true,会将模型输入填充为src_length并强制解码到max_length,并计算模型推理吞吐量、记录推理时间。 ## 4. 快速开始 @@ -144,7 +143,7 @@ PaddleNLP 提供了多种量化策略,支持 Weight Only INT8及 INT4推理, ### 4.2 推理示例 -下面给出 Llama2-7B 的动态图推理示例: +下面给出Llama2-7B的动态图推理示例: ```shell # 动态图模型推理命令参考 @@ -169,14 +168,15 @@ python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat -- **Note:** 1. `quant_type`可选的数值有`weight_only_int8`、`weight_only_int4`、`a8w8`和`a8w8_fp8`。 -2. `a8w8`与`a8w8_fp8`需要额外的 act 和weight 的scale 校准表,推理传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 -3. `cachekv_int8_type`可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的 cache kv 的scale 校准表,传入的 `model_name_or_path` 为 PTQ 校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +2. `a8w8`与`a8w8_fp8`需要额外的act和weight的scale校准表,推理传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 +3. `cachekv_int8_type`可选`dynamic`(已不再维护,不建议使用)和`static`两种,`static`需要额外的cache kv的scale校准表,传入的 `model_name_or_path` 为PTQ校准产出的量化模型。量化模型导出参考[大模型量化教程](../quantization.md)。 更多大模型推理教程: - [llama](./llama.md) - [qwen](./qwen.md) - [mixtral](./mixtral.md) +- [投机解码](./speculative_decoding.md) 环境准备,参考: @@ -193,12 +193,12 @@ python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat -- 更多硬件大模型推理教程: -- [昆仑 XPU](../../xpu/llama/README.md) -- [昇腾 NPU](../../npu/llama/README.md) -- [海光 K100](../dcu_install.md) -- [燧原 GCU](../../gcu/llama/README.md) +- [昆仑XPU](../../xpu/llama/README.md) +- [昇腾NPU](../../npu/llama/README.md) +- [海光K100](../dcu_install.md) +- [燧原GCU](../../gcu/llama/README.md) - [X86 CPU](../cpu_install.md) ## 致谢 -我们参考[FlashInfer 框架](https://github.com/flashinfer-ai/flashinfer),在 FlashInfer 的基础上,实现了 append attention。参考[PageAttention](https://github.com/vllm-project/vllm)的 page 分块的思想实现了 generation 阶段的 block attention。基于[Flash Decoding](https://github.com/Dao-AILab/flash-attention)的 KV 分块思想实现了长 sequence 场景下的推理加速。基于[Flash Attention2](https://github.com/Dao-AILab/flash-attention)实现了 prefill 阶段的 attention 加速。FP8 GEMM 基于[CUTLASS](https://github.com/NVIDIA/cutlass)的高性能模板库实现。有部分算子如 gemm_dequant 参考了[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM)和[FasterTransformer](https://github.com/NVIDIA/FasterTransformer.git)的实现和优化思路。 +我们参考[FlashInfer框架](https://github.com/flashinfer-ai/flashinfer),在FlashInfer的基础上,实现了append attention。参考[PageAttention](https://github.com/vllm-project/vllm)的page分块的思想实现了generation阶段的block attention。基于[Flash Decoding](https://github.com/Dao-AILab/flash-attention)的KV分块思想实现了长sequence场景下的推理加速。基于[Flash Attention2](https://github.com/Dao-AILab/flash-attention)实现了prefill阶段的attention加速。FP8 GEMM基于[CUTLASS](https://github.com/NVIDIA/cutlass)的高性能模板库实现。有部分算子如gemm_dequant参考了[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM)和[FasterTransformer](https://github.com/NVIDIA/FasterTransformer.git)的实现和优化思路。 diff --git a/llm/docs/predict/speculative_decoding.md b/llm/docs/predict/speculative_decoding.md new file mode 100644 index 000000000000..e585220694af --- /dev/null +++ b/llm/docs/predict/speculative_decoding.md @@ -0,0 +1,19 @@ +# 投机解码教程 + +投机解码是一个通过投机性地一次性猜测多个 token 然后进行验证和接收的算法,通过投机解码可以极大地减小推理时延。PaddleNLP 提供了简单、高效的投机解码推理流程。下面提供 PaddleNLP 中各种投机解码算法的使用说明。 + +## Inference with reference + +该算法通过 n-gram 窗口从 prompt 中匹配 draft tokens,适合输入和输出有很大 overlap 的场景如代码编辑、文档查询等,更多信息查看查看[论文地址](https://arxiv.org/pdf/2304.04487)。 + +### 使用命令 + +```shell +# 动态图模型推理命令参考 +python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --speculate_method inference_with_reference --speculate_max_draft_token_num 5 --speculate_max_ngram_size 2 +``` + +**Note:** + +1. 该算法目前只支持 llama 系列模型 +2. 投机解码同时支持量化推理,具体命令参考[推理示例](./inference.md),将 speculate_method 等投机解码参数加上即可。 From d4dfb65cf55521832b60b658407aa6e68247cc5a Mon Sep 17 00:00:00 2001 From: Wanglongzhi2001 <583087864@qq.com> Date: Tue, 26 Nov 2024 17:23:19 +0800 Subject: [PATCH 3/3] update docu --- llm/docs/predict/inference.md | 6 +++--- llm/docs/predict/speculative_decoding.md | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/llm/docs/predict/inference.md b/llm/docs/predict/inference.md index 1411567a2ec3..15848b0618d6 100644 --- a/llm/docs/predict/inference.md +++ b/llm/docs/predict/inference.md @@ -114,11 +114,11 @@ PaddleNLP 提供了多种量化策略,支持Weight Only INT8及INT4推理, - `speculate_max_draft_token_num`: 投机解码算法中每轮产生的最大 draft tokens 数目,默认值为 1。 -- `speculate_max_ngram_size`: ngram 匹配 draft tokens 时的最大窗口大小,默认值为`1`。inference_with_reference 算法中会先从 prompt 中使用 ngram 窗口滑动匹配 draft tokens,窗口大小和输入输出重叠程度共同决定了产生 draft tokens 的开销从而影响 inference_with_reference 算法的加速效果。 +- `speculate_max_ngram_size`: n-gram 匹配 draft tokens 时的最大窗口大小,默认值为`1`。inference_with_reference 算法中会先从 prompt 中使用 ngram 窗口滑动匹配 draft tokens,窗口大小和输入输出重叠程度共同决定了产生 draft tokens 的开销从而影响 inference_with_reference 算法的加速效果。 -- `speculate_verify_window`: 投机解码 verify 策略默认采用 TopP + TopK 验证中的 K,默认值为`2`。 +- `speculate_verify_window`: 投机解码 verify 策略默认采用 TopP + window verify 中的 window 大小,默认值为`2`。更多有关 TopP + window verify 的详细介绍参考[投机解码教程](./speculative_decoding.md)。 -- `speculate_max_candidate_len`: 产生的最大候选 tokens 数目,根据候选 tokens 与 draft tokens 比较来进行 verify,默认值为`5`。 +- `speculate_max_candidate_len`: 产生的最大候选 tokens 数目,根据候选 tokens 与 draft tokens 比较来进行 verify(仅在 TopP + window verify时生效),默认值为`5`。 ### 3.5 解码策略参数 diff --git a/llm/docs/predict/speculative_decoding.md b/llm/docs/predict/speculative_decoding.md index e585220694af..7ba5d75dfb8c 100644 --- a/llm/docs/predict/speculative_decoding.md +++ b/llm/docs/predict/speculative_decoding.md @@ -17,3 +17,9 @@ python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat -- 1. 该算法目前只支持 llama 系列模型 2. 投机解码同时支持量化推理,具体命令参考[推理示例](./inference.md),将 speculate_method 等投机解码参数加上即可。 + +## TopP + Window verify + +在投机解码中一个影响加速比重要的点是 verify 后的接受率,区别于简单的贪心搜索,TopP 和 TopK 采样,我们采取 TopP + Window verify 的方法来提高接受率(默认开启,若要切换到 Top1 verify 请指定环境变量 export SPECULATE_VERIFY_USE_TOPK=1),下面详细介绍 TopP + Window verify 策略的原理。 + +在推理 draft tokens 得到 verify tokens 的 logits 后,我们先通过 TopP 采样得到 verify tokens,如果 TopP 个 verify tokens 的数目不足 speculate_max_candidate_len 个时 padding 到 speculate_max_candidate_len 个 verify tokens,然后对于每一个 draft token 判断是否位于 verify tokens 中的 TopP 个 token 中,是则 TopP verify 接收此 draft token,否则判断后面两个 draft token 的 Top1 verify 是否接收,只有当后面两个 draft token 都被 Top1 verify 接收时,才同时接收这三个 draft tokens 否则都不接收(window verify)。 \ No newline at end of file