vllm 你能支持Attention Sink吗?

ou6hu8tu  于 2个月前  发布在  其他
关注(0)|答案(9)|浏览(69)

高效流式语言模型与注意力汇聚器
这个仓库已经实现了它:
paper
attention_sinks
streaming-llm

w3nuxt5m

w3nuxt5m1#

我认为attention_sinks项目是一种非常有前途的技术,可以用于提高模型在长序列上的推理能力,而无需使用alibi等方法进行训练。

6za6bjd0

6za6bjd02#

Ya,有效地去除了max_new_tokens,因此生成可以继续进行,直到模型预测到EOS标记,而不是仅仅因为输入的令牌计数过大而截断。

aelbi1ox

aelbi1ox3#

你好@WoosukKwon和@zhuohan123,
我将要处理这个功能,并想询问关于注入注意力汇聚逻辑的问题。我们需要能够指定它并设置注意力汇聚令牌的数量。
LLM的API允许传递*kwargs https://github.com/vllm-project/vllm/blob/main/vllm/entrypoints/llm.py#L74 额外的配置,并在以后使用此配置支持的每个模型中。从你的Angular 来看,这是否可以接受?

dgtucam1

dgtucam14#

请注意,https://github.com/tomaarsen/attention_sinks有一个第三方版本,非常干净,并且在比原始论文的github上更广泛的模型集合上运行。这就是h2oGPT使用的。仅供参考。

nkkqxpd9

nkkqxpd95#

Hi @WoosukKwon 和 @zhuohan123,
在开始我的更改之前,我想与您讨论一下关于Attention Sink的缓存块设计。
从某种程度上说,它与Mistral's circular buffer对于无尽的修剪相似。但是我们有一个显著的不同之处——Attention Sink保留了尾部的4个令牌(左侧),并且我们根本不想移动KV缓存数据。
因此,Mistral执行以下操作(假设我们只有4个块(每个块4个令牌)和点时间t_i仅表示为i以简洁起见),以及x——空槽位。
| Blocks -> | Block 0 | Block 1 | Block 2 | Block 3 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| Initial state | 0, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, x |
| Added token 15 | 0, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, 15 |
| Added token 16 | 16, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, 15 |
| Added token 17 | 16, 17, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, 15 |
注意力可以通过旋转块计算出来,即:

    16, **17**, **2**, **3** |
    4, 5, 6, 7 |
    8, 9, 10, 11 |
    12, 13, 14, **15** |
    16, **17**

这样我们就可以像初始实现那样在连续的元素上计算注意力。请确认以上内容是否正确。
Attention Sink保留了一些“尾部”令牌,根据来自#1304(评论)的图片。所以它应该是(假设我们只使用2个注意力sink令牌)
| Blocks -> | Block 0 | Block 1 | Block 2 | Block 3 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| Initial state | 0, 1, 2, 3 | 4, 5, 6, 7 | 8, 9, 10, 11 | 12, 13, 14, x |
| Added token

fafcakar

fafcakar6#

嘿,@sh1ng,我在想你是否已经开始实施注意力汇聚功能了。如果你已经开始实施了,是否有可能开启一个PR?我对这个功能很感兴趣,想要贡献一份力量。

pdtvr36n

pdtvr36n7#

我倾向于使用第三种方法,并进行一些额外的修改:

  • 分配包含 \n *4 偏移量的 BlockSize 系统块。
  • 在启动时对这些块进行预填充。
  • 如果需要,将系统块和第一个块连接起来,以便始终将注意力焦点保持在正确的位置,同时尽量减少对现有代码库和内存移动的修改。
块 ->块 0块 1块 2块 3旋转的块链注解
初始状态0, 1, 2, 34, 5, 6, 78, 9, 10, 1112, 13, 14, xNA, NA, \n(1st), \n(2nd), 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14在 [NA, NA, \n(1st), \n(2nd) ] 前添加
添加了 token 150, 1, 2, 34, 5, 6, 78, 9, 10, 1112, 13, 14, 15\n(2nd), NA, NA, \n(1st), \n(2nd), 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15在 [(2nd), NA, NA, \n(1st)]前添加并融合 [\n(2nd), NA, NA, \n(1st)]
添加了 token 1616, 1, 2, 34, 5, 6, 78, 9, 10, 1112, 13, 14, 15NA, NA, \n(1st), \n(2nd), 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1415在 [(1st), \n(2nd), NA]前添加并融合 [NA]
在 token
xlpyo6sf

xlpyo6sf8#

我倾向于使用第3种方法,并进行一些额外的修改:

  • 为包含 \n *4 的所有可能旋转分配 BlockSize 系统块。
  • 在启动时对这些块进行预填充。
  • 如果需要,将系统块和第一个块连接起来,以便始终将注意力吸引器保持在正确的位置,同时尽量减少对现有代码库和内存移动的修改。

块 ->
块 0
块 1
块 2
块 3
旋转链中的块
注解
初始状态
0, 1, 2, 3
4, 5, 6, 7
8, 9, 10, 11
12, 13, 14, x
NA, NA,
(1st),
(2nd), 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
prepend [NA, NA,
(1st),
(2nd) ]
添加了标记 15
0, 1, 2, 3
4, 5, 6, 7
8, 9, 10, 11
12, 13, 14, 15

(2nd), NA, NA,
(1st),
(2nd), 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
prepend 并融合 [
(2nd), NA, NA,
(1st)]
添加了标记 16

16, 1, 2, 3

4, 5, 6, 7
8, 9, 10, 11
12, 13, 14, 15
NA, NA,
(1st),
(2nd), 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1415
prepend 并融合 [
(1st),
(2nd), NA

dfuffjeb

dfuffjeb9#

我认为注意力沉降器大致相当于softmax1,如此处所述:https://www.evanmiller.org/attention-is-off-by-one.html。不确定在推理时是否可以在不重新训练模型的情况下应用softmax1。

相关问题