赞
踩
vLLM是伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM是一个快速且易于使用的库,用于 LLM 推理和服务,可以和HuggingFace 无缝集成。vLLM利用了全新的注意力算法「PagedAttention」,有效地管理注意力键和值。
vLLM 的特点和优势:
vLLM 整体框架:
其中的关键技术点包括:
LLM 是对 LLM serving 部分的封装,也是核心部分。首先它会初始化这个类。初始化过程中大部分参数都会被用来构造 EngineArgs,这是一个 dataclass,封装了 Engine 的初始化参数。然后构建 LLM Engine。一个 LLM 只有一个 LLM Engine,所以它就是对 Engine 再包一层。不过按照作者的这个设计意思,LLM Engine 也可以单提出来使用。
初始化 LLM Engine 时候会先调用 create_engine_configs 将 EngineArgs 分解成 ModelConfig,CacheConfig, ParallelConfig 和 SchedulerConfig。其中:
然后对于每个 device(也即每张卡 / 每个 rank)创建一个 Worker。Worker 是运行 model 的单位。一个 Engine 管理所有的 workers。同时给这个 engine 创建它的 scheduler,以及初始化这个 engine 的 KV cache。
Worker 是对单个 GPU 的抽象。
Engine 通过调用 _run_workers(“<method_name>”, *args, get_all_outputs, **kwargs) 来在 所有 workers 上执行方法。如果 get_all_outputs 设成 True,那么它会将所有 workers 的返回结果包装成 List 来返回。否则,它只会返回第一个 worker 的结果,并且 assert 所有 workers 的输出都是一样的。在实际执行中主要会调用如下方法(方法名, get_all_outputs=False/True):
Worker 初始化阶段会初始化模型和一些 distributed 相关的东西。
用于管理 KV Cache 的单元。
初始化时候,它先根据之前 profile 的数据(cpu/gpu blocks数)来 allocate cache。然后再给 caching 操作初始化一个 CUDA Stream,以及给每一个 layer 初始化一个 cuda event 来用做 stream synchronization。
在 vLLM 里,每个 key block 的 shape 是 [num_heads, head_size // x, block_size, x],其中 x 是 16 // dtype 的大小。也就是说 fp32 时 x=4,fp16 时 x=8。每个 value block 的 shape 是 [num_heads, head_size, block_size]。
在分配 cpu cache 时候,默认是会用 pin memory 的(除非在 WSL)。
cache engine 里支持了其它两个操作:
相关的 cu 函数,实现在 csrc/cache_kernels.cu 中:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。