PaddleNLP 推理优化实战指南:高性能环境变量调优与投机解码加速
2026/9/23 10:28:25 网站建设 项目流程
  • 人工智能
  • 大模型
  • NLP
  • 深度学习
  • 预训练
  • 微调
  • RLHF
  • 模型量化

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

导读

本文基于 PaddleNLP 推理文档体系中的《Practical Optimization》与《Speculative Decoding Tutorial》,系统梳理 PaddleNLP 在 LLM 推理侧的完整优化手段:一类是通过环境变量(FLAGS)对 GEMM、GQA、内存、Append Attention、MLA、allreduce 等算子与资源进行细粒度调优的"高性能推理最佳实践";另一类是通过speculate_method系列参数启用 inference_with_reference、MTP、EAGLE 等投机解码算法,用"草稿-验证"范式显著降低解码延迟。读完本文,你将掌握 PaddleNLP 推理服务的环境变量调优清单、量化模型(A8W8 / FP8 / weight_only)的 GEMM 加速配置,以及 DeepSeek-R1 + MTP 从单机 TP8 到双机 TP16 的完整部署与推理命令。

说明:本主题相关内容同时存在中英文文档版本,本文以英文版为骨架,可对照阅读 best_practices.md 与 speculative_decoding.md,并配合 inference.md(完整推理参数表)与 deepseek.md(DeepSeek 专项部署)交叉使用。

一、高性能推理最佳实践:环境变量总览

PaddleNLP 提供了大量环境变量(FLAGS)用于在推理时优化性能与资源利用率。它们通常在启动推理进程前通过export设置,作用于 CUDA 算子层(底层实现在 csrc/gpu/env.h 与 paddlenlp/experimental/transformers/fused_transformer_layers.py 等文件中读取并消费)。下面按优化维度逐一说明推荐配置。

1.1 GEMM 优化(矩阵乘加速,重点覆盖量化模型)

GEMM 是 Transformer 推理中最重的计算瓶颈,PaddleNLP 针对 int8(A8W8)与 fp8 两类量化精度提供了独立开关与调优通道。

环境变量默认值作用与推荐配置
FLAGS_enable_blaslt_global_search0(关闭)是否在推理时动态搜索最优 int8 gemm 算法。置 1 可提升 A8W8 模型的推理性能。
FLAGS_cublaslt_device_best_config""(空)FLAGS_enable_blaslt_global_search=1时,指定预调优的 int8 gemm 配置文件。配置文件由 csrc/utils/tune_cublaslt_int8_gemm.py 生成,该脚本会在当前输入尺寸下自动搜索最优 gemm 配置并输出 CSV。注意:不同 CUDA 版本需要分别调优。
FLAGS_CUTLASS_FP8_GEMMFalse是否使用 CUTLASS 实现 fp8 gemm。置 True 后 A8W8 模型会走 Tensor Core,性能更优。源码中该开关在 fused_transformer_layers.py 中被读取并打印使用日志。
FLAGS_use_cutlass_device_best_config_pathFLAGS_CUTLASS_FP8_GEMM=True时,指定预调优的 fp8 gemm 配置文件。配置文件由 csrc/utils/tune_cutlass_fp8_*.py 系列脚本生成,默认输出fp8_fuse_gemm_config.json。不同 NVIDIA GPU 型号与 CUDA 版本需要分别调优;SM89 与 SM90 GPU 需要做 dual_gemm 调优(参考同目录下的dual_gemm.py)。支持的值:tune(开启调优)、空或default(使用默认配置)、其他任意值(使用指定配置文件)。同时支持 DeepSeek 系列模型 Block-wise FP8 gemm 调优(参考 csrc/tools/tune_fp8_gemm.sh)。
FLAGS_cuda_core_int8_gemm关闭是否启用小 batch 场景的 Int8 Gemm 优化。置 1 可在 SM>=70 的 GPU 上将 A8W8 模型推理加速约 40%–55%。
FLAGS_cuda_core_fp8_gemm关闭是否启用小 batch 场景的 FP8 Gemm 优化。置 1 可在 SM>=89 的 GPU 上将 FP8 模型推理加速约 30%。该开关在 env.h 中以环境变量字符串是否等于 "1" 进行严格判断。

