Prefix Cache
当前大语言模型推理系统普遍采用KV Cache缓存机制,但该机制存在以下两个问题:
- 随着LLM支持的序列长度不断增长,KV Cache所需要的显存资源也急剧增加。
- KV Cache只对当前session有效,如果跨session存在重复Token序列的情况下无法实现复用。
Prefix Cache通过RadixTree保留session结束后的KV Cache,新的session请求在RadixTree中查找是否存在相同的Token序列,即可复用之前计算好的KV Cache,从而实现跨session的KV Cache复用。
其优势主要包括:
- 更短的prefill时间:由于跨session的重复Token序列对应的KV Cache可以复用,那么就可以减少一部分前缀Token的KV Cache计算时间,从而减少prefill的时间。
- 更高效的显存使用:当正在处理的sessions相互之间存在公共前缀时,公共前缀部分的KV Cache可以共用,不必重复占用多份显存。
限制与约束
- Atlas 800I A2 推理服务器和Atlas 300I Duo 推理卡支持此特性。
- Qwen2系列、DeepSeek-R1和DeepSeek-V3模型支持对接此特性。
- 当跨session公共前缀Token数大于等于Page Attention中的block size,才会进行公共前缀Token的KV Cache复用。
- Prefix Cache支持的量化特性:W8A8量化与稀疏量化,其他量化特性暂不支持。
- 该特性不能和Multi-LoRA、长序列以及多机推理特性同时使用。
- 该特性可以和PD分离、并行解码、MTP、异步调度和SplitFuse特性同时使用。
- PD分离场景下,P节点和D节点都需要开启该特性。
- 前缀复用率低或者没有复用的情况下,不建议开启该特性。
- DeepSeek-R1和DeepSeek-V3模型开启该特性时,需设置“export TASK_QUEUE_ENABLE=1”。
开启Prefix Cache特性需要配置的补充参数如表1~表3所示:
配置项 |
取值类型 |
取值范围 |
配置说明 |
---|---|---|---|
plugin_params |
std::string |
"{\"plugin_type\":\"prefix_cache\"}" |
|
配置项 |
取值类型 |
取值范围 |
配置说明 |
---|---|---|---|
enablePrefixCache |
- |
- |
该字段已无需配置,目前版本按老版本方式配置无影响。 该字段预计日落时间:2026年Q1版本。 |
使用样例
下面以DeepSeek-R1模型,只开启Prefix Cache特性为例。如果是非DeepSeek模型,“enable_nz”请修改为“false”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | "ModelDeployConfig" : { "maxSeqLen" : 2560, "maxInputTokenLen" : 2048, "truncation" : false, "ModelConfig" : [ { "plugin_params": "{\"plugin_type\":\"prefix_cache\"}", "modelInstanceType" : "Standard", "modelName" : "DeepSeek-R1_w8a8", "modelWeightPath" : "/data/weights/DeepSeek-R1_w8a8", "worldSize" : 8, "cpuMemSize" : 5, "npuMemSize" : -1, "backendType" : "atb", "trustRemoteCode" : false, "models": { "deepseekv2": { "kv_cache_options": {"enable_nz": true} } } } ] }, |
如果需要特性叠加使用,如:Prefix Cache和MTP叠加,方法如下:
"plugin_params": "{\"plugin_type\":\"mtp,prefix_cache\",\"num_speculative_tokens\": 1}",
父主题: 特性介绍