SGLang开启KV缓存复用,降低重复prompt显存开销教
SGLang 内置 KV 缓存复用功能,官方称为 RadixAttention,它会把已计算过的 prompt 前缀缓存下来。
当多个请求包含相同前缀时,后续请求直接复用缓存,不用重新计算,从而降低重复 prompt 带来的显存开销,也能减少首 token 延迟。
本文结合零基础视角,讲清如何开启、验证和避坑。
先确认你的 SGLang 是否支持这个开关
不同版本的 SGLang 对参数命名略有差异,先确认当前版本有没有 --enable-prefix-caching:
python -m sglang.launch_server --help | grep prefix-caching
如果输出为空,说明版本太旧,建议升级到最新版:
pip install -U sglang[all]
在 zsh 或部分 shell 中,记得给 [all] 加引号:pip install -U 'sglang[all]'。
启动服务时显式开启 KV 缓存复用
启动服务时加入 --enable-prefix-caching 参数,让复用明确生效。
以 Qwen 模型为例:
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 30000 \
--enable-prefix-caching
使用 Docker 部署时同理,在容器启动命令中加上这个参数。
注意不要同时设置 --disable-radix-cache 之类的开关,否则会覆盖前面的配置。
用两次请求验证是否真的命中缓存
服务启动后,向兼容 OpenAI 的接口发送两个带相同前缀的请求。
第二次请求的 completion_tokens 基本不变,但整体耗时明显下降,说明缓存已经命中。
更精确的做法是查看监控指标:
curl http://127.0.0.1:30000/metrics | grep prefix_cache
关注 sglang:prefix_cache_hit_rate,第二次请求后命中率会从 0 变成 1。
同时用 nvidia-smi 观察显存,相同并发下显存占用会比未开启时更平稳,不会因重复 prompt 成倍上涨。
避坑说明与常见疑问
不是所有前缀都能命中缓存。 只有连续相同的 token 前缀才会被复用。
所以建议把系统提示词、工具定义放在 prompt 开头,并且不要每次请求都动态插入时间戳之类的随机内容。
开启后会不会影响生成结果? 不会。
KV 缓存复用只是跳过前面已计算部分,后续解码逻辑完全一致。
显存能省多少? 取决于重复前缀长度和请求量。
重复前缀越长、请求频率越高,收益越明显。
但第一次完整计算仍然要占显存,所以基础显存还是得按单条最长请求预留。
长前缀场景建议配合 chunked prefill。 如果前缀很长,可以同时设置 --chunked-prefill-size 4096,避免一次算太长导致显存瞬时冲高。
遇到“unknown argument”或模型加载失败时,优先升级 SGLang 版本,再检查有没有与其他 --cache 类参数冲突。
如果你正在处理重复 prompt 导致显存吃紧的问题,建议先按本文步骤执行一次,再根据实际环境微调。