大模型推理加速:KVCache和Pageattendtion
首先声明不搞infra的不用看,我现在看底层了,
本篇内容基于Efficient Memory Management for Large Language Model Serving with PagedAttention》 (SOSP 2023)出处: 加州大学伯克利分校(UC Berkeley)
这篇里面讲了vllm,那么我们就先讲vllm。
LLM 模型在推理阶段的显存有三部份组成:模型权重、KVCache 显存占用以及激活值显存占用。
而今天我们是速成教程,所以又要体现深度,那么就先讲KVCache,
这个本质上是一种通用的思路就是减少k,v的计算,采用缓存的机制去减少中间值,
而这个的问题是kv的乘积是会有上限的,因为本来就很大,HBM根本放不下,所以vllm提出思路去优化这个东西,去搞定显存碎片。
同样的在HBM里面存储基本上都是连续存储的,也就是说少了一个,少了10个都是少了。
而现在搞成分页存储,不会出现空缺的。
当全部的空闲HBM被塞满,
这里暂时讲Swapping:
当多余的KV Cache会被提到cpu内存里面。
然后这个是怎么实现的?
基本上逻辑是:
第一步:
当新请求, Block Table分配空闲块的编号。
第二步:
定位物理地址: 物理地址 = 物理块ID * 块大小 + (35 % 16) * 每个Token的特征维度。
第三步:
在计算的时候,动态地把这些散乱的地址传给 GPU/NPU。
当同时请求时候就采取写时复制。
当大量人同时询问同一个问题时候,此时采取多序列共享机制,也就是哈希映射:
这么解释呢?就是说记录物理块的地址位置,然后新的相似的token进来,这个block table直接指过去就行。这样就不会出现kv cache无限复制的问题了。
然后同时访问,这个时候hash冲突了,也就是网络请求太多,
那么就LRU,先把最少访问的释放同时触发swapping吧没用的丢出cpu了。
现在最新的技术也就是vllm的发展思路:
1:速度推理加速:投机采样
可以用小模型先给几个词然后大模型验证,这样减少完整跑的神经网络和逻辑。
2:延迟优化减少:切块预处理
太长的token进来,就直接切块然后混在输出里面。
3:解码:多卡
等于一张卡负责算kv cache,一张卡负责decode,甚至一张卡搞promot。
最后总结一下:
Vllm启动后:
Scheduler: 负责控制哪些请求该进 Batch,哪些该排队。
Block Manager(块管理器): Block Table 所在地,负责划拨 HBM 显存块。
Worker: 负责在 NPU/GPU 上跑矩阵运算的。
一般是先跑算子这个跑通才能调内存,最后开始调策略。
#硬件/芯片公司工作体验#
放一些相关的,这里算是大模型的进阶版了。这个封面是吉米。