赞
踩
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乘法速度确实快了点,但好像也不是很多。。。
代码部分略,有需要可留言。
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模型相近的效果,但是速度和模型大小上均有大幅优化。
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缓存的元素分布。分析表明:
因此在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缓存要大的多得多???
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。