Nano-vllm 项目学习

项目地址:https://github.com/GeeeekExplorer/nano-vllm

vllm介绍:https://zhuanlan.zhihu.com/p/693279132

paged attention:https://zhuanlan.zhihu.com/p/691038809

nano vllm: https://zhuanlan.zhihu.com/p/1923689524778766954

  • 请求(request)可理解为操作系统中的一个进程

  • 逻辑内存(logical KV blocks)可理解为操作系统中的虚拟内存,每个block类比于虚拟内存中的一个page。每个block的大小是固定的,在vLLM中默认大小为16,即可装16个token的K/V值

  • 块表(block table)可理解为操作系统中的虚拟内存到物理内存的映射表

  • 物理内存(physical KV blocks)可理解为操作系统中的物理内存,物理块在gpu显存上,每个block类比于虚拟内存中的一个page

    img

    imgvLLM节省KV cache显存的核心思想是,对于相同数据对应的KV cache,能复用则尽量复用;无法复用时,再考虑开辟新的物理空间。

    vLLM对请求的调度处理流程:

    • 当一堆请求来到vLLM服务器上时,按照**First-Come-First-Serve(FCFS)**原则,优先处理那些最早到来的请求。
    • 当gpu资源不足时,为了让先来的请求能尽快做完推理,vLLM会对那些后到来的请求执行“抢占”,即暂时终止它们的执行。
    • 一旦vLLM决定执行抢占操作,它会暂停处理新到来的请求。在此期间,它会将被抢占的请求相关的KV block全部交换(swap)至cpu上。等交换完成后,vLLM才会继续处理新到来的请求。
    • 部分情况下,对于一些seq,vllm会抛弃它的kv cache,将它重新放入等待队列中,后续重新做prefill(recomputation)

img

可以看这个公众号的这篇:

https://mp.weixin.qq.com/s/KxRWSAjw8r_9GkVP-skbZg

46ef4695e6dfa4bff477bdb1cb97e61a