更新时间:2025-07-29 GMT+08:00
分享

投机推理使用说明

什么是投机推理

传统LLM推理主要依赖于自回归式(auto-regressive)的解码(decoding)方式,每步解码只能够产生一个输出token,并且需要将历史输出内容拼接后重新作为LLM的输入,才能进行下一步的解码。为了解决上述问题,提出了一种投机式推理方式,其核心思想是通过计算代价远低于LLM的小模型替代LLM进行投机式的推理(Speculative Inference)。即每次先使用小模型试探性地推理多步,再将这些推理结果收集到一起,一次交由LLM进行验证。

如下图所示,在投机模式下,先由小模型依次推理出token 1、2、3,并将这3个token一次性输入大模型LLM推理,得到1'、2'、3'、4',将1、2、3与1'、2'、3'依次校验,即可用三次小模型推理(相较于大模型,耗时极短),以及一次大模型推理的时间,得到1~4个token,大幅提升推理性能。

图1 大小模型投机示意图

如此一来,投机推理可以带来如下优势:

更短的decode平均时间:以qwen2-72b作为LLM大模型、qwen2-0.5b作为小模型为例,小模型推理一次的时间不足大模型的1/5,加上校验后,执行一次完整投机流程的时间也仅为大模型的1.5倍左右(投机步数设置为3步)。而这一次投机流程,平均可以生成3个有效token,即用1.5倍的时间代价,生成了3倍的token数量,性能提升了100%。

投机推理参数设置

在启动离线或在线推理服务时参考表1所示配置参数,使用投机推理功能。

表1 投机推理相关参数

服务启动方式

配置项

取值类型

配置说明

offline

speculative_model

str

小模型权重地址,目前支持相对基础模型(如llama2-13b-chat)较小的LLM模型(如llama1.1b)或者基础模型对应的eagle模型(如EAGLE-llama2-chat-13B)。

Eagle小模型可以通过开源模型获取,也可以参考Eagle投机小模型训练训练获取。

offline

num_speculative_tokens

int

小模型投机步数,即小模型生成几个token来交给大模型进行推理,取值通常在2~6之间,步数越小,每次校验的token越少,投机token与大模型一致的概率越高;反之,步数过大会导致与大模型无法保持一致,造成资源浪费。

offline

speculative_draft_tensor_parallel_size

int

小模型所使用的设备数量,由于小模型通常较小,所以此处建议设置为1,如果使用eagle作为小模型,此处必须设置为1

offline

speculative_disable_by_batch_size

int

投机推理batch上限,即当输入batch大于此值,将不进行投机推理。其使用原因是投机推理在大batch下收益会显著下降,故需要在batch过大时关闭该特性。

online

--speculative-model

str

小模型权重地址,目前支持相对基础模型(如llama2-13b-chat)较小的LLM模型(如llama1.1b)或者基础模型对应的eagle模型(如EAGLE-llama2-chat-13B)

Eagle小模型可以通过开源模型获取,也可以参考Eagle投机小模型训练训练获取。

online

--num-speculative-tokens

int

小模型投机步数,即小模型生成几个token来交给大模型进行推理,取值通常在2~6之间,步数越小,每次校验的token越少,投机token与大模型一致的概率越高;反之,步数过大会导致与大模型无法保持一致,造成资源浪费。

online

--speculative-draft-tensor-parallel-size

int

小模型所使用的设备数量,由于小模型通常较小,所以此处建议设置为1,如果使用eagle作为小模型,此处必须设置为1

online

--speculative-disable-by-batch-size

int

投机推理batch上限,即当输入batch大于此值,将不进行投机推理。其使用原因是投机推理在大batch下收益会显著下降,故需要在batch过大时关闭该特性。

投机推理端到端推理示例

llama-2-13b-chat-hf模型作为LLM大模型,llama1.1b作为小模型,启用openai接口服务为例。

  1. 使用下面命令启动推理服务。
    base_model=/path/to/base_model
    spec_model=/path/to/spec_model
    spec_step=3
    spec_parallel=1
    python -m vllm.entrypoints.openai.api_server \
    --model=${base_model} \   # 大模型权重地址
    --speculative-model=${spec_model} \   # 投机小模型权重地址
    --num-speculative-tokens=${spec_step} \ #投机步数
    --speculative-draft-tensor-parallel-size=${spec_parallel} \ #投机小模型使用的卡数,通常设置为1
    --tensor-parallel-size=1 \
    --host 0.0.0.0 \
    --port 9999 \
    --dtype auto \
    --gpu-memory-utilization=0.9 \
    --served-model-name test_server_demo \
    --trust-remote-code
  2. curl请求
    curl http://0.0.0.0:9999/v1/chat/completions \    -H "Content-Type: application/json" \    -d '{         "model": "test_server_demo",         "messages": [             {"role": "system", "content": "You are a helpful assistant."},             {"role": "user", "content": "Who won the world series in 2020?"},             {"role":"assistant","content":"The World Series in 2020 was won by the Los Angeles Dodgers. They defeated the Tampa Bay Rays in a six-game series, which was delayed and played in October and November due to the COVID-19 pandemic."},             {"role": "user", "content": "Do you like NewYork?"}         ],     "max_tokens": 100,     "top_k": -1,     "top_p": 1,     "temperature": 0,     "ignore_eos": false,     "stream": false     }'

执行推理参考

  1. 配置服务化参数。Ascend vllm使用该特性需参考表1,其它参数请参考启动推理服务
  2. 启动服务。具体请参考启动推理服务
  3. 精度评测和性能评测。具体请参考推理服务精度评测推理服务性能评测

相关文档