Skip to content

[直播稿件] 飞桨框架3.0支持DeepSeek-V3/R1系列模型部署 #10157

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
yuanlehome opened this issue Mar 17, 2025 · 0 comments
Open
Assignees

Comments

@yuanlehome
Copy link
Collaborator

yuanlehome commented Mar 17, 2025

目录

  • 飞桨框架3.0大模型高性能推理能力一览
  • DeepSeek多量化推理方案
    • Weight Only INT8/4量化
    • Block Wise FP8量化
    • FP8-WINT4混合量化
    • SageAttention量化
  • 高效的MLA与MTP实现
    • Multi-head Latent Attention(MLA)算子
    • MTP高效推理实现大批次加速
  • DeepSeek部署实战

飞桨新一代框架3.0全面升级了大模型推理能力,依托高扩展性的中间表示(PIR)从模型压缩、推理计算、服务部署、多硬件推理全方位深度优化,能够支持众多开源大模型进行高性能推理。全面支持了DeepSeek V2/V3/R1满血版及其基于LlaMA、Qwen蒸馏出的系列模型,其中,在DeepSeek V3/R1上取得了突出的性能表现。

Image

H800上256并发不含MTP测试,实验复现请参考: https://paddlenlp.readthedocs.io/zh/latest/llm/docs/predict/deepseek.html

飞桨框架3.0大模型高性能推理能力一览

提供面向服务器场景的部署服务

  • 连续批处理(Continuous Batching)、流式输出、基于HTTP协议接口

支持各大主流模型

  • DeepSeek V2/V3/R1、Qwen 1.5/2/2.5/QwQ、LlaMA 2/3.1/3.2/3.3、ChatGLM 2/3、Mixtral、Baichuan

推理机制全面

  • 全环节算子融合、高效Attention(PagedAttention/FlashDecoding/SageAttention)、投机解码、Prompt Cache、Prefill-Decode分离

量化精度多样

  • FP16、BF16、WINT8、WINT4、W8A8_INT8、W8A8_FP8、C16/C8/C4

多种硬件

  • 英伟达GPU、昆仑XPU、昇腾NPU、海光DCU、燧原GCU、太初SDAA、英特尔CPU

DeepSeek多量化推理方案

Weight Only INT8/4量化

除了支持DeepSeek V3/R1满血版及其系列蒸馏版模型在Hopper架构GPU上部署,飞桨还实现了Weight Only INT8量化,支持在A800部署;此外,还通过Weight Only INT4量化,支持单机部署,相比2机部署方案,大大节省了跨机通信耗时,相同并发下可加速101%~128%。

针对Weight Only INT4量化推理,除了基本的Channel Wise,飞桨还支持了更细粒度的Group Wise(64/128)的量化方式,模型精度得到进一步提升。

注:Group Wise当前仅支持Ampere架构GPU

Block Wise FP8量化

Image

截图自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自定义算子,进而支持静态图推理部署。

Image

H800上不含MTP测试,实验复现请参考文档: https://paddlenlp.readthedocs.io/zh/latest/llm/docs/predict/deepseek.html

FP8-WINT4混合量化

为了在保证模型精度的同时最小化显存占用,我们采取将MoE部分进行WINT4量化,MLP等其它部分采用FP8量化的混合量化方式,实现了单机部署下的最优吞吐。为了评估模型效果,针对MMLU-Pro的部分科目,分别对Paddle的WINT4量化与FP8-WINT4混合量化以及vLLM的FP8量化进行了测评,分数评估如下表。

注:MMLU-Pro测评 - 部分科目

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量化

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架构)。

Image

在精度近乎无损的前提下,大幅提升了长序列输入下Prefill阶段的首Token时延(TTFT),在64K长文输入下,首token推理速度最大提升37.4%。

Image

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。

Image

高效的MLA与MTP实现

Multi-head Latent Attention(MLA)算子

总体概述

