A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/PaddlePaddle/PaddleNLP/issues/10157 below:

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

目录

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

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

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

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

支持各大主流模型

推理机制全面

量化精度多样

多种硬件

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

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

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

在精度近乎无损的前提下,大幅提升了长序列输入下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%的明显提升。

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

MTP 高效推理实现大批次加速 投机解码概述

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

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

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

类Draft Model系列方法(MTP)

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

大批次下的性能优化

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

性能测试

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

实验 测试模型 部署方式 量化类型 并发 平均输出长度 解码速度(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
如何一键启动推理服务 Case 1:官网文档 demo
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'
Case 2:根据文档demo升级改造
# 选择模型
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

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