Please enable Javascript to view the contents

什么是 Prefix Cache

 ·  ☕ 2 分钟

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 推理服务

  • 禁用 prefix cache
 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
  • 启用 prefix cache
 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
  • 使用 ShareGPT 数据集
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. 测试结果

  • 禁用 prefix cache
timesDatasetoutput tokens/sP99 TTFT (ms)P99 TPOT (ms)Prefix Cache Hit Rate (%)
首次random1231.1867871.93184.860.0%
再次random1231.0267959.66184.980.0%
首次sharegpt3944.076913.2782.970.0%
再次sharegpt3943.876894.1283.360.0%
  • 启用 prefix cache
timesDatasetoutput tokens/sP99 TTFT (ms)P99 TPOT (ms)Prefix Cache Hit Rate (%)
首次random1301.7762692.04185.770.2%
再次random1303.6962540.28147.230.2%
首次sharegpt2732.45150.8049.570.8%
再次sharegpt2796.31151.7189.364.9%

这是在 5090 上测试的结果,虽然显存高达 32GB,但是在启动之后所剩无几,推理框架还需优化,缓存命中率并不是很高。而之前在另外一块 48GB 的卡上测试时,缓存命中率和吞吐都好很多。


微信公众号
作者
微信公众号