实战建议:对于 A8W8 模型,推荐组合FLAGS_enable_blaslt_global_search=1+ 预调优的FLAGS_cublaslt_device_best_config,并在 SM>=70 的卡上开启FLAGS_cuda_core_int8_gemm=1;对于 FP8 模型,优先开启FLAGS_CUTLASS_FP8_GEMM=True并配合FLAGS_use_cutlass_device_best_config_path,在 SM>=89 的卡上可叠加FLAGS_cuda_core_fp8_gemm=1

关于 int8 gemm 调优脚本的细节:tune_cublaslt_int8_gemm.py内部针对 llama3.1-8b、llama3.1-405b(mp=8)、qwen2-1.5b、qwen2-7b 四类典型模型的 [qkv, out_linear, ffn1, ffn2] 矩阵形状,从 M=1 到 M=32768 全范围搜索,并将结果写入cublaslt_gemm_search.csv。这意味着调优结果天然覆盖了多档 batch/seq 长度,可直接用于后续FLAGS_cublaslt_device_best_config引用。

1.2 GQA 优化

  • FLAGS_use_xqa_optim:是否启用 GQA(Grouped Query Attention)场景的 XQA 优化,默认 0(关闭)。置 1 可提升 GQA 类模型(如 llama3/3.1、qwen2)的性能。

1.3 内存优化

环境变量默认值作用与推荐配置
FLAGS_fraction_of_gpu_memory_to_use0.9GPU 显存使用比例。文档建议保持 0.9。该变量同时被 PaddleNLP 测试框架使用,例如 tests/transformers/test_modeling_common.py 在测试进程中将之设为 0.1 以控制显存占用。
FLAGS_gemm_use_half_precision_compute_type0是否使用半精度浮点计算。文档建议保持 0(关闭)。在 tests/llm/test_grpo.py 与 tests/llm/test_reinforce_plus_plus.py 的 RL 训练用例中同样以"False"显式设置,说明关闭该选项是默认的稳定配置。

1.4 Append Attention 优化

Append Attention 是 PaddleNLP 面向增量解码(增量 KV)设计的注意力实现,以下变量控制其在 decoder/encoder 阶段的分块策略:

环境变量默认值作用
FLAGS_cascade_attention_max_partition_size随 batch 变化:batch_size=1 时为 128,batch_size>1 时为 512Attention decoder 计算中 cache_kv 划分的 chunk 大小。显式设置后覆盖按 batch_size 的默认区分逻辑。
FLAGS_dec_block_shape_q16Append Attention decoder 计算中 q 划分的 block 大小。
FLAGS_enc_block_shape_q64Append Attention encoder 计算中 q 划分的 block 大小。

以上三个变量在 env.h 中有对应的 C++ 读取实现:未设置时分别回退到 16、64 与 32768(cascade 内部上限),设置后立即覆盖默认值,说明它们是纯算子层的"零开销"调参通道。同文件还提供了FLAGS_cascade_attention_deal_each_time(默认 32)、FLAGS_cascade_attention_num_stages(默认 2)、FLAGS_cascade_attention_num_threads(默认 128)等更细粒度的 cascade 控制项,供高级用户深入调节。

1.5 MLA 相关优化

  • FLAGS_mla_use_tensorcore:是否使用 Tensor Core 实现 MLA(Multi-head Latent Attention)计算,默认 True,仅在 Hopper 架构 GPU 上受支持;置 False 时改用 CUDA core 实现(Ampere 与 Hopper 均支持)。在 deepseek.md 的部署示例中,Hopper 环境一律导出FLAGS_mla_use_tensorcore=1,并明确标注"only support Hopper, Amper should be 0"。底层实现在 env.h 中读取。

1.6 allreduce 优化

  • FLAGS_custom_allreduce:是否在多卡推理计算中使用高性能自定义 allreduce 实现,默认 False。置 True 时启用,读取逻辑见 fused_transformer_layers.py。

二、投机解码(Speculative Decoding)实战

投机解码的核心思想是:每次解码时先用草稿模型(Draft Model)一次性生成多个候选 token,再用目标模型并行验证、接受其中连续正确的部分,从而在保证输出分布等价的前提下减少逐 token 串行解码的等待。PaddleNLP 为此提供了一套简单高效的推理工作流。

2.1 高效投机解码框架

