thunlp / InfLLM

The code of our paper "InfLLM: Unveiling the Intrinsic Capacity of LLMs for Understanding Extremely Long Sequences with Training-Free Memory"

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

代码实现的疑问

xjwhy opened this issue · comments

作者你好,在看代码过程中有一些问题:
1、global_q为什么都增加了local的位置编码
2、global_k、global_v用来计算global score的分数大致原理是?

借楼,目前也是在看代码的实现,有几个问题顺便请教一下:

  1. infLLM 会保留全部 kv cache(offload 到 cpu 内存),对于超长prompt的处理,是边处理promot,边卸载到CPU上?
  2. 关于 topk memory units 的选择,通过计算attention score选择其中最大的top k, 这个计算的过程是在GPU上进行的吗?以及是否是在伴随着将 propmt 中超长的部分卸载到CPU过程中就已经在计算这个topk 了,顺便缓存到GPU上了?还是后续在需要时,从CPU中加载这些memory unit,再进行计算的,选择topk 以及选择代表token?
  3. 对于代表token的选择,是否也是在计算topk个memory unit 时,顺道就在每个 memory unit 中选出来top k?

@xjwhy

1、global_q为什么都增加了local的位置编码

为了让 global q 和 global k 的距离都是 n_local,就相对位置而言,这些 qk 对都处于同一个相对距离。

2、global_k、global_v用来计算global score的分数大致原理是?

如果你指的是 attention 的计算过程的话,local q 和 global q 是同一个 query,只是他们的位置编码不同。
这是为了达到滑动窗口内的相对位置编码保持不变(即 local q 和 local k,他们就是原始 RoPE 的实现),
滑动窗口外全部视作距离当前 token n_local 个单位。
由于 global q 和 local q 代表的都是同一个 query,我们就将 logits 矩阵拼接起来做 softmax(按照 k 维度,即 init_k + global_k + local_k)。
由此实现长度外推。

@ChuanhongLi

  1. infLLM 会保留全部 kv cache(offload 到 cpu 内存),对于超长prompt的处理,是边处理promot,边卸载到CPU上?

对,你可以参考 context_manager 的 append_global 函数

关于 topk memory units 的选择,通过计算attention score选择其中最大的top k, 这个计算的过程是在GPU上进行的吗?以及是否是在伴随着将 propmt 中超长的部分卸载到CPU过程中就已经在计算这个topk 了,顺便缓存到GPU上了?还是后续在需要时,从CPU中加载这些memory unit,再进行计算的,选择topk 以及选择代表token?

topk 计算在 gpu 上进行,topk 计算只和目前的 query 以及代表 token 有关,代表 token 长度为 length / block_size,并不大,所以目前都存储在 gpu 中。计算完 topk 的 memory unit id,再从 cpu 中 load 需要的 memory unit。