PaddleNLP以一站式体验、极致性能为设计理念,实现大模型的快速推理。
PaddleNLP大模型推理构建了高性能推理方案:
-
内置动态插入和全环节算子融合策略
-
支持PageAttention、FlashDecoding优化
-
支持Weight Only INT8及INT4推理,支持权重、激活、Cache KV进行INT8、FP8量化的推理
-
提供动态图推理和静态图推理两种方式
PaddleNLP大模型推理提供压缩、推理、服务全流程体验 :
-
提供多种PTQ技术,提供WAC(权重/激活/缓存)灵活可配的量化能力,支持INT8、FP8、4Bit量化能力
-
提供面向服务器场景的部署服务,支持连续批处理(continuous batching)、流式输出等功能,支持gRPC、HTTP协议的服务接口
PaddleNLP 中已经添加高性能推理模型相关实现,已验证过的模型如下:
| Models | Example Models |
|---|---|
| Llama 3.1, Llama 3, Llama 2 | meta-llama/Meta-Llama-3.1-8B, meta-llama/Meta-Llama-3.1-8B-Instruct, meta-llama/Meta-Llama-3.1-405B, meta-llama/Meta-Llama-3.1-405B-Instruct,meta-llama/Meta-Llama-3-8B, meta-llama/Meta-Llama-3-8B-Instruct, meta-llama/Meta-Llama-3-70B, meta-llama/Meta-Llama-3-70B-Instruct, meta-llama/Llama-Guard-3-8B, Llama-2-7b, meta-llama/Llama-2-7b-chat, meta-llama/Llama-2-13b, meta-llama/Llama-2-13b-chat, meta-llama/Llama-2-70b, meta-llama/Llama-2-70b-chat |
| Qwen 2 | Qwen/Qwen2-0.5B, Qwen/Qwen2-0.5B-Instruct, Qwen/Qwen2-1.5B, Qwen/Qwen2-1.5B-Instruct, Qwen/Qwen2-7B, Qwen/Qwen2-7B-Instruct, Qwen/Qwen2-72B, Qwen/Qwen2-72B-Instruct, Qwen/Qwen2-57B-A14B, Qwen/Qwen2-57B-A14B-Instruct |
| Qwen-Moe | Qwen/Qwen1.5-MoE-A2.7B, Qwen/Qwen1.5-MoE-A2.7B-Chat, Qwen/Qwen2-57B-A14B, Qwen/Qwen2-57B-A14B-Instruct |
| Mixtral | mistralai/Mixtral-8x7B-Instruct-v0.1 |
| ChatGLM 3, ChatGLM 2 | THUDM/chatglm3-6b, THUDM/chatglm2-6b |
| Baichuan 2, Baichuan | baichuan-inc/Baichuan2-7B-Base, baichuan-inc/Baichuan2-7B-Chat, baichuan-inc/Baichuan2-13B-Base, baichuan-inc/Baichuan2-13B-Chat, baichuan-inc/Baichuan-7B, baichuan-inc/Baichuan-13B-Base, baichuan-inc/Baichuan-13B-Chat |
PaddleNLP 提供了多种硬件平台和精度支持,包括:
| Precision | Hopper | Ada | Ampere | Turing | Volta | 昆仑XPU | 昇腾NPU | 海光K100 | 燧原GCU | x86 CPU |
|---|---|---|---|---|---|---|---|---|---|---|
| FP32 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| FP16 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| BF16 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| INT8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
| FP8 | 🚧 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
PaddleNLP 提供了多种参数,用于配置推理模型和优化推理性能。
-
model_name_or_path: 必需,预训练模型名称或者本地的模型路径,用于热启模型和分词器,默认为None。 -
dtype: 必需,模型参数dtype,默认为None。如果没有传入lora_path或prefix_path则必须传入dtype参数。 -
lora_path: LoRA参数和配置路径,对LoRA参数进行初始化,默认为None。 -
prefix_path: Prefix Tuning参数和配置路径,对Prefix Tuning参数进行初始化,默认为None。 -
batch_size: 批处理大小,默认为1。该参数越大,占用显存越高;该参数越小,占用显存越低。 -
data_file: 待推理json文件,默认为None。样例数据:{"tgt":"", "src": "写一个300字的小说大纲,内容是李白穿越到现代,最后成为公司文职人员的故事"} {"tgt":"", "src": "我要采访一位科幻作家,创建一个包含5个问题的列表"} -
output_file: 保存推理结果文件,默认为output.json。 -
device: 运行环境,默认为gpu,可选的数值有gpu、cpu、xpu、npu、gcu等(dcu与gpu推理命令一致)。 -
model_type: 初始化不同类型模型,gpt-3: GPTForCausalLM; ernie-3.5-se: Ernie35ForCausalLM; 默认为 None。 -
mode: 使用动态图或者静态图推理,可选值有dynamic、static,默认为dynamic。 -
avx_model: 当使用CPU推理时,是否使用AvxModel,默认为False。参考CPU推理教程。 -
avx_type: avx计算类型,默认为None。可选的数值有fp16、bf16。 -
src_length: 模型输入上下文最大token长度,默认为1024。 -
max_length:模型输入(上下文+生成内容)的最大token长度, 默认为2048。
-
inference_model: 是否使用 Inference Model 推理,默认值为 False。Inference Model 内置动态插入和全环节算子融合策略,开启后性能更优。 -
block_attn: 是否使用 Block Attention 推理, 默认值为False。Block Attention 是基于 PageAttention 的思想设计并实现的,在保持高性能推理和动态插入的基础上可以动态地为 cachekv 分配存储空间,极大地节省显存并提升推理的吞吐。 -
block_size: 如果使用 Block Attention 推理,指定一个 Block 可以存储的 token 数量,默认值为64。
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校准产出的量化模型。量化模型导出参考大模型量化教程。 -
cachekv_int8_type: 是否使用cachekv int8量化,默认值为None。可选dynamic(已不再维护,不建议使用)和static两种,static需要额外的cache kv的scale校准表,传入的model_name_or_path为PTQ校准产出的量化模型。量化模型导出参考大模型量化教程。
-
decode_strategy: 推理解码策略,默认值为sampling,可选的数值有greedy_search、beam_search和sampling。 -
top_k: “采样”策略中为 top-k 过滤保留的最高概率标记的数量。默认值为1,等价于贪心策略。 -
top_p:“采样”策略中 top-p 过滤的累积概率。默认值为1.0,表示不起作用。 -
temperature:“采样”策略中会对输出logit除以temperature。默认值为1.0,表示不起作用。
benchmark: 是否开启性能分析,默认值为False。如果设为true,会将模型输入填充为src_length并强制解码到max_length,并计算模型推理吞吐量、记录推理时间。
参考安装教程。
下面给出Llama2-7B的动态图推理示例:
# 动态图模型推理命令参考
python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --block_attn
# XPU设备动态图模型推理命令参考
python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --block_attn --device xpu
# Weight Only Int8 动态图推理参考
python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --quant_type weight_only_int8 --block_attn
# PTQ-A8W8推理命令参考
python ./predict/predictor.py --model_name_or_path checkpoints/llama_ptq_ckpts --inference_model --dtype float16 --block_attn --quant_type a8w8
# PTQ-A8W8C8推理命令参考
python ./predict/predictor.py --model_name_or_path checkpoints/llama_ptq_ckpts --inference_model --dtype float16 --block_attn --quant_type a8w8 --cachekv_int8_type static
# CacheKV 动态量化推理命令参考
python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --block_attn --cachekv_int8_type dynamicNote:
quant_type可选的数值有weight_only_int8、weight_only_int4、a8w8和a8w8_fp8。a8w8与a8w8_fp8需要额外的act和weight的scale校准表,推理传入的model_name_or_path为PTQ校准产出的量化模型。量化模型导出参考大模型量化教程。cachekv_int8_type可选dynamic(已不再维护,不建议使用)和static两种,static需要额外的cache kv的scale校准表,传入的model_name_or_path为PTQ校准产出的量化模型。量化模型导出参考大模型量化教程。
更多大模型推理教程:
环境准备,参考:
获取最佳推理性能:
更多压缩、服务化推理体验:
更多硬件大模型推理教程:
我们参考PageAttention的page分块的思想实现了generation阶段的block attention。基于Flash Decoding的KV分块思想实现了长sequence场景下的推理加速。基于Flash Attention2实现了prefill阶段的attention加速。FP8 GEMM基于CUTLASS的高性能模板库实现。有部分算子如gemm_dequant参考了TensorRT-LLM和FasterTransformer的实现和优化思路。