投机推理使用说明
什么是投机推理
传统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,大幅提升推理性能。

如此一来,投机推理可以带来如下优势:
更短的decode平均时间:以qwen2-72b作为LLM大模型、qwen2-0.5b作为小模型为例,小模型推理一次的时间不足大模型的1/5,加上校验后,执行一次完整投机流程的时间也仅为大模型的1.5倍左右(投机步数设置为3步)。而这一次投机流程,平均可以生成3个有效token,即用1.5倍的时间代价,生成了3倍的token数量,性能提升了100%。
投机推理参数设置
在启动离线或在线推理服务时参考表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接口服务为例。
- 使用下面命令启动推理服务。
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
- 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 }'