一、简介
1、加速的目的
自回归算法的序列化生成特点,导致解码算法效率低,加速即提升解码效率
二、解码效率分析
1、解码过程
- 全量解码:对于输入序列,一次性的计算其状态并缓存键值矩阵
- 增量解码:只计算上一步新生成词元的状态,并不断的以自回归的方式生成新词元并对应更新键值缓存,直到生成结束
2、解码效率衡量指标
- 相关概念
- 运算量:浮点运算性能
- 访存量:显存带宽
- 计算强度:运算量/访存量
- 运算量、访存量、计算强度数据估计:模型的每个部分(自注意力部分、前馈网络部分、其他部分)根据相关的公式计算出数据
3、内存墙
解码过程受限于GPU显存读写速度
三、系统级优化【优化显存占用、提升计算效率】
1、核心点
通过减少相关操作的访存量,来实现优化
2、FlashAttention
- 原理:尽量减少对中间状态的保存,通过矩阵分块和算子融合等方法,将中间结果一直保留在缓存中,直至获取最终结果后再加载到显存中,从而减少了显存读写量
- 实际效果,不仅减少了访存量,还较少了峰值显存占用量
3、PagedAttention
- 原理:引入了操作系统中显存分页管理的方法,预先将显存划分成若干块给之后的键值缓存“预留空间”,从而显著减少了拼接时反复分配显存的操作;此外,PagedAttention还优化了注意力计算操作,提高了计算的并行度从而减少其访问量
4、批次管理优化
- 原理:批次管理优化旨在通过增加计算中的批次大小来提高计算强度。在实现中,连续批处理技术会通过启发式算法来选择部分请求进行全量解码操作,或者选择一些请求进行单步增量解码操作。通过这样细粒度的拆分,连续批处理技术可以在同一时间内容纳更多的请求,从而提高了计算强度
- 动态分割:将全量解码操作进一步拆分为多个子操作,其可以在一次计算中选择一些请求同时进行全量解码和增量解码操作,进而获得更大的批次和更高的解码吞吐量
- 优势:通过批次管理优化技术,线上的大模型服务可以处理更多请求,更高效
四、解码策略优化【优化自回归解码策略】
1、优化方式
- 推测解码
- 非自回归解码
- 早退机制
- 级联解码
2、推测解码
- 原理:使用相对较小但解码更高效的小模型自回归的生成若干个词元,然后再由大模型对这个片段进行验证(大模型一次验证与一次解码时间相当),来判断是否每个词元都是当前步骤概率最高的输出,随后大小模型持续迭代此过程直到结束。
- 特点:推测解码不会降低大模型的解码质量,大约能带来两倍的解码提速,是目前使用较多的解码优化策略
3、级联解码
- 原理:与推测解码类似,进一步区分了请求的难易程度,并分别使用不同规模的模型来处理请求
4、非自回归解码
- 原理:现有的自回归是一个词元一个词元的生成,由此导致效率较低,非自回归解码可以基于一次输入并行的一次生成所有词元
- 特点:生成质量较差
- 半自回归解码:解决非自回归解码质量差的问题,每次生成一组词元,质量仍然较差,可以用于推测解码中候选片段生成
5、早退机制
- 原理:在模型解码过程中,设置相应的早退条件,当早退条件满足时结束网络层的前向传递,直接生成相关的词元,从而提升解码效率
- 混合深度:对于每一层的输入通过路由网络得分,如果该得分高于预先设定的阈值则进行该层的后续计算,否则跳过该层计算。与全部跳过的机制相比,混合深度是有选择的跳过,可以更好的利用模型不同层的特性
五、常用与大模型解码的开源代码库介绍
- llama.cpp:跨平台能力好,支持多种量化精度,从1.5比特到8比特不等,均能显著降低显存消耗
- vLLM:支持多种解码策略,比如PagedAttention、批次管理优化等
- DeepSpeed-MII:支持多种解码策略,批次管理优化、张量并行,并将全量解码与增量解码有机融合
- FlexFlow:优化了推测解码算法,设计了树形注意力机制,提升了计算并行度