飞桨新一代框架3.0全面升级了大模型推理能力,依托高扩展性的中间表示(PIR)从模型压缩、推理计算、服务部署、多硬件推理全方位深度优化,能够支持众多开源大模型进行高性能推理。全面支持了DeepSeek V2/V3/R1满血版及其基于LlaMA、Qwen蒸馏出的系列模型,其中,在DeepSeek V3/R1上取得了突出的性能表现。
飞桨框架3.0大模型高性能推理能力一览H800上256并发不含MTP测试,实验复现请参考: https://paddlenlp.readthedocs.io/zh/latest/llm/docs/predict/deepseek.html
提供面向服务器场景的部署服务
支持各大主流模型
推理机制全面
量化精度多样
多种硬件
除了支持DeepSeek V3/R1满血版及其系列蒸馏版模型在Hopper架构GPU上部署,飞桨还实现了Weight Only INT8量化,支持在A800部署;此外,还通过Weight Only INT4量化,支持单机部署,相比2机部署方案,大大节省了跨机通信耗时,相同并发下可加速101%~128%。
针对Weight Only INT4量化推理,除了基本的Channel Wise,飞桨还支持了更细粒度的Group Wise(64/128)的量化方式,模型精度得到进一步提升。
Block Wise FP8量化注:Group Wise当前仅支持Ampere架构GPU
截图自DeepSeek官方论文 https://arxiv.org/pdf/2412.19437
权重采用官方推荐的Block Wise(128x128)量化,激活采用动态per group(128)量化,采用一个warp计算多个group,充分利用显存带宽。我们基于cutlass3.8版本,实现了高效的FP8 BlockGemm,并经过矩阵参数调优进一步提升了性能。同时基于Triton实现的FusedMoE算子,提前遍历搜索出最优性能配置,并将MoE前的Token Permute/Dispatch等细碎操作进行算子融合以达到极致的吞吐的性能。还支持了将Python端生成的Triton kernel封装成Paddle自定义算子,进而支持静态图推理部署。
FP8-WINT4混合量化H800上不含MTP测试,实验复现请参考文档: https://paddlenlp.readthedocs.io/zh/latest/llm/docs/predict/deepseek.html
为了在保证模型精度的同时最小化显存占用,我们采取将MoE部分进行WINT4量化,MLP等其它部分采用FP8量化的混合量化方式,实现了单机部署下的最优吞吐。为了评估模型效果,针对MMLU-Pro的部分科目,分别对Paddle的WINT4量化与FP8-WINT4混合量化以及vLLM的FP8量化进行了测评,分数评估如下表。
Model Biology Business Law Psychology Chemistry 均值 Paddle-WINT4 0.8690 0.8441 0.6230 0.8100 0.8430 0.8021 Paddle-FP8-WINT4 0.8870 0.8695 0.6494 0.8195 0.8489 0.8165 vLLM-FP8 0.8619 0.8540 0.6430 0.8233 0.8401 0.8036 SageAttention量化注:MMLU-Pro测评 - 部分科目
SageAttention2: Efficient Attention with Thorough Outlier Smoothing and Per-thread INT4 Quantization
https://arxiv.org/abs/2411.10958
为了优化长文推理性能,我们集成了Attention动态量化方案SageAttention2,在原生支持的128大小的Head Dim(同时支持Ampere/Hopper架构)基础上,我们针对DeepSeek模型,实现了Head Dim为192的情况(当前仅支持Hopper架构)。
在精度近乎无损的前提下,大幅提升了长序列输入下Prefill阶段的首Token时延(TTFT),在64K长文输入下,首token推理速度最大提升37.4%。
SageAttention2通过动态的将Q、K矩阵量化为INT8(或者INT4,我们这里采用INT8),V矩阵量化为FP8来重新组织Attention计算各阶段的数据类型;在Softmax阶段先将INT32的Q*K转换为FP32,之后进行Q*K的反量化,再采用Online Softmax加速计算;将结果P量化为FP8,与经过FP8量化的V矩阵相乘,之后再对P*V结果进行反量化,得到Attention的计算结果O。
高效的MLA与MTP实现 Multi-head Latent Attention(MLA)算子 总体概述一次完整的 MLA 计算包含四个步骤,分别是 Data Load、QK GEMM、Softmax Update + R2S、PV GEMM。结合 Hopper 架构的特性,通过多级流水线编排、精细的寄存器及共享内存分配,深度调优 MLA 算子性能;并适配 decoder 阶段 num_token > 1 的情况,以支持高效投机解码。
方案一使用3个Warp Group (WG),WG0作为 Producer,进行2阶段的数据搬运操作;WG1与WG2作为 Consumer,其中 WG1 负责计算 QK GEMM 以及 Softmax 操作,并将结果存储到共享内存中;而后 WG1 与 WG2 共同计算 PV GEMM 以缓解寄存器压力;这种方式下,我们每次处理 64 长度的KV,最终占用了 225KB 的共享内存。
方案二为了将 CPV 与 UPRS 操作进行 overlap,在上述的基础上,将 WG0 的流水线增加到四阶段,将 PV GEMM 与 Softmax 操作进行 overlap。为了节省寄存器与共享内存,我们每次处理 32 长度的KV,该套实现建议在 CUDA12.8 版本下使用。
方案三(实验中)为了进一步对不同操作进行overlap,使用4个 Warp Group,其中 WG0 作为 Producer 进行4阶段的数据搬运,WG1 作为 Consumer 进行2阶段的 QK Gemm 与Softmax 操作,WG2 与 WG3 负责 PV GEMM 计算;在使用4个Warp Group后,单线程最大寄存器占用为128个,每次处理 32 长度的KV;WG0 与WG1 占用寄存器数量小于72个;WG2 与 WG3 寄存器占用数量约184个;因此,理论上通过更精细化的寄存器划分该方案可行,该方案当前暂开源一套低精度累加实现,后续将持续优化。
竞品对比通过上述一系列的优化,在 Hopper 架构上,MLA 算子速度相较于 FlashMLA 取得了4%~23%的明显提升。
MTP 高效推理实现大批次加速 投机解码概述测试说明:H800 CUDA12.8环境下NCU锁频统计Kernel耗时
“投机”,顾名思义,以较小代价博大的收益;在 LLM 中,尽可能小的额外时延生成多个 Draft Token,尽最大努力让 Base 模型接收它,减少推理的总耗时。
下图概括了投机解码的常用方法以及框架流程:
适合场景:在时延要求高、并发较小的场景
类Draft Model系列方法(MTP)以下是 MTP 推理时的时序图:
draft token 验证阶段注意力计算优化
基于DeepSeekV3/R1提供的MTP权重,我们在多个数据集上统计,第二个token的接受率达到80%~90%,达到DeepSeekV3论文效果。基于飞桨框架3.0的高性能优化:
介绍内容:
环境要求:
export MODEL_PATH=${MODEL_PATH:-$PWD} export model_name=${model_name:-"deepseek-ai/DeepSeek-R1/weight_only_int4"} docker run --gpus all --shm-size 32G --network=host --privileged --cap-add=SYS_PTRACE \ -v $MODEL_PATH:/models -e "model_name=${model_name}" \ -dit ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddlenlp:llm-serving-cuda124-cudnn9-v2.1 /bin/bash \ -c -ex 'export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 && export MP_NUM=8 && start_server $model_name && tail -f /dev/null'
# 选择模型 export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" # 设置基础模型与 MTP 模型的挂载位置 export MODEL_PATH="/models/" export MODEL_MTP_PATH="/models/mtp" # 投机解码参数 export SPECULATE_METHOD="mtp" export SPECULATE_MODEL_PATH="/models-mtp" export SPECULATE_MAX_DRAFT_TOKEN_NUM=1 # 高性能参数推荐 export BLOCK_BS=32 export BLOCK_RATIO=0.25 export BATCH_SIZE="128" # 端口设置 export HEALTH_HTTP_PORT="8510" # 探活服务的http端口(当前仅用于健康检查、探活) export SERVICE_GRPC_PORT="8511" # 模型推服务的grpc端口 export METRICS_HTTP_PORT="8522" # 模型服务中监督指标的端口 export INTER_PROC_PORT="8713" # 模型服务内部使用的端口 export SERVICE_HTTP_PORT="9968" # 服务请求HTTP端口号,如不配置,默认为-1,即服务只支持GRPC协议 # 最终启动命令 export MODEL_PATH="/models/" export MODEL_MTP_PATH="/models/mtp" export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" docker run -i --name paddle_example --gpus all --shm-size 32G --network=host --privileged --cap-add=SYS_PTRACE \ -v $MODEL_PATH:/models -v $MODEL_MTP_PATH:/models-mtp -v /ssd2/paddle_example:/work -e "model_name=${model_name}" \ -dit ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddlenlp:llm-serving-cuda124-cudnn9-v2.1 /bin/bash \ -c -ex 'export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 && export MP_NUM=8 && export SPECULATE_MODEL_QUANT_TYPE="a8w8_fp8_wint4" && export SPECULATE_METHOD="mtp" && export SPECULATE_MODEL_PATH="/models-mtp" && export SPECULATE_MAX_DRAFT_TOKEN_NUM=1 && export BLOCK_BS=32 && export BLOCK_RATIO=0.25 && export BATCH_SIZE="128" && export HEALTH_HTTP_PORT="8510" && export SERVICE_GRPC_PORT="8511" && export METRICS_HTTP_PORT="8522" && export INTER_PROC_PORT="8713" && export SERVICE_HTTP_PORT="9968" && start_server $model_name && tail -f /dev/null'
--> 进阶版:在持久化的docker容器内进行所有部署操作,并可随意更改配置测试
10min速成推理部署高手介绍内容:
成为部署高手只需要四步!!
参考文档:https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm/server/docs/deploy_usage_tutorial.md
# 预置脚本:/opt/output/download_model.py export MODEL_PATH=/work/ export SPCULATE_MODEL_PATH=/work/ export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" python download_model.py --model_name $model_name --dir $MODEL_PATH --nnodes 1 --speculate_model_path $SPCULATE_MODEL_PATH # 精简命令 python download_model.py --model_name deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4 --dir /work/models --speculate_model_path /work/models/deepseek-ai/DeepSeek-R1-MTP/mtp_fp8/
# 预置脚本:/opt/source/PaddleNLP/llm/benchmark/serving/get_filter_shared_gpt.py cd /opt/source/PaddleNLP/llm/benchmark/serving python get_filter_shared_gpt.py --tokenizer_name /work/models/deepseek-ai/DeepSeek-R1-MTP/weight_only_int4 # 该目录下预期文件显示如下 ls /opt/source/PaddleNLP/llm/benchmark/serving ShareGPT_V3_unfiltered_cleaned_split.json benchmark_client.py filtered_sharedgpt_short_3000.json get_filter_shared_gpt.py run_benchmark_client.sh
其中ShareGPT_V3_unfiltered_cleaned_split.json是原始ShareGPT数组,filtered_sharedgpt_short_3000.json是根据规则筛选出的数据。
Case 3:部署单机DeepSeek-R1养成好习惯,每次启动server前,先执行stop_server关闭可能存在的相关进程。
环境变量配置
# 选择模型 export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" # 设置基础模型与MTP模型的挂载位置 export MODEL_PATH="/ssd2/paddle_example/infer_model_a8w8_fp8_wint4" export MODEL_MTP_PATH="/ssd2/paddle_example/model_mtp_fp8" # 高性能参数推荐 export BLOCK_BS=32 export BLOCK_RATIO=0.25 export BATCH_SIZE="128"
最终环境变量
# run_deepseek_R1_a8w8_fp8_wint4.sh export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export MP_NUM=8 export MODEL_DIR="/work/models/deepseek-ai/DeepSeek-R1/weight_only_int4/" export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" export BLOCK_BS=40 export BLOCK_RATIO=0.25 export BATCH_SIZE="128" export HEALTH_HTTP_PORT="8510" # 探活服务的http端口(当前仅用于健康检查、探活) export SERVICE_GRPC_PORT="8511" # 模型推服务的grpc端口 export METRICS_HTTP_PORT="8522" # 模型服务中监督指标的端口 export INTER_PROC_PORT="8713" # 模型服务内部使用的端口 export SERVICE_HTTP_PORT="9968" # 服务请求HTTP端口号,如不配置,默认为-1,即服务只支持GRPC协议 start_server
执行与验证流程
# 执行 bash run_deepseek_R1_a8w8_fp8_wint4.sh # 检测是否运行成功 # port为上面启动服务时候指定的HEALTH_HTTP_PORT(测试前请确保服务IP和端口正确) # live接口: (服务是否能正常接收请求)http://127.0.0.1:8510/v2/health/live # health接口:(模型是否准备好推理)http://127.0.0.1:8510/v2/health/ready curl -i http://127.0.0.1:8510/v2/health/live curl -i http://127.0.0.1:8510/v2/health/ready # 发单条query验证 python curl.py # benchmark cd /work/PaddleNLP/llm/benchmark/serving bash run_benchmark_client.shCase 4:部署单机DeepSeek-R1-MTP
最终环境变量
# run_deepseek_R1_MTP_a8w8_fp8_wint4.sh export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export MP_NUM=8 export MODEL_DIR="/work/models/deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4/" export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" export SPECULATE_MODEL_PATH="/work/models/deepseek-ai/DeepSeek-R1-MTP/mtp_fp8" export SPECULATE_METHOD="mtp" export SPECULATE_MODEL_QUANT_TYPE="a8w8_fp8" export SPECULATE_MAX_DRAFT_TOKEN_NUM=1 export BLOCK_BS=32 export BLOCK_RATIO=0.25 export BATCH_SIZE="128" export HEALTH_HTTP_PORT="8510" # 探活服务的http端口(当前仅用于健康检查、探活) export SERVICE_GRPC_PORT="8511" # 模型推服务的grpc端口 export METRICS_HTTP_PORT="8522" # 模型服务中监督指标的端口 export INTER_PROC_PORT="8713" # 模型服务内部使用的端口 export SERVICE_HTTP_PORT="9968" # 服务请求HTTP端口号,如不配置,默认为-1,即服务只支持GRPC协议 start_server
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4