一次完整的 MLA 计算包含四个步骤,分别是 Data Load、QK GEMM、Softmax Update + R2S、PV GEMM。结合 Hopper 架构的特性,通过多级流水线编排、精细的寄存器及共享内存分配,深度调优 MLA 算子性能;并适配 decoder 阶段 num_token > 1 的情况,以支持高效投机解码。

Image

方案一

Image

使用3个Warp Group (WG),WG0作为 Producer,进行2阶段的数据搬运操作;WG1与WG2作为 Consumer,其中 WG1 负责计算 QK GEMM 以及 Softmax 操作,并将结果存储到共享内存中;而后 WG1 与 WG2 共同计算 PV GEMM 以缓解寄存器压力;这种方式下,我们每次处理 64 长度的KV,最终占用了 225KB 的共享内存。

方案二

Image

为了将 CPV 与 UPRS 操作进行 overlap,在上述的基础上,将 WG0 的流水线增加到四阶段,将 PV GEMM 与 Softmax 操作进行 overlap。为了节省寄存器与共享内存,我们每次处理 32 长度的KV,该套实现建议在 CUDA12.8 版本下使用。

方案三(实验中)

Image

为了进一步对不同操作进行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%的明显提升。

Image

Image

测试说明:H800 CUDA12.8环境下NCU锁频统计Kernel耗时

MTP 高效推理实现大批次加速

投机解码概述

“投机”,顾名思义,以较小代价博大的收益;在 LLM 中,尽可能小的额外时延生成多个 Draft Token,尽最大努力让 Base 模型接收它,减少推理的总耗时。

下图概括了投机解码的常用方法以及框架流程:

Image

适合场景:在时延要求高、并发较小的场景

类Draft Model系列方法(MTP)

  • 飞桨框架3.0 针对该类方法设计了一套极易拓展的架构,在支持 MTP 的同时,仅需适配极少量代码,即可支持所有类 draft model 系列方法
  • 特点:模型结构和正常模型几乎一致,存在 embeding/lm_head,有一层或多层 Transformer,有 cacheKV 存储历史上下文
  • 常用方法;Draft_model、eagle、MTP

以下是 MTP 推理时的时序图:

Image

  • 针对 MTP 的特性,飞桨框架3.0 进行了两种优化
    • 统一对上轮 Draft Token 接受情况的处理(例如全部拒绝、接受部分、接受全部),在推理时,同样做到一次 forward,处理所有 Query
    • 融合后处理算子(模型状态更新),相比原始模型的后处理,性能加速2~4倍

大批次下的性能优化

Image

draft token 验证阶段注意力计算优化

  • 传统 batch_extension 在大批次下的性能劣化问题:
    • 由于 Attention Kernel 在 decoder 阶段只支持 num_token=1,因此在验证阶段只能通过 extension batch 的方法模拟 num_token > 1 的情况,计算量会迅速膨胀。vllm DeepSeek V3/R1 + MTP 在 batch_size > 32 时性能即会劣化。
    • 例如:batch_size=128, num_draft_token=2 时,batch_extension 的 batch 规模大小为 128*3=384
  • 我们基于支持 num_token > 1 的 MLA,设计了一套通用的投机解码框架,在 draft token 验证阶段,保持批次大小不变的情况下,可一次性完成对所有草稿token的推理验证,解决了大批次下投机解码劣化推理性能的问题。
    • 例如:batch_size=128, num_draft_token=2 时,batch 规模大小仍为 128

性能测试

基于DeepSeekV3/R1提供的MTP权重,我们在多个数据集上统计,第二个token的接受率达到80%~90%,达到DeepSeekV3论文效果。基于飞桨框架3.0的高性能优化:

  • 场景一:时延要求场景
    • 基于实验1与实验4,保持解码速度不劣化(此示例中解码速度提升25%),QPS提升144%,
  • 场景二:QPS 要求场景
    • 基于实验2与实验3,保持QPS不劣化(此示例中QPS提升8%),解码速度提升42%
  • 场景三:并发要求场景
    • 基于实验2与实验4,保持批次大小不变,在批处理大小为128较大的时候,依然可以保持QPS提升32%,解码速度提升32%
