跳到主要内容

解码器结构与因果掩码

自回归解码基础见本章;投机解码、Assistant Decoding 等属推理加速技巧。

解码加速​

Flash Decoding​

参考文章​

https://pytorch.org/blog/flash-decoding/

原理介绍​

Flash Attention 主要解决的是什么问题​

在训练过程中,Flash Attention 主要针对于 BatchSize 和 query-length 两个维度进行优化。​

可是在生成解码的过程中,query-length 始终为 1 ***所以当 batch-size=1 时,gpu 的利用率还不足 1%

TensorRT-LLM 框架​

padded & packed​

模型的输入其实是包含:padded 和 packed​

用一个 1D tensor 来代表每个输入的长度​

目前paddle 这边的动态插入,从输入层面来看是 padded,可是内部实现的还是 packed​

pad 到输入长度的最大长度其实很浪费机器资源。​

kv-cache​

contiguous kv-cache​

  • 将显存初始化成一整块

paged kv-cache​

  • 将 cache-kv 拆分成不同的 block,从而更加细粒度的控制显存

int8/fp8 kv-cache​

sliding window attention​

  • attention-sink
  • 传统的 sliding window

解码与采样策略​

min-p​

基础信息介绍​

参考链接:https://mp.weixin.qq.com/s/ILwPmtLGSGDlKH6KbdTSaw​

其他方法缺点介绍​

top-k​

  • 前面 token 概率很大,可是后面 token 并不大

top-p​

  • 会包含太多的长尾数据,这个会影响采样的效果

assistant decoding​

参考文章​

https://huggingface.co/blog/assisted-generation

原理介绍​

1. 会有一个大模型和小模型,小模型用于生成候选列表(连续的几个 tokens),大模型用来做评估选择。同时 tokenizer 一般是使用一样的​

整体流程描述: 小模型 tokens -> candidate_ids -> 大模型 forward -> ids -> n_match(candidate_ids, ids) -> ids[: n_match]​

speculative decoding​

介绍​

用 draft 模型来生成 n-token,然后将其与模型生成的 token 来做对比,如果是正确的,就采纳其中的 k-token。​

此方法相当于 sampling。​

整体上属于:guess-and-verify 模式​

  • 先让小模型来猜,然后让大模型来验证是否正确

时间复杂度​

时间复杂度

  • t_draft * K : 是小模型一个 epoch 的时间复杂度
  • N 是整体解码长度, K 是一次性解码的候选 token 长度
  • r: 平均接受文本的长度

加速比​

加速比

缺点​

解码速度受限于 token 接受率:draft 模型的输出和 large 模型的输出匹配率​

draft 模型通常是需要额外训练,并且“careful tuning”​

步骤​

1. 小模型通过自回归解码出 k 个 token​

2. 将这 k 个 token 塞到大模型当中获取其 logit 分布,这样能够得到最终的 next-tokens​

  • 能够得到小模型和大模型在这 k 个 token 上面的解码结果

3. 通过对比小模型和大模型产生出来的 logits,从而决定到底保留多少 token​

  • 如何从 logits 中选择对应的 next-tokens 是有对应的策略的,也就是这其中不一定就是 greedy_search

4. 其中还可以保留 0 < N <= K 个 token,如果所有的 token 都被保留了,还可以额外再接受一个 来自于大模型解码出来的next-token​

注意​

这个方法的解码并不是 greedy_search,也可以和 top_k 、top_p 和 temperature 联合使用​

参考链接​

Fast Inference from Transformers via Speculative Decoding https://arxiv.org/abs/2211.17192​

https://jaykmody.com/blog/speculative-sampling/

lookahead decoding​

方法​

用 n-gram 来猜测接下来的数据​

  • n-gram 自己来构造
  • 可以从某些数据集上面来构造也行

用当前预测的 token 来在库里面查找,如果存在的话就看看下一个词是否一致​

缺点:也是 greedy_search 的一种​

参考链接​

https://lmsys.org/blog/2023-11-21-lookahead-decoding

min-p​

基本介绍​

最大token 概率 * p,此时通过最大值来限定考虑范围​

单纯用 top-k: 前面 token 概率很大,可是后面 token 并不大​

单纯用 top-p:会包含太多的长尾数据,这个会影响采样的效果​

其实 top-k 和 top-p 结合起来使用的话,效果和 min-p 差不多​

参考资料​

放弃top p/k、温度采样,全面拥抱min p

受限生成​

参考资料​

[TODO]Guiding LLMs The Right Way: Fast, Non-Invasive Constrained Generation