bert4keras icon indicating copy to clipboard operation
bert4keras copied to clipboard

bert4keras的attention_cache是否有传入方式的demo

Open hanggun opened this issue 2 years ago • 3 comments

提问时请尽可能提供如下信息:

基本信息

  • 你使用的操作系统: windows
  • 你使用的Python版本: 3.7
  • 你使用的Tensorflow版本:1.15.5
  • 你使用的Keras版本: 2.3.1
  • 你使用的bert4keras版本:0.11.3
  • 你使用纯keras还是tf.keras:keras
  • 你加载的预训练模型:chinese_wwm_L-12_H-768_A-12

苏神您好,请问Transformer中看到您有在build中实现attention_cache参数的传入,请问该是要传入所有MHA层的名字么,例如bert-base需要传入12层MHA,[K缓存,V缓存]应该怎么传入,请问有简单实现的demo么,在unilm的模型上可以实现么

update

苏神,仔细阅读了代码后,发现K_cache和V_cache在bert4keras中是与inputs[1]和inputs[2]进行结合后输入到multihead attention,并且在multihead attention中也没有对cache机制进行特别的处理,想问一下attention cache在bert4keras中的作用是什么,在您的博客中也没有搜到相关的记录

hanggun avatar Jul 13 '22 08:07 hanggun

仔细思考之后,我发现Unilm是不能用attention cache的方式进行加速的,对于Encoder Decoder模型来说,K和V是由Encoder获得的,因为输入不变,所以 K和V在每次运算中都是固定的,只有Q在每次增加pred y的时候会改变,因此可以固定K和V,减少计算量,但是对于Unilm来说,由于采用的是单一Encoder,self-attention结构,每次输入的是X+y的拼接,因此,Q,K,V都在改变,无法固定Q和K来进行加速计算,但是在这个问题中https://github.com/bojone/bert4keras/issues/298,苏神说可以引入cache机制加速beam search的推理,那这里的cache机制应该加在哪里呢?从我的理解来看,cache机制只能加在seq2seq结构中,不知道有没有错

hanggun avatar Jul 14 '22 09:07 hanggun

unilm也不是完全不行、只不过seq2seq的decoder self attention由于三角mask可以缓存softmax后的结果、unilm的话应该至少可以缓存qkv的投影,少做几次乘法运算 推销一篇我的blog看看

i4never avatar Sep 01 '22 11:09 i4never

可以参考我这篇,完全基于bert4keras 实现的attention cache: faster-decoder

xv44586 avatar Sep 16 '22 00:09 xv44586