如何实现大模型推理加速优化?路径有哪些?

SLAB: Efficient Transformers with Simplified Linear Attention and Progressive Re-parameterized Batch Normalizationhttps://github.com/xinghaochen/SLAB

方法

1、LayerNorm需要在每个样本的特征维度上计算均值和标准差,这可能在特征维度非常大时导致较高的计算开销,且LayerNorm可以稳定训练。BatchNorm使用训练时的统计均值和方差数据直接计算,导致较低的推理延迟,但可能导致训练崩溃和较差的性能。

提出了一种PRepBN的新方法,通过使用超参数lamda来控制两个归一化层的比例,在训练中逐步用重新参数化的BatchNorm替换LayerNorm。

代码实现

https://github.com/xinghaochen/SLAB/blob/main/llama/modeling/llama-350M/modeling_llama.py

2、提出了一个简化的线性注意力(SLA)模块,该模块利用ReLU作为内核函数,并结合了一个深度卷积来执行局部特征增强,简单而有效地实现强大的性能。

改为

DWC(·)表示深度卷积。

https://github.com/xinghaochen/SLAB/blob/main/detection/mmdet_custom/swin_transformer_slab.py

效果评估

吞吐量和精度都有提升。

延迟减少。

推理速度优化:稀疏激活Turbo Sparse

Turbo Sparse: Achieving LLM SOTA Performance with Minimal Activated Parameters

https://huggingface.co/PowerInfer

方法

激活稀疏性可以在不影响性能的情况下显著加速大型语言模型的推理过程。

激活稀疏性是由激活函数决定的,常用的激活函数如SwiGLU和GeGLU表现出有限的稀疏性。简单地用ReLU替换这些函数无法实现足够的稀疏性(将稀疏度从40%增加到70%左右)。

提出了一种新的dReLU函数,该函数旨在提高LLM激活稀疏性(实现了接近90%的稀疏性)。

dReLU公式和效果如下

效果测试

使用一个通用数据集分析每一层的零值激活比例。考虑值为零的激活,对于TurboSparse-Mistral-7 B,平均每层中有90%的神经元不活动。对于TurboSparse-Mixtral-47 B,每个专家FFN的平均百分比略低,为85%。最初,Mixtral-47 B将激活每层8个专家中的2个,引入75%的稀疏度,这意味着只需要计算25%的FLOP。在ReLUfication之后,每个专家只会激活15%的神经元。结合这些,在推断中,每个莫伊层中只有3%的参数将被激活。

速度上有巨大提升

经过实际代码测试。全为0的权重和随机正态分布初始化的权重相比,全0乘法速度确实快了点,但好像也不是很多。。。

速度优化之矩阵乘法->加法—基于BitNet量化的MatMul-free


Scalable MatMul-free Language Modeling

https://github.com/ridgerchu/matmulfreellm

1、AdderNet在卷积神经网络中用符号加法取代乘法。2、采用二进制或三进制量化,将MatMul简化为在累加之前翻转或清零值的操作。开发了第一个可扩展的MatMul-free语言模型(Matmul-free LM),通过使用密集层和元素的Hadamard产品的自注意函数的加法运算。

通过在三元密集层的GPU实现中使用融合内核,与GPU上未优化的基线相比,训练速度加快了25.6%,内存消耗减少了61.0%。此外,通过采用低位优化的CUDA内核,推理速度提高了4.57倍,当模型扩展到13 B参数时,内存使用量减少了10倍。

方法

采用BitNet来替换包含MatMul的密集层,实现将矩阵乘法转为加减法。

bitlinear的量化算法

优化bitNet的计算,将RMS Norm和Linear层的计算合并,降低IO读取。

评测

可以看到MatMul方法可以达到和原始Transformer模型相近的效果,但是速度和模型大小上均有大幅优化。

KV缓存int2量化:KIVI


https://github.com/jy-yuan/KIVI

KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache

用 KV 缓存int2量化解锁长文本生成

根据之前的文章中提到,kv缓存的大小对decoding阶段速度有明显影响,降低kv缓存可以有效降低LLM推理成本,提高推理速度、增大最大处理长度。常用的方法有kv缓存滑窗截断、压缩、量化等方式。截断难免会漏掉重要信息,可以考虑引入RAG的思路进行优化。高质量的压缩和量化方法是比较好的优化方式。

akaihaoshuai:LLM推理加速调研

本文提到的KIVI方法就是对kv缓存进行2bit量化(4bit量化已经损失很小了),在几乎保持相同质量的同时大幅降低了内存消耗,带来2.35~3.47倍的吞吐量提升。

介绍

研究了KV缓存的元素分布。分析表明:

  • 对于key缓存,存在一些固定的通道,其幅度非常大,这与Awq论文中提到的结果一致。因此key缓存应该按通道进行量化,即沿着通道维度对元素进行分组,并将它们一起量化。这样,它可以将误差限制在每个单独的通道,而不会影响其他正常通道。

  • 对于value缓存,没有明显的离群值模式。但实验表明,它只能按token进行量化,因为它用于计算注意力输出,这本质上是一个value缓存混合器。每个令牌的量化可以将误差限制在每个单独的令牌内,并确保一个令牌的量化不会对其他令牌产生不利影响。

因此在KIVI中,对于value缓存,每次将新的token量化后添加到之前的缓存中即可。而对于key缓存,由于按通道量化,需要跨越不同的token,因此根据groupsize大小,每满groupsize个key缓存,则将其进行量化。残余的key缓存保持原始精度。最后在计算时将两部分的结果相加即可。

方法论

伪量化是指我们通过首先将KV缓存量化到较低的精度,然后在注意力层对其进行反量化来模拟量化过程。对于每通道量化,如果令牌的数量没有被均匀地分成组,我们添加补零以确保它可以被完美地分组。通过这种方式,我们确保KV缓存中的所有令牌都被量化。

下图是对逐通道和逐token进行量化后的对比结果。

可以看到int4精度下,模型质量基本不会下降。但是在int2量化时,对value缓存进行逐通道的量化,会导致精度大幅降低。而对key缓存进行逐token的量化,精度也有较大的损失,而逐通道的量化,则对模型性能没有影响。

为什么key和value的缓存方法不一致?观察其分布情况如图所示

可以看到,在key缓存中,一些固定的通道表现出非常大的幅度,而在值缓存中,没有显著的离群值模式。对key缓存逐通道量化,可以大幅降低异常值对每个token量化的影响。对value缓存,从图中来说,逐通道还是逐token,应该并没有特别大的区别,但是从表中看,影响比key缓存要大的多得多???😱😱😱

参考代码对LLama3-8B模型的cache也进行了可视化,结果图下

https://github.com/jy-yuan/KIVI/blob/main/vis/vis.ipynb

llama3-8B key value缓存可视化图

结果和论文中的差不多。

LLM进行量化后的推理过程如下图所示。

代码逻辑如下所示

实验

从测试效果看,KIVI的质量基本和16bit接近,没有多少精度损失。

测试量化的groupsize为32和128时,和fp16的基准模型内存占用和吞吐量对比。

可知groupsize越小,残余量化的kv缓存越少,内存占用越低,速度越快,吞吐量也越大。

下图对比了不同groupsize对模型质量的影响,虽然有些不同,但整体变化并不大。

代码

https://github.com/jy-yuan/KIVI/blob/main/models/llama_kivi.py

KIVI对kvcache进行部分量化

triton_quantize_and_pack_along_last_dim量化和数据打包代码

预测解码Speculative Decoding


Faster Cascades via Speculative Decoding

级联和推测解码是提高语言模型推理效率的两种常用方法。

本文就是通过设计新的投机级联技术来利用这两种方法的优点,该技术通过投机性执行来实现它们的延迟规则。

模型级联

Language model cascades: Token-level uncertainty and beyond

级联是通过自适应推理实现更有利的成本-质量折衷的一种简单策略。大多数“简单”实例调用一个小模型,而少数“困难”实例被推迟到一个大模型。以此达到质量不降、速度提升的目的。

那么问题来了,什么是简单实例、什么是困难实例?总得对输入处理过才能判断。

因此,级联的关键挑战是设计一个延迟规则,该规则决定是否将输入推迟到较大的模型。其中标准方法是先使用小模型推理,对推理结果计算置信度(如典型地通过其Softmax概率输出来衡量),置信度高则认为结果可靠,置信度低则结果不可靠,输入更大的模型进行二次推理。

但这存在一个长度偏差问题:无论质量如何,人们往往会推迟更长的预测。

在Language model cascades: Token-level uncertainty and beyond研究了以分布分位数的形式引入令牌级不确定性的问题,提出了一种基于分位数特征训练的后自组织延迟规则。

总的来说,模型级联就是组合多个不同大小的模型,通过将问题按照难易程度分别输入不同的模型进行处理,最终达到答案质量高和推理成本低的均衡。

Speculative Decoding

Unlocking Efficiency in Large Language Model Inference: A Comprehensive Survey of Speculative Decoding

https://github.com/hemingkx/SpeculativeDecodingPapers

第一篇关于Speculative Decoding的综述文章。推测解码是一次性生成多个token,解决LLM在decoding阶段单次只生成单个token,导致迭代次数太多从而耗时太长的问题。

推测解码(右)首先高效地用draft模型生成多个令牌,然后使用目标LLM并行验证它们。将丢弃分叉位置(例如)之后起草的令牌,以保证生成质量。

传统Autoregressive Decoding的流程如下

Autoregressive Decoding

Speculative Decoding的计算流程如下所示

Speculative Decoding

总的来说,Speculative Decoding使用小模型生成候选结果,然后由大模型并行验证和修改,最终得到满意答案的方法。

总结


1、PRepBN是将LayerNorm逐步替换成BatchNorm,并softmax注意力简化成了线性注意力的方法,速度上确实有所提升,但目前只在VT上尝试,且模型量级不大。在LLM方向上的效果有待考量(应该会下降不少吧)❓

2、稀疏激活Turbo Sparse是一个比较好的思路,在4090上PowerInfer-2可以比llama.cpp快10倍。需要使用dReLU这样的激活函数训练的模型。普通的SwiGLU激活函数没有这么好的效果。💓

3、MatMul-free是在bitnet的基础上做的优化,不过本身bitnet量化就已经极大程度的提升速度了,在这个速度基础上优先考虑模型质量更重要。❓

4、KIVI是一个不修改模型结构的比较好的加速方法,只需要调整缓存结构和attention部分的forward函数。💓

Evaluating Quantized Large Language Models中提到大多数大模型可以采用W4、W4A8、KV4、W8KV4量化位宽,几乎没有性能损失(<2%)。越大的模型对于权重和KV Cache量化容忍度更高,而对权重-激活值量化容忍度更低。相较于短文本(<4k),输入长文本(>4k)时模型性能对权重和kv cache量化容忍度更低。对于长文本任务,多数模型对KV Cache量化的容忍度低于对权重、权重-激活量化。因此在多数情况下,推荐使用W4、W4A8、KV8量化位宽执行长文本任务。

5、模型级联和Speculative Decoding的方法,都需要加载两个及以上数量的模型,是以内存换效率的思路。模型级联是组合多个不同大小的模型,通过将问题按照难易程度分别输入不同的模型进行处理。而Speculative Decoding是先通过小模型预测结果,再由大模型对结果进行验证和优化。暂不推荐❌

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

参考文章


  • SLAB: Efficient Transformers with Simplified Linear Attention and Progressive Re-parameterized Batch Normalization

  • https://github.com/xinghaochen/SLAB

  • Turbo Sparse: Achieving LLM SOTA Performance with Minimal ActivatedParameters

  • https://huggingface.co/PowerInfer

  • Scalable MatMul-free Language Modeling

  • https://github.com/ridgerchu/matmulfreellm

  • https://github.com/jy-yuan/KIVI

  • KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache

  • akaihaoshuai:LLM推理加速调研

  • Faster Cascades via Speculative Decoding

  • Language model cascades: Token-level uncertainty and beyond

  • Unlocking Efficiency in Large Language Model Inference: A Comprehensive Survey of Speculative Decoding

  • https://github.com/hemingkx/SpeculativeDecodingPapers

  • Evaluating Quantized Large Language Models

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值