文章预览
作者:王焱(已授权) 原文: https://zhuanlan.zhihu.com/p/3116018350 1 前言 Attention的计算过程中,需要之前的k和v。 但每次计算的时候,把之前的k,v重新计算一次成本太高昂,需要找个地方临时存起来,这就是KV Cache。 llama1的代码就非常简单 self.cache_k = self.cache_k.to(xq) self.cache_v = self.cache_v.to(xq) self.cache_k[:bsz, start_pos : start_pos + seqlen] = xk self.cache_v[:bsz, start_pos : start_pos + seqlen] = xv keys = self.cache_k[:bsz, : start_pos + seqlen] values = self.cache_v[:bsz, : start_pos + seqlen] 把kv的值更新到cache里,然后再从缓存中读取需要的cache。 真实业务场景中,用户对于context的需求是一直变长,但耗时太久,导致用户体验上不去,真实需求变成了不存在的需求。 举例子,当年我们做智能音箱,到后面发现用户都是听首歌,看电影之类的需求。但用户只有这样的需求么?答案是否定
………………………………