传统方案中,草稿 token 验证与 MTP(Eagle/Draft Model)推理往往需要把 batch_size 按草稿 token 数成倍扩展。PaddleNLP 的高效注意力机制则在保持原始 batch 大小不变的前提下降低计算量,从根上解决了"大 batch 下投机解码无法加速"的痛点。该设计参考了 Vllm 的 batch_extension 思路。

2.2 参数说明

以下参数在 llm/predict/predictor.py 中定义,均可通过命令行--前缀传入:

参数默认值说明
speculate_methodNone投机解码算法。合法取值:None(常规自回归解码)、inference_with_reference(基于上下文的投机解码)、mtpeagle
speculate_max_draft_token_num1投机解码中每轮产生的最大 draft tokens 数目,最大支持 5。
speculate_max_ngram_size1用 n-gram 匹配 draft tokens 时的最大窗口大小。在inference_with_reference算法中,会先从 prompt 中滑动 ngram 窗口匹配出 draft tokens,窗口大小与输入输出重叠程度共同决定生成 draft tokens 的开销,从而影响加速效果。
speculate_verify_window2(暂时废弃)验证策略默认采用 TopP + window verify 的窗口大小。
speculate_max_candidate_len5(暂时废弃)产生的最大候选 tokens 数目,通过候选 tokens 与 draft tokens 比较完成验证(仅在 TopP + window verify 时生效)。
draft_model_name_or_pathNoneMTPEAGLE模式下草稿模型的路径。
draft_model_quant_type""MTPEAGLE模式下草稿模型的推理量化精度,取值参考--quant_type
return_full_hidden_statesFalseMTPEAGLE模式下是否返回全部 hidden states,MTP 验证需要开启。

其他限制与联动规则:

  1. 投机解码当前支持的最大 batch_size 为 128。
  2. 参数联动(见 predictor.py 的__post_init__):一旦设置speculate_method,会自动打开append_attn,进而自动打开block_attninference_model——即投机解码强制走增量注意力 + 推理模式,无需手动配置。
  3. speculate_verify_windowspeculate_max_candidate_len虽已标记为暂时废弃,参数仍保留在解析器中以兼容旧配置。

2.3 方法一:inference_with_reference(基于上下文的投机解码)

该算法使用 n-gram 窗口从 prompt 中匹配出草稿 token,适合输入输出重叠度高的场景,例如代码编辑、文档问答、长文档续写等。

动态图模型推理命令示例(以 Llama-2-7b-chat 为例):

python 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

2.4 方法二:MTP(Multi-Token Prediction)

MTP 是 DeepSeek-V3 引入的多 token 预测训练范式,PaddleNLP 支持 DeepSeek-V3/R1 及其 MTP 模型的推理。其关键特性包括:

  1. 在 Base Model 验证阶段,使用优化的 Attention 一次前向生成所有 Draft Token 的 logits,无需 batch_extension 增大 batch_size,解决了大 batch 下投机解码无法加速的问题;
  2. 在 MTP 推理阶段,统一处理上一轮草稿 token 的各种接受情况(全部拒绝、部分接受、全部接受),只需原始 batch 大小即可一次处理所有输入请求;
  3. 采用 Base Model 与 MTP 权重分离加载的解耦框架,导出后支持多种解码方式。
2.4.1 支持的量化精度组合
Base Model部署方式Base Model 量化类型MTP 量化类型
DeepSeek-R1TP8a8w8_fp8_wint4a8w8_fp8
DeepSeek-R1TP8weight_only_int4weight_only_int8
DeepSeek-R1TP16(2*TP8)a8w8_fp8a8w8_fp8
DeepSeek-R1TP16(2*TP8)weight_only_int8weight_only_int8

支持 DeepSeek-R1 与 MTP 的混合精度组合推理,可通过容器或脚本两种方式部署。

2.4.2 方式一:一键容器部署

DeepSeek-R1(a8w8_fp8_wint4) + MTP(a8w8_fp8),单机 TP8 部署(FP8 示例)

docker run --gpus all --shm-size 10g \ -v /path/to/R1-AWQ:/opt/tritonrt/model_repository/llm/1/ \ -v /path/to/MTP-FP8:/opt/tritonrt/model_repository/mtp/1/ \ -p 8080:8080 -p 8081:8081 -p 8082:8082 \ --ulimit memlock=-1 --ulimit stack=67108864 \ registry.cn-hangzhou.aliyuncs.com/trt-inference-server/triton_23.09_tp8:latest

对应的 LMDeploy 推理命令示例:

python3 -m lmdeploy.mtp.pipeline \ --model-path /path/to/DeepSeek-R1 \ --mtp-path /path/to/MTP \ --tp 8 \ --session-len 4096 \ --max-batch-size 16 \ --quantization a8w8_fp8_wint4 \ --mtp-quant a8w8_fp8 \ --cache-max-entry-count 0.5 \ --num-tokens 8

参数含义:

  • --tp:张量并行配置;
  • --quantization:Base 模型量化类型;
  • --mtp-quant:MTP 模型量化类型;
  • --num-tokens:每次前向生成的 token 数(MTP 为 8,常规解码为 1);
  • 其余参数与常规 LMDeploy 推理一致。

单机 TP8 的 PaddleNLP 推理服务镜像启动脚本(环境变量方式配置投机解码):

export MODEL_PATH=${MODEL_PATH:-/PATH_TO_MODEL/} export MODEL_MTP_PATH=${MODEL_PATH:-/PATH_TO_MTP/} export model_name="deepseek-ai/DeepSeek-R1-MTP/a8w8_fp8_wint4" docker run --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" && 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" \ && start_server $model_name && tail -f /dev/null'

DeepSeek-R1(weight_only_int8) + MTP(weight_only_int8),双机 TP16 配置

先确保两个节点可以互相 ping 通(master 节点ping 192.168.0.1,slave 节点ping 192.168.0.2),然后在两台机器上分别启动容器:

model_name=${model_name:-"deepseek-ai/DeepSeek-R1-MTP-2nodes/weight_only_int8"} export POD_0_IP=master_ip export POD_IPS=master_ip,slave_ip # 该环境变量两台机器必须保持一致 # 默认服务端口,若冲突可通过 export 修改 export SERVICE_HTTP_PORT=${PUSH_MODE_HTTP_PORT:-${SERVICE_HTTP_PORT:-"9965"}} # 注意:SPECULATE_MODEL_QUANT_TYPE 需与 MTP 支持精度表匹配 export SPECULATE_MODEL_QUANT_TYPE="weight_only_int8" # /PATH_TO_MODEL 为模型挂载路径,/PATH_TO_MTP 为 MTP 挂载路径

node1 与 node2 使用相同命令:

export model_name=${model_name:-"deepseek-ai/DeepSeek-R1-MTP-2nodes/weight_only_int8"} export MODEL_PATH=${MODEL_PATH:-/PATH_TO_MODEL/} export MODEL_MTP_PATH=${MODEL_PATH:-/PATH_TO_MTP/} docker run --gpus all --shm-size 32G --network=host --privileged --cap-add=SYS_PTRACE \ -v $MODEL_PATH:/models -v $MODEL_MTP_PATH:/models-mtp -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=16 && export MP_NNODE=2 \ && export POD_0_IP=192.168.0.1 && export POD_IPS=192.168.0.1,192.168.0.2 \ && export SPECULATE_MODEL_QUANT_TYPE="weight_only_int8" && export SPECULATE_METHOD="mtp" \ && export SPECULATE_MODEL_PATH="/models-mtp" && export SPECULATE_MAX_DRAFT_TOKEN_NUM=1 \ && start_server $model_name && tail -f /dev/null'

服务验证(curl 请求):

curl ${ip}:9965/v1/chat/completions \ -H 'Content-Type: application/json' \ -d '{ "model":"default", "text":"Hello, how are you?" }'

OpenAI 兼容请求(Python):

import openai client = openai.Client(base_url=f"http://127.0.0.1:9965/v1/chat/completions", api_key="EMPTY_API_KEY") # 非流式响应 response = client.completions.create( model="default", prompt="Hello, how are you?", max_tokens=50, stream=False, ) print(response) print("\n") # 流式响应 response = client.completions.create( model="default", prompt="Hello, how are you?", max_tokens=100, stream=True, ) for chunk in response: if chunk.choices[0] is not None: print(chunk.choices[0].text, end='') print("\n")
2.4.3 方式二:脚本推理测试

DeepSeek-R1 动态图 + MTP 动态图,双机 TP16(weight_only_int8 + weight_only_int8)

双机推理前确保节点可互相 ping 通;node1 与 node2 使用完全相同的脚本:

