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

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是先通过小模型预测结果,再由大模型对结果进行验证和优化。暂不推荐❌

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值