大模型推理框架vLLM 中的Prompt缓存实现原理

『AI先锋杯·14天征文挑战第4期』 10w+人浏览 52人参与

背景:为什么需要Prompt缓存模块?

在大模型问答多轮对话应用场景中,不同请求的 Prompt 往往有相同的前缀,比如:

第一次问答:

你是一名专业的电子产品客服,负责回答客户关于手机产品的咨询。请根据以下问题提供准确、友好的回答。
当前产品库支持查询的品牌包括:Apple、华为、小米、三星。

用户问题:
iPhone 16 的电池容量是多少?
模型回答:
iPhone 16 的电池容量为 3227 mAh。

第二次问答:

(保留之前所有上下文)
你是一名专业的电子产品客服...(同上)

用户问题:
iPhone 16 的电池容量是多少?
模型回答:
iPhone 16 的电池容量为 3227 mAh.

用户新问题:
那它的快充功率呢?
模型回答:
iPhone 16 支持 20W 快充。

两轮问答请求中,系统预设的客服角色描述、产品库范围等前缀内容完全一致,这就会导致模型推理流程:

  • 每次都从头计算整个 Prompt 的 attention

  • 重复计算前缀浪费算力

Prefix Cache 通过缓存这个已计算好的 Prompt 编码结果(KV 对)直接复用,前面的结果会存储在GPU缓存中,生成时只算后半部分。

这里说的Prompt缓存实际是vLLM中Prefix Cache的实现

vLLM 的 Prefix Cache 原理

vLLM 中的 Prefix Cache 是基于 KV Cache 的静态共享机制,主要思路:

  1. 前缀哈希(Prefix Hashing)

    • 将 Prompt 转成 token 序列后计算哈希值

    • 相同 token 序列的哈希值相同

    • 哈希值作为缓存 key

  2. 存储 KV 对(Key/Value Tensors)

    • KV 对是 attention 层计算后的结果

    • 存在 GPU 显存中(或部分放在 CPU 内存)

  3. 复用机制(Reuse)

    • 当新的请求到来时,如果前缀哈希匹配,就直接加载已有的 KV 对

    • 只需对新增的 token 做计算

  4. 分页管理(PagedAttention 兼容)

    • Prefix Cache 依旧用 page(block)方式管理

    • 可与普通 KV Cache 混用,不影响批处理

工作流程:

以一次批处理请求为例:

Prefill 阶段

  1. Tokenizer 将输入文本转成 token 序列

  2. 对序列做哈希(如 MurmurHash)

  3. 检查哈希表:

    • 命中:直接取 KV 对 → 进入生成阶段

    • 未命中:计算 KV 对并存入哈希表

Decode 阶段

  • 使用已缓存的 KV 对作为上下文

  • 新 token 持续追加到 KV Cache

这样的好处是可以减少重复计算:多个请求共享相同前缀的计算结果,同时加速批处理:常见系统提示(system prompt)复用率很高

### 树莓派5上的大模型推理方法与性能优化 #### 方法介绍 树莓派5因其硬件性能的显著提升,可以成为运行复杂计算任务的理想平台之一。然而,在资源受限的情况下执行大模型推理仍需特别注意效率和适配性。以下是几种可行的方法: 1. **选择合适的轻量级模型** 对于树莓派这样的边缘设备,推荐使用经过蒸馏或剪枝的小型化版本预训练模型,例如 `DistilGPT`、`TinyBERT` 和 `Flan-T5 Base` 等[^3]。这些模型不仅参数数量较少,而且在保持较高精度的同时降低了内存占用和计算需求。 2. **利用高效的推理框架** 高效的推理框架对于加速模型运算至关重要。可以选择如 TensorRT-LLM 或 vLLM 这样的高性能推理引擎来部署大型语言模型或其他类型的深度学习模型[^2]。此外,《嵌入式》文章提到过 NCNN 是一种专为移动终端设计的支持多源输入(TensorFlow, PyTorch, ONNX)并针对 ARM CPU 做了高度优化的库[^4],它同样适用于基于 YOLOv5 的目标检测场景。 3. **实施量化技术** 权重量化是一种有效减少存储空间消耗以及加快前向传播速度的技术手段。通过将浮点数转换成整数形式表示权重值,可以在一定程度上缓解因算力不足而导致的速度瓶颈问题。 #### 性能优化策略 为了进一步提高树莓派5上的推理表现,可以从以下几个方面着手改进: 1. **调整批大小 (Batch Size)** 调试不同的批量尺寸可能会发现某个特定数值能够在吞吐率最大化前提下维持较低延迟水平。这取决于具体应用案例的实际需求——如果追求实时响应,则应优先考虑单样本预测;而当面对高并发请求流时,则可能倾向于更大的批次规模以摊销固定开销部分的成本。 2. **启用异步执行模式** 当采用某些支持异步 API 的服务端架构(像 NVIDIA Triton Inference Server),允许客户端提交多个独立作业而不必等待先前的结果返回之前即继续发送新指令序列,从而充分利用底层硬件资源完成更多工作负载。 3. **缓存机制引入** 若存在重复查询可能性较高的数据集或者子任务片段,建立适当级别的中间结果保存池有助于避免不必要的重新计算过程,进而节约宝贵的时间成本。 ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM # 加载小型化的 GPT 模型实例 tokenizer = AutoTokenizer.from_pretrained("distilgpt2") # 使用 distilgpt2 替代完整版 gpt2 model = AutoModelForCausalLM.from_pretrained("distilgpt2") def generate_text(prompt): inputs = tokenizer.encode(prompt, return_tensors="pt").to('cpu') # 移动到 cpu 上运行 outputs = model.generate(inputs, max_length=50) text = tokenizer.decode(outputs[0], skip_special_tokens=True) return text ``` 上述代码展示了如何加载一个较小的语言生成模型并在 CPU 设备上对其进行调用操作的例子。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安逸的程序猿

意思不意思那是你的意思我没意思

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值