$ cat run_dynamic_mtp.sh export MODEL_TAG=deepseek-ai/DeepSeek-R1 export DRAFT_MODEL_TAG=deepseek-ai/DeepSeek-R1-MTP export QUANT_MODE=weight_only_int8 export DRAFT_MODEL_QUANT_MODE=weight_only_int8 export TOTAL_MAX_LENGTH=8192 export MAX_DEC_LEN=2048 # 算子加速策略 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ predictor.py \ --model_name_or_path ${MODEL_TAG} \ --dtype bfloat16 \ --mode dynamic \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --max_length ${MAX_DEC_LEN} \ --speculate_method mtp \ --draft_model_name_or_path ${DRAFT_MODEL_TAG} \ --draft_model_quant_type ${DRAFT_MODEL_QUANT_MODE} \ --speculate_max_draft_token_num 1 \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash run_dynamic_mtp.sh

DeepSeek-R1 动态图 + MTP 动态图,双机 TP16(FP8 + FP8):node1 与 node2 脚本相同,将模型与量化相关变量替换为 FP8 版本:

$ cat run_dynamic_mtp.sh export MODEL_TAG=deepseek-ai/DeepSeek-R1-FP8 export DRAFT_MODEL_TAG=deepseek-ai/DeepSeek-R1-MTP-FP8 export QUANT_MODE=a8w8_fp8 export DRAFT_MODEL_QUANT_MODE=a8w8_fp8 export TOTAL_MAX_LENGTH=8192 export MAX_DEC_LEN=2048 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ predictor.py \ --model_name_or_path ${MODEL_TAG} \ --dtype bfloat16 \ --mode dynamic \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --max_length ${MAX_DEC_LEN} \ --speculate_method mtp \ --draft_model_name_or_path ${DRAFT_MODEL_TAG} \ --draft_model_quant_type ${DRAFT_MODEL_QUANT_MODE} \ --speculate_max_draft_token_num 1 \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash run_dynamic_mtp.sh

DeepSeek-R1 动态图 + MTP 动态图,单机 TP8(weight_only_int4 + weight_only_int8)

$ cat run_dynamic_mtp.sh export MODEL_TAG=deepseek-ai/DeepSeek-R1 export DRAFT_MODEL_TAG=deepseek-ai/DeepSeek-R1-MTP export QUANT_MODE=weight_only_int4 export DRAFT_MODEL_QUANT_MODE=weight_only_int8 export TOTAL_MAX_LENGTH=8192 export MAX_DEC_LEN=2048 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch \ --gpus ${CUDA_VISIBLE_DEVICES} \ predictor.py \ --model_name_or_path ${MODEL_TAG} \ --dtype bfloat16 \ --mode dynamic \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --max_length ${MAX_DEC_LEN} \ --speculate_method mtp \ --draft_model_name_or_path ${DRAFT_MODEL_TAG} \ --draft_model_quant_type ${DRAFT_MODEL_QUANT_MODE} \ --speculate_max_draft_token_num 1 \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash run_dynamic_mtp.sh

【推荐】Base Model 静态图 + MTP 动态图,双机 TP16

注意事项:

  1. 投机解码导出的模型支持所有方法,因此导出时speculate_method设置为默认的inference_with_reference即可;
  2. 静态图模型可从 DeepSeek-R1 导出,也可直接下载官方预导出的模型。

(1)weight_only_int8 + weight_only_int8 组合。先双机导出静态图(node1 与 node2 脚本相同):

$ cat export.sh export MODEL_TAG=deepseek-ai/DeepSeek-R1 export OUTPUT_PATH=/path/to/exported_model export QUANT_MODE=weight_only_int8 export TOTAL_MAX_LENGTH=8192 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ export_model.py \ --model_name_or_path ${MODEL_TAG} \ --output_path ${OUTPUT_PATH} \ --dtype bfloat16 \ --inference_model 1 \ --append_attn 1 \ --block_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --speculate_method inference_with_reference \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash export.sh

再双机运行推理(node1 与 node2 脚本相同):

$ cat run_mtp_infer.sh export OUTPUT_PATH=/path/to/exported_model export DRAFT_MODEL_TAG=deepseek-ai/DeepSeek-R1-MTP export TOTAL_MAX_LENGTH=8192 export MAX_DEC_LEN=2048 export QUANT_MODE=weight_only_int8 export DRAFT_MODEL_QUANT_MODE=weight_only_int8 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ predictor.py \ --model_name_or_path ${OUTPUT_PATH} \ --dtype bfloat16 \ --mode static \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --max_length 1024 \ --speculate_method mtp \ --draft_model_name_or_path ${DRAFT_MODEL_TAG} \ --draft_model_quant_type ${DRAFT_MODEL_QUANT_MODE} \ --speculate_max_draft_token_num 1 \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash run_mtp_infer.sh

(2)FP8 + FP8 组合,双机 TP16。导出脚本中替换为 FP8 模型与量化配置:

$ cat export.sh export MODEL_TAG=deepseek-ai/DeepSeek-R1-FP8 export OUTPUT_PATH=/path/to/exported_model export QUANT_MODE=a8w8_fp8 export TOTAL_MAX_LENGTH=8192 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ export_model.py \ --model_name_or_path ${MODEL_TAG} \ --output_path ${OUTPUT_PATH} \ --dtype bfloat16 \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --speculate_method inference_with_reference \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash export.sh

推理脚本(node1 与 node2 相同):

$ cat run_mtp_infer.sh export OUTPUT_PATH=/path/to/exported_model export DRAFT_MODEL_TAG=deepseek-ai/DeepSeek-R1-MTP-FP8 export TOTAL_MAX_LENGTH=8192 export MAX_DEC_LEN=2048 export QUANT_MODE=a8w8_fp8 export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" python -m paddle.distributed.launch --ips "192.168.0.1,192.168.0.2" \ --gpus ${CUDA_VISIBLE_DEVICES} \ predictor.py \ --model_name_or_path ${OUTPUT_PATH} \ --dtype bfloat16 \ --mode static \ --inference_model 1 \ --append_attn 1 \ --total_max_length ${TOTAL_MAX_LENGTH} \ --quant_type ${QUANT_MODE} \ --max_length ${MAX_DEC_LEN} \ --speculate_method mtp \ --draft_model_name_or_path ${DRAFT_MODEL_TAG} \ --draft_model_quant_type ${QUANT_MODE} \ --speculate_max_draft_token_num 1 \ --return_full_hidden_states 1 \ --mla_use_matrix_absorption 1 $ bash run_mtp_infer.sh

2.5 方法三:EAGLE

speculate_method同样支持eagle,其参数体系(draft_model_name_or_pathdraft_model_quant_typespeculate_max_draft_token_num等)与 MTP 保持一致。在源码层面,predictor.py 将eaglemtp统一路由到EagleProposer完成草稿 token 的生成与验证,因此两者的使用流程可以相互参考。

三、总结与推荐组合

将两类优化手段叠加使用,可以同时压榨单算子性能与解码算法效率:

  1. 算子层:根据模型量化精度选择 GEMM 优化组合(A8W8 走 blaslt 全局搜索 + cuda_core_int8;FP8 走 CUTLASS + cuda_core_fp8),GQA 模型开启 XQA,DeepSeek 系列在 Hopper 上开启 MLA Tensor Core,多卡推理开启 custom allreduce,并通过 Append Attention 分块参数适配 batch 规模。
  2. 算法层:输入输出重叠高的场景(代码编辑、文档问答)用inference_with_reference;追求极致吞吐与低延迟的大模型服务用mtp(DeepSeek-V3/R1)或eagle,配合speculate_max_draft_token_numspeculate_max_ngram_size调节草稿长度与匹配窗口。
  3. 工程层:静态图导出(export_model.py+--mode static)与动态图(--mode dynamic)均可搭配投机解码;大模型多卡部署时使用paddle.distributed.launch --ips指定节点列表,容器化部署则通过SPECULATE_METHODSPECULATE_MODEL_PATHSPECULATE_MODEL_QUANT_TYPE等环境变量注入配置。

所有参数与命令均可在 llm/predict/predictor.py、llm/predict/export_model.py、csrc/gpu/env.h 与 csrc/utils/tune_cublaslt_int8_gemm.py 中进一步核实与调参,完整推理参数表见 inference.md,DeepSeek 系列专项部署见 deepseek.md。

  • 人工智能
  • 大模型
  • NLP
  • 深度学习
  • 预训练
  • 微调
  • RLHF
  • 模型量化

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

相关推荐

上一篇:Rspack测试覆盖率:确保代码质量的关键指标
下一篇:cheat.sh 完全指南:一条 curl 命令统一访问 56 种语言与 1000+ 命令的终极速查表

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询