通算重叠#
通信与计算重叠是现代分布式训练和推理环境下常用的优化技巧。在KV Cache卸载过程中,主要的通信是KV Cache的IO。如显存与主机内存之间, 主机内存与存储之间,乃至在支持GDS的环境下显存与存储之间的直接IO。主机内存与显存之间的数据传输(H2D/D2H)可能成为推理瓶颈,特别是在 KV Cache命中需要从存储和内存往显存上传输时, 通算重叠技术隐藏IO延迟,可以显著提升端到端吞吐量。
智能预取#
预取发生在存储到内存传输的环节。当推理引擎接受到一个推理请求时,推理引擎会先将该请求放入到等待队列中,等待下一步调度器的调度结果。此时, CT-HPKV便将该请求的元信息交给KV Cache预取管理器。预取管理器根据显存、内存中的KV Cache信息,以及存储上可以命中的词元数量,判断是否 需要从存储拉取对应的KV Cache数据到内存空间。如果需要,则将KV Cache数据从存储拉取到内存空间,并返回给推理引擎。等到推理引擎侧调度该请 求进行推理时, 按层加载 对应KV Cache数据到显存。
按层加载#
从结构上看,大模型是由多层注意力层+FFN叠加组成。在实际的推理过程中,也是逐层执行。层间的串行性也给IO与计算重叠带来了机会。从CT-HPKV缓存
命中的角度看,如果缓存数据在内存命中,那么模型侧在进行第 i 层计算的同时,可以将第 i+1 层KV Cache数据提前加载。待模型执行到
第 i+1 层的计算时,显式等待同步确保该层的KV Cache加载完成,开始第 i+1 层计算的同时异步提前加载第 i+2 层的KV Cache数
据。 如此一来,既避免了一次性将所有层KV Cache加载到显存的大量数据拷贝,又寻求到了层间的计算与通信重叠机会。
异步写入#
推理Prefill与Decode过程中,KV Cache数据写入是异步的,并且,异步体现在多个方面。 宏观上,KV Cache写入内存与存储的操作不能阻塞推理引擎 层的推理过程,影响推理性能。微观上,KV Cache的卸载也无需等待某个请求的全部推理过程完毕。因为,对于Prefill过程,由于每次调度的词元容量有 限,一个请求的Prefill过程可能会被多次调度;对于Decode过程,自回归过程是串行化且耗时的。因此,我们可以在请求的推理过程中逐步卸载KV Cache, 从而提升推理性能。只要确保该请求的KV Cache数据在卸载完成前,显存中对应的KV Cache数据不要被驱逐即可。