- 人工智能
- 大模型
- NLP
- 深度学习
- 预训练
- 微调
- RLHF
- 模型量化
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
导读
本文基于 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_search | 0(关闭) | 是否在推理时动态搜索最优 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_GEMM | False | 是否使用 CUTLASS 实现 fp8 gemm。置 True 后 A8W8 模型会走 Tensor Core,性能更优。源码中该开关在 fused_transformer_layers.py 中被读取并打印使用日志。 |
FLAGS_use_cutlass_device_best_config_path | 空 | 当FLAGS_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_use | 0.9 | GPU 显存使用比例。文档建议保持 0.9。该变量同时被 PaddleNLP 测试框架使用,例如 tests/transformers/test_modeling_common.py 在测试进程中将之设为 0.1 以控制显存占用。 |
FLAGS_gemm_use_half_precision_compute_type | 0 | 是否使用半精度浮点计算。文档建议保持 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 时为 512 | Attention decoder 计算中 cache_kv 划分的 chunk 大小。显式设置后覆盖按 batch_size 的默认区分逻辑。 |
FLAGS_dec_block_shape_q | 16 | Append Attention decoder 计算中 q 划分的 block 大小。 |
FLAGS_enc_block_shape_q | 64 | Append 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_method | None | 投机解码算法。合法取值:None(常规自回归解码)、inference_with_reference(基于上下文的投机解码)、mtp、eagle。 |
speculate_max_draft_token_num | 1 | 投机解码中每轮产生的最大 draft tokens 数目,最大支持 5。 |
speculate_max_ngram_size | 1 | 用 n-gram 匹配 draft tokens 时的最大窗口大小。在inference_with_reference算法中,会先从 prompt 中滑动 ngram 窗口匹配出 draft tokens,窗口大小与输入输出重叠程度共同决定生成 draft tokens 的开销,从而影响加速效果。 |
speculate_verify_window | 2(暂时废弃) | 验证策略默认采用 TopP + window verify 的窗口大小。 |
speculate_max_candidate_len | 5(暂时废弃) | 产生的最大候选 tokens 数目,通过候选 tokens 与 draft tokens 比较完成验证(仅在 TopP + window verify 时生效)。 |
draft_model_name_or_path | None | MTP或EAGLE模式下草稿模型的路径。 |
draft_model_quant_type | "" | MTP或EAGLE模式下草稿模型的推理量化精度,取值参考--quant_type。 |
return_full_hidden_states | False | 在MTP或EAGLE模式下是否返回全部 hidden states,MTP 验证需要开启。 |
其他限制与联动规则:
- 投机解码当前支持的最大 batch_size 为 128。
- 参数联动(见 predictor.py 的
__post_init__):一旦设置speculate_method,会自动打开append_attn,进而自动打开block_attn与inference_model——即投机解码强制走增量注意力 + 推理模式,无需手动配置。 speculate_verify_window与speculate_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 22.4 方法二:MTP(Multi-Token Prediction)
MTP 是 DeepSeek-V3 引入的多 token 预测训练范式,PaddleNLP 支持 DeepSeek-V3/R1 及其 MTP 模型的推理。其关键特性包括:
- 在 Base Model 验证阶段,使用优化的 Attention 一次前向生成所有 Draft Token 的 logits,无需 batch_extension 增大 batch_size,解决了大 batch 下投机解码无法加速的问题;
- 在 MTP 推理阶段,统一处理上一轮草稿 token 的各种接受情况(全部拒绝、部分接受、全部接受),只需原始 batch 大小即可一次处理所有输入请求;
- 采用 Base Model 与 MTP 权重分离加载的解耦框架,导出后支持多种解码方式。
2.4.1 支持的量化精度组合
| Base Model | 部署方式 | Base Model 量化类型 | MTP 量化类型 |
|---|---|---|---|
| DeepSeek-R1 | TP8 | a8w8_fp8_wint4 | a8w8_fp8 |
| DeepSeek-R1 | TP8 | weight_only_int4 | weight_only_int8 |
| DeepSeek-R1 | TP16(2*TP8) | a8w8_fp8 | a8w8_fp8 |
| DeepSeek-R1 | TP16(2*TP8) | weight_only_int8 | weight_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.shDeepSeek-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.shDeepSeek-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:
注意事项:
- 投机解码导出的模型支持所有方法,因此导出时
speculate_method设置为默认的inference_with_reference即可;- 静态图模型可从 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.sh2.5 方法三:EAGLE
speculate_method同样支持eagle,其参数体系(draft_model_name_or_path、draft_model_quant_type、speculate_max_draft_token_num等)与 MTP 保持一致。在源码层面,predictor.py 将eagle与mtp统一路由到EagleProposer完成草稿 token 的生成与验证,因此两者的使用流程可以相互参考。
三、总结与推荐组合
将两类优化手段叠加使用,可以同时压榨单算子性能与解码算法效率:
- 算子层:根据模型量化精度选择 GEMM 优化组合(A8W8 走 blaslt 全局搜索 + cuda_core_int8;FP8 走 CUTLASS + cuda_core_fp8),GQA 模型开启 XQA,DeepSeek 系列在 Hopper 上开启 MLA Tensor Core,多卡推理开启 custom allreduce,并通过 Append Attention 分块参数适配 batch 规模。
- 算法层:输入输出重叠高的场景(代码编辑、文档问答)用
inference_with_reference;追求极致吞吐与低延迟的大模型服务用mtp(DeepSeek-V3/R1)或eagle,配合speculate_max_draft_token_num与speculate_max_ngram_size调节草稿长度与匹配窗口。 - 工程层:静态图导出(
export_model.py+--mode static)与动态图(--mode dynamic)均可搭配投机解码;大模型多卡部署时使用paddle.distributed.launch --ips指定节点列表,容器化部署则通过SPECULATE_METHOD、SPECULATE_MODEL_PATH、SPECULATE_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.
相关推荐
PaddleNLP 高性能推理最佳实践:环境变量调优全指南
PaddleNLP 高性能推理最佳实践:环境变量调优全指南 PaddleNLP 为大模型推理提供了丰富的环境变量(FLAGS)体系,用于在不改动代码的前提下显著
人工智能大模型NLP深度学习预训练微调RLHF模型量化模型推理服务本地部署模型压缩强化学习模型评测PaddleNLP投机解码:MTP技术推理加速
PaddleNLP投机解码:MTP技术推理加速 引言:大模型推理的瓶颈与突破 在大语言模型(LLM)的实际部署中,推理速度一直是制约应用性能的关键因素。传统的自
人工智能大模型深度学习NLP预训练微调模型推理服务模型量化分布式训练强化学习MXNet Gluon 调试与性能优化实战指南:Hybridize 原理、NaiveEngine 与关键环境变量调优
MXNet Gluon 调试与性能优化实战指南:Hybridize 原理、NaiveEngine 与关键环境变量调优 本文是一份面向 MXNet(Apache
人工智能深度学习机器学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考