实验 测试模型 部署方式 量化类型 并发 平均输出长度 解码速度(token/s) 整句时延 (s) QPS OTPS/8 GPUs
1 DeepSeek-R1 TP8 FP8 + WINT4 64 1515.64 15.42 98.31 0.64 975.47
2 DeepSeek-R1 TP8 FP8 + WINT4 128 1500.16 14.56 103.06 1.18 1776.21
3 DeepSeek-R1 + MTP TP8 FP8 + WINT4 96 1504.85 20.73 72.61 1.27 1913.22
4 DeepSeek-R1 + MTP TP8 FP8 + WINT4 128 1505.30 19.21 78.34 1.56 2343.48

DeepSeek部署实战

介绍内容:

  1. 如何一键启动推理服务
  2. 10 min速成推理部署高手
    a. 一键下载模型、benchmark 数据集
    b. 部署单节点DeepSeek-R1,量化精度为WINT4
    c. 部署单节点DeepSeek-R1-MTP,基础模型量化精度为WINT4,MTP量化精度为WINT8

环境要求:

  1. H800/H20/A800 * 8/16
  2. nvidia-docker

如何一键启动推理服务

  • 适合用户:全用户群体,无需任何背景知识,一键式部署、推理
  • 场景:技术尝鲜、demo 试用
  • 优点:执行十分方便,一键启动
  • 缺点:使用不优雅,每次部署模型需重新启动镜像

Case 1:官网文档 demo

  • 模型:deepseek-ai/DeepSeek-R1/weight_only_int4
  • 精度:weight_only_int4
  • GPU:单节点,8*H800
  • 是否MTP:否
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'
  • 命令含义
    • -v:本地文件系统与容器内文件映射,用来持久化存储模型以及用户文件
    • -e:设置容器内环境变量
    • -c:执行一段bash命令
    • 命令详解:把deepseek-ai/DeepSeek-R1/weight_only_int4模型下载到$PWD,并映射到容器内/models目录
  • 预期结果:deepseek-ai/DeepSeek-R1/weight_only_int4自动下载到设定的MODEL_PATH中;并在模型下载完成后,启动推理服务

Case 2:根据文档demo升级改造

  • 模型:deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4
  • 精度:a8w8_fp8_weight_only_int4
  • GPU:单节点,8*H800
  • 是否MTP:是
  • MTP精度:a8w8_fp8
# 选择模型
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速成推理部署高手

介绍内容:

  1. 一键下载模型、benchmark 数据集
  2. 部署单节点 DeepSeek-R1,量化精度为 WINT4
  3. 部署单节点 DeepSeek-R1-MTP,基础模型量化精度为 WINT4, MTP 量化精度为 WINT8

成为部署高手只需要四步!!

  1. 下载模型 / 数据集
  2. 设置环境变量
  3. 启动服务 start_server
  4. 关闭服务 stop_server

参考文档:https://github.com/PaddlePaddle/PaddleNLP/blob/develop/llm/server/docs/deploy_usage_tutorial.md

  1. 模型下载
    预置脚本:/opt/output/download_model.py
    下载位置:/work
    下载模型:deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4
# 预置脚本:/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/
  1. 数据集下载
# 预置脚本:/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.sh

Case 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
@yuanlehome yuanlehome changed the title test [直播稿件] 飞桨框架3.0支持DeepSeek-V3/R1系列模型部署 Mar 17, 2025
@PaddlePaddle PaddlePaddle locked and limited conversation to collaborators Mar 17, 2025
@yuanlehome yuanlehome self-assigned this Mar 17, 2025
@DrownFish19 DrownFish19 pinned this issue Mar 17, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants