在LLM的推理场景中,传统的Auto-Regressive Decoding慢,是因为step-by-step导致了并发性不够。推理阶段属于内存带宽受限而计算资源过剩的阶段。因此,并行解码特性就是采用处理器中常用的“Speculative Execution”优化技术,通过额外的计算资源完成推测执行,提升并发性。但是,由于开启并行解码会使用Prompt输入维护前缀树和草稿token map,所以会对首Token时延有一定影响。
并行解码的优势:
针对足够长度的输入输出或代码生成等场景的小batch推理,并行解码特性可利用算力优势弥补访存带宽受限的影响,提升算力利用率。同时因为通过验证token的比率会直接影响到并行解码的收益,因此贪婪场景更能充分发挥并行解码的效果,而采样或惩罚类操作会影响并行解码的收益空间。
为了发挥并行解码的优势,需满足如下前提:
目前支持两种并行解码算法,差异主要在于候选token生成的方式不同。如表1所示。
并行解码算法 |
候选token生成方式 |
适用场景 |
---|---|---|
memory_decoding |
利用trie-tree(前缀树)缓存模型历史的输入输出,从中获取候选token。 |
代码生成或检索类场景。 |
lookahead |
基于jacobi迭代并辅以Prompt以及输出结果生成候选token。 |
文本生成、对话系统及多样化查询回答。 |
配置项 |
取值类型 |
取值范围 |
配置说明 |
---|---|---|---|
speculationGamma |
uint32_t |
与plugin参数配置有关 |
memory_decoding时,该值配置应大于等于decoding_length。 建议值:等于decoding_length。 |
配置项 |
取值类型 |
取值范围 |
配置说明 |
---|---|---|---|
maxIterTimes |
uint32_t |
与plugin参数配置有关 |
如果dynamic_algo为true,该值需大于等于期望输出的长度+speculationGamma的值。 例:期望最大输出长度为512,则该值需要配置>=512+speculationGamma。 |
配置项 |
取值类型 |
取值范围 |
配置说明 |
---|---|---|---|
plugin_params |
std::string |
plugin_type:la level :[3, 16] window :[1, 16] guess_set_size :[1, 16] |
plugin_type配置la,表示当前选择lookahead并行解码。 level/window/guess_set_size为lookahead算法中的N/W/G参数,默认值为4/5/5,且每个参数可配置的上限不超过16。 配置示例: "{\"plugin_type\":\"la\",\"level\": 4,\"window\": 5,\"guess_set_size\": 5}" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | "ModelDeployConfig" : { "maxSeqLen" : 2560, "maxInputTokenLen" : 2048, "truncation" : false, "speculationGamma": 16, "ModelConfig" : [ { "plugin_params":" {\"plugin_type\":\"memory_decoding\",\"decoding_length\":16,\"dynamic_algo\":true}" "modelInstanceType" : "Standard", "modelName" : "Codellama-34B", "modelWeightPath" : "/data/weights/Codellama-34B", "worldSize" : 4, "cpuMemSize" : 5, "npuMemSize" : -1, "backendType" : "atb", "trustRemoteCode" : false } ] } |
lookahead算法的并行解码配置样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | "ModelDeployConfig" : { "maxSeqLen" : 2560, "maxInputTokenLen" : 2048, "truncation" : false, "speculationGamma": 30, "ModelConfig" : [ { "plugin_params":"{\"plugin_type\":\"la\",\"level\":4,\"window\":5,\"guess_set_size\":5}", "modelInstanceType" : "Standard", "modelName" : "Qwen2.5-7B-Instruct", "modelWeightPath" : "/data/weights/Qwen2.5-7B-Instruct", "worldSize" : 1, "cpuMemSize" : 5, "npuMemSize" : -1, "backendType" : "atb", "trustRemoteCode" : false } ] } |