vllm
vllm特点
- 最先进的服务吞吐量
- 有效管理的注意力机制的K-V记忆与PagedAttention
- 连续批处理传入请求
- 快速模型执行与CUDA/HIP图形
- 量化:GPTQ、AWQ、INT4、INT8和FP8。
- 优化CUDA内核,包括集成FlashAttention和FlashInfer。
- 投机解码
处理主要问题
-
llm随着生成token的增多,kv-cache长度也变大,对gpu显存造成压力
-
llm生成的token长度无法预知,因此不能提前预知kv-cache所需的存储空间,给推理工作造成很大不确定性
PagedAttention
KV Cache的核心思想是缓存并重用之前计算过的Key和Value,从而避免重复计算
注意力机制的核心概念是Query(查询)、Key(键)和Value(值) 。在生成新 token 时,其需要新的"问题"(Query)来查询所有历史"信息"(Key)并获取相关的"内容"(Value)。注意力机制允许模型动态地"查阅"之前的信息。不同的信息源(早先的词)会根据其相关性获得不同程度的"注意力"。最终的表示是多个信息源的加权组合。
PagedAttention:被称为vllm管理kv-cache的技术,原理类似于虚拟内存分页管理技术。将需要用到的KV Cache拆分成多个Block进行存储,每个Block内有多个KV,不管Batch内每个请求的输入输出序列多长,都可以按需申请Block存储,不过申请太多多余的空间。
关键特点:
- 非连续内存访问和查询机制
- 动态内存管理和生成过程
- 内存共享
其他优化技术
-
连续批处理:传入的请求被连续批处理在一起,以最大限度地提高硬件利用率并减少计算浪费,最大限度地减少空闲时间。
-
量化:vLLM 利用 FP16 等量化技术,通过以较低的精度表示 KV 缓存来优化内存使用,从而减少内存占用并加快计算速度。
-
优化的 CUDA 内核:vLLM 手动调整在 GPU 上执行的代码以实现最佳性能。例如,对于融合重塑和块写入,开发了优化的内核,将新的 KV 缓存拆分为块,重塑它们以实现高效的内存访问,并根据块表保存它们,所有这些都融合到单个内核中以减少开销。
代码理解
vllm是在llm基础上对于方法复写,其入口为vllm/entrypoints/llm.py。该文件运行流程主要为通过__init__()
f方法对于代码初始化,之后运行数据预处理方法validate_and_add_requests(),实际推理run_engine()方法。
通过LLMEngine产生对象llm_engine以执行llm中的方法,执行vllm/engine/llm_engine.py中的step()方法逐步处理请求。