1. 什么是 Prefix Cache
在模型推理场景下,经常会使用缓存机制来提升吞吐和性能。常见的有两种缓存机制:
- Key-Value Cache (KV Cache),面向的是单次请求的内部,将 Transformer 模型中间计算结果(Key 和 Value)缓存起来,避免重复计算
- Prefix Cache,面向的是多次请求时,利用 Prompt 的公共前缀,避免重复计算。
Prefix Cache 的原理是通过哈希、基数树等结构检测请求的公共前缀,在 prefill 阶段复用之前的计算结果,提升推理性能。

上面这张图就是 Radix Tree (基数树) 在多次请求下构建 Prefix Cache 的示意图,
随着请求的增加,缓存树在不断地调整,既会增加新的节点,也会通过策略删除节点。
Prefix Cache 给 AI 应用开发者的启示是:
- 将 Prompt 不变的部分放在前面,变动的部分放在后面
- 有多个 Prompt 尽量保持相同的前缀
2. 启动环境
为了能够直接使用内置的 benchmark 工具,这里使用 vLLM 的 OpenAI API Server 镜像。
1
2
3
4
5
6
7
8
9
10
| nerdctl run -it \
-p 8000:8000 \
--gpus all \
--ipc=host \
--ulimit memlock=-1 \
--ulimit stack=67108864 \
--name vllm \
--volume /data/models:/data/models \
--entrypoint /bin/bash \
registry.cn-beijing.aliyuncs.com/opshub/vllm-vllm-openai:v0.10.1.1
|
3. 启动服务
3.1 推理服务
1
2
3
4
5
6
7
8
9
10
| python3 -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen2.5-7B-Instruct \
--served-model-name /data/models/Qwen2.5-7B-Instruct \
--port 8000 \
--gpu_memory_utilization 0.8 \
--max-model-len 4096 \
--max-seq-len-to-capture 8192 \
--max-num-seqs 128 \
--enforce-eager \
--no-enable-prefix-caching
|
1
2
3
4
5
6
7
8
9
10
| python3 -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen2.5-7B-Instruct \
--served-model-name /data/models/Qwen2.5-7B-Instruct \
--port 8000 \
--gpu_memory_utilization 0.8 \
--max-model-len 4096 \
--max-seq-len-to-capture 8192 \
--max-num-seqs 128 \
--enforce-eager \
--enable-prefix-caching
|
3.2 启动客户端
1
| nerdctl exec -it vllm /bin/bash
|
1
2
3
4
5
6
7
| vllm bench serve \
--backend openai \
--model /data/models/Qwen2.5-7B-Instruct \
--dataset-name random \
--random-input-len 1024 \
--num-prompts 1024 \
--request-rate 16
|
1
2
3
4
5
6
7
8
| vllm bench serve \
--backend openai \
--model /data/models/Qwen2.5-7B-Instruct \
--dataset-name sharegpt \
--dataset-path /data/models/ShareGPT_V3_unfiltered_cleaned_split.json \
--random-input-len 1024 \
--num-prompts 1024 \
--request-rate 16
|
4. 测试结果
times | Dataset | output tokens/s | P99 TTFT (ms) | P99 TPOT (ms) | Prefix Cache Hit Rate (%) |
---|
首次 | random | 1231.18 | 67871.93 | 184.86 | 0.0% |
再次 | random | 1231.02 | 67959.66 | 184.98 | 0.0% |
首次 | sharegpt | 3944.07 | 6913.27 | 82.97 | 0.0% |
再次 | sharegpt | 3943.87 | 6894.12 | 83.36 | 0.0% |
times | Dataset | output tokens/s | P99 TTFT (ms) | P99 TPOT (ms) | Prefix Cache Hit Rate (%) |
---|
首次 | random | 1301.77 | 62692.04 | 185.77 | 0.2% |
再次 | random | 1303.69 | 62540.28 | 147.23 | 0.2% |
首次 | sharegpt | 2732.45 | 150.80 | 49.57 | 0.8% |
再次 | sharegpt | 2796.31 | 151.71 | 89.36 | 4.9% |
这是在 5090 上测试的结果,虽然显存高达 32GB,但是在启动之后所剩无几,推理框架还需优化,缓存命中率并不是很高。而之前在另外一块 48GB 的卡上测试时,缓存命中率和吞吐都好很多。