当前位置: 首页 > news >正文

vLLM 的“投机取巧”:Speculative Decoding 如何加速大语言模型推理

什么是 Speculative Decoding?

简单来说,Speculative Decoding 就是让“小模型先猜,大模型来验证”

传统语言模型是一个 token 一个 token 地生成,这种逐步采样方式在大模型上非常慢。而投机采样的流程如下:

  1. 草稿模型(Draft Model):使用一个小模型快速生成一批“候选 token”。

  2. 主模型(Target Model):用大模型并行验证这些 token,检查是否匹配其预测。

  3. 对齐则接受,错了则回退:如果草稿部分预测正确,就省去大模型逐个生成的时间。

这一策略显著减少了大模型的推理步骤,大幅提升了吞吐量和响应速度。

为什么能加速?

因为大语言模型最耗时的部分就是每一步 token 的推理和上下文缓存管理。而投机采样允许多个 token 批量处理,减少了 GPU kernel 启动、KV Cache 写入等重复操作。

根据 OpenAI 和其他团队的测试,Speculative Decoding 可带来 1.5x ~ 2.5x 的加速效果,在某些配置下甚至更多。

vLLM 中的 Speculative Decoding 是如何实现的?

vLLM 从 v0.3 开始支持 Speculative Decoding,并且通过一个简单的命令行参数就可以启用它。

启动示例

假设你希望用一个 13B 的大模型推理,同时用 7B 的小模型作为草稿模型,命令如下:

python3 -m vllm.entrypoints.openai.api_server \--model meta-llama/Llama-2-13b-chat-hf \--speculative_model mistralai/Mistral-7B-Instruct-v0.2

只需加一个参数 --speculative_model,vLLM 就会自动启用投机采样机制。

请求示例:OpenAI 兼容 API

vLLM 提供 OpenAI API 接口,我们可以用标准的 openai 库直接请求:

import openaiopenai.api_key = "EMPTY"
openai.api_base = "http://localhost:8000/v1"response = openai.ChatCompletion.create(model="meta-llama/Llama-2-13b-chat-hf",messages=[{"role": "user", "content": "用通俗语言解释 speculative decoding 是什么?"}]
)print(response.choices[0].message["content"])

你无需在请求中设置任何特殊参数,vLLM 会自动使用 Speculative Decoding,只要你在服务端配置了草稿模型。

注意事项

项目要求
草稿模型和主模型需 tokenizer 兼容最好是相似架构(如 LLaMA 系列)
草稿模型必须小于主模型否则没有加速效果,可能更慢
FlashAttention + Speculative 一起使用更快vLLM 默认启用 FlashAttention
当前仅支持推理,不适用于训练Speculative decoding 是一种推理时优化策略

总结

Speculative Decoding 是 vLLM 中的一项“投机取巧”的优化技术,让小模型打前站,大模型精准确认,从而实现大幅推理提速。

如果你正在部署 LLM 推理服务,尤其是在 GPU 资源紧张或延迟要求高的场景中,Speculative Decoding 将是你值得尝试的一项加速利器。

延伸阅读

  • vLLM GitHub: https://github.com/vllm-project/vllm

  • FlashAttention: https://github.com/Dao-AILab/flash-attention

  • OpenAI 原始论文:Speculative Decoding for LLMs

http://www.lryc.cn/news/601284.html

相关文章:

  • 重生之我在暑假学习微服务第二天《MybatisPlus-下篇》
  • 【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
  • 人工智能——图像梯度处理、边缘检测、绘制图像轮廓、凸包特征检测
  • 设计模式(十三)结构型:代理模式详解
  • springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现
  • 设计模式(十一)结构型:外观模式详解
  • Qt 窗口 工具栏QToolBar、状态栏StatusBar
  • IDEA安装Key Promoter X插件记录快捷键使用频率提高生产率
  • 【笔记】活度系数推导
  • 07.4-使用 use 关键字引入路径
  • 一、搭建springCloudAlibaba2021.1版本分布式微服务-父工程搭建
  • Kafka——消费者组消费进度监控都怎么实现?
  • SparkSQL — get_json_object函数详解(解析 json)
  • Vue 四个map的使用方法
  • Java面试实战:企业级性能优化与JVM调优全解析
  • mac neo4j install verifcation
  • 1.qt历史版本安装与多版本开发(解决被拦截问题)
  • 前缀和-560.和为k的子数组-力扣(LeetCode)
  • Qt C++ GUI 函数参数速查手册:基础与布局
  • HDFS基础命令
  • Python 列表推导式与生成器表达式
  • 3-基于FZ3B的Vitis AI DPU加速平台搭建
  • Vscode的常用快捷键(摆脱鼠标计划)
  • CodeBLEU:面向代码合成的多维度自动评估指标——原理、演进与开源实践
  • Jmeter的元件使用介绍:(七)后置处理器详解
  • 【NLP实践】一、中文短句情感二分类实现并提供RestfulApi服务调用
  • Mitk教程案例项目编译
  • Java AI面试实战:Spring AI与RAG技术落地
  • 【Qt开发】信号与槽(二)-> 信号和槽的使用
  • LeetCode第349题_两个数组的交集