大模型推理加速调研(框架、方法)

大模型推理加速的目标是高吞吐量、低延迟。吞吐量为一个系统可以并行处理的任务量。延时,指一个系统串行处理一个任务时所花费的时间。调研了一些大模型推理的框架。

框架llama.cpprtp-llmvllmTensorRT-LLMLMDeployfastllm
语言C++
https://github.com/ggerganov/llama.cpp
Python
https://github.com/alibaba/rtp-llm阿里
Python
https://github.com/vllm-project/vllm
https://github.com/NVIDIA/TensorRT-LLMPython
https://github.com/InternLM/lmdeploy/blob/main/README_zh-CN.md商汤
C++
https://github.com/ztxz16/fastllm
特点1、纯C++推理加速,无任何额外依赖2、F16 和 F32混合精度3、支持4bit量化4、无需GPU、可只用CPU运行1、高性能的 cuda kernel2、支持 paged attention 、flash attention2、和 kv cache 量化1、PagedAttention2、高性能的 cuda kernel1、高性能CUDA Kernel2、量化Continuous Batch,Blocked K/V Cache,动态拆分和融合,张量并行,高性能 kernel等重要特性。推理性能是 vLLM 的 1.8 倍可靠的量化支持权重量化和 k/v 量化。1、纯c++实现2、浮点模型(FP32), 半精度模型(FP16), 量化模型(INT8, INT4) 加速3、多卡部署,支持GPU + CPU混合部署支持并发计算时动态拼Batch全平台支持
多模态支持✓(llava、mobileVLM、Obsidian等)✓(llava、Qwen-VL)××✓(InternLM、Qwen-VL)×
多平台支持××××
KV Cache
量化方法int8、int4等各种精度的量化kv cache 量化支持 weight only INT8 量化。支持加载时自动量化GPTQ、AWQ、SqueezeLLM、FP8 KV 缓存INT4/INT8 Weight-Only Quantization (W4A16 & W8A16)SmoothQuantGPTQAWQFP8INT4 权重量化K/V 量化W8A8 量化INT8, INT4
高性能Cuda Kernal
Flash Attention
Paged Attention×
Continuous Batching
Speculative Decoding(投机采样)××
Medusa×××

量化

大模型量化将16位、32位浮点数的模型参数或激活量化为4位或8位整数能够有效降低模型存储空间和计算资源需求,同时加速推理速度。量化对象包含权重、激活、KV Cache量化

  • 仅权重量化,如:W4A16、AWQ及GPTQ中的W4A16,W8A16(权重量化为INT8,激活仍为BF16或FP16)
  • 权重、激活量化,如:SmoothQuant中的W8A8
  • KV Cache INT8 量化,LLM 推理时,为了避免冗余计算,设计了 KV Cache 缓存机制,本质上是空间换时间,由于 KV Cache 的存在,对于支持越长的文本长度的 LLM, KV Cache 的显存占用越高。 KV Cache 的量化也是有很必要的。

一般有以下几种量化方法:weight only INT8、KV Cache量化、int4量化、int8量化

KV Cache

KV Cache 采用以空间换时间的思想,复用上次推理的 KV 缓存,可以极大降低内存压力、提高推理性能,而且不会影响任何计算精度。以 GPT 为代表的一个 token 一个 token 往外蹦的 AIGC 大模型为例,里面最主要的结构就是 transformer 中的 self-attention 结构的堆叠,实质是将之前计算过的 key-value 以及当前的 query 来生成下一个 token。,LM 用于推理的时候就是不断基于前面的所有 token 生成下一个 token,每一轮用上一轮的输出当成新的输入让 LLM 预测,一般这个过程会持续到输出达到提前设定的最大长度或者是 LLM 自己生成了特殊的结束 token。其中有**存在很多的重复计算,比如token的Key Value的计算,一个方法就是将过去token得到的Key Value存起来,Query不需要存,**Q矩阵是依赖于输入的,因此每次都不同,无法进行缓存,因此Q矩阵通常不被缓存。

Flash Attention

当输入序列(sequence length)较长时,Transformer的计算过程缓慢且耗费内存,这是因为self-attention的time和memory complexity会随着sequence length的增加成二次增长。,GPU中存储单元主要有HBM和SRAM,GPU将数据从显存(HBM)加载至on-chip的SRAM中,然后由SM读取并进行计算,计算结果再通过SRAM返回给显存, HBM容量大但是访问速度慢,SRAM容量小却有着较高的访问速度。普通的Attention的计算过程如下,需要多次访问HBM,Flash Attention的目的就是通过分片+算子融合(矩阵乘法和Softmax)减少对HBM的访问。

将矩阵分片运算,矩阵乘法这些简单,直接拆分计算就可以,但是softmax算子分片计算出来的不是最终的,Flash Attention的通过另外的变量,将softmax优化成了一个可以分片运算的算子。

Paged Attention

PagedAttention是对kv cache所占空间的分页管理,是一个典型的以内存空间换计算开销的手段,虽然kv cache很重要,但是kv cache所占的空间也确实是大且有浪费的,所以出现了pagedattention来解决浪费问题。kv cache大小取决于seqlen,然而这个东西对于每个batch里面的seq来说是变化的,毕竟不同的人输入不同长度的问题,模型有不同长度的答案回答,kv cache统一按照max seq len来申请,造成现有decoder推理系统浪费了很多显存。

PagedAttention将每个序列的KV缓存分成多个块,每个块包含固定数量的标记的键和值。在注意力计算过程中,PagedAttention Kernel高效地识别和获取这些块,采用并行的方式加速计算。(和ByteTransformer的思想有点像)PagedAttention的核心是一张表,类似于OS的page table,这里叫block table,记录每个seq的kv分布在哪个physical block上,通过把每个seq的kv cache划分为固定大小的physical block,每个block包含了每个句子某几个tokens的一部分kv,允许连续的kv可以不连续分布。在attention compute的时候,pagedattention CUDA kernel就通过block table拿到对应的physical block序号,然后CUDA线程ID计算每个seq每个token的offset从而fetch相应的block,拿到kv,继续做attention的计算。

Continuous batching

静态批处理:在第一遍迭代(左)中,每个序列从提示词(黄)中生成一个标记(蓝色)。经过几轮迭代(右)后,完成的序列具有不同的尺寸,因为每个序列在不同的迭代结束时产生不同的结束序列标记(红色)。尽管序列3在两次迭代后完成,但静态批处理意味着 GPU 将在批处理中的最后一个序列完成。

动态批处理:一旦批中的一个序列完成生成,就可以在其位置插入一个新的序列,从而实现比静态批处理更高的GPU利用率。

Speculative Decoding

00:39

投机采样的关键在于利用小模型多次推理单个字,让大模型进行多字预测,从而提升整体推理效率。每次小模型的单字推理耗时远远小于大模型,因此投机采样能够有效地提高推理效率。这种方法的优 势在于,通过蒸馏学习和投机采样,可以在减小模型规模的同时,保持较高的预测效果和推理速度,从而在实际部署中获得更好的性能优化。

from transformers import AutoModelForCausalLM, AutoTokenizer
import torchprompt = "Alice and Bob"
checkpoint = "EleutherAI/pythia-1.4b-deduped"
assistant_checkpoint = "EleutherAI/pythia-160m-deduped"
device = "cuda" if torch.cuda.is_available() else "cpu"tokenizer = AutoTokenizer.from_pretrained(checkpoint)
inputs = tokenizer(prompt, return_tensors="pt").to(device)
# ------------------------------------------------------------------------------------
model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)
assistant_model = AutoModelForCausalLM.from_pretrained(assistant_checkpoint).to(device)
# ------------------------------------------------------------------------------------
outputs = model.generate(**inputs, assistant_model=assistant_model)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
# ['Alice and Bob are sitting in a bar. Alice is drinking a beer and Bob is drinking a']

Medusa

一次生成多个词,相对于投机采样使用一个小模型一次生成多个词,主要思想是在正常的LLM的基础上,增加几个解码头,并且每个头预测的偏移量是不同的,比如原始的头预测第i个token,而新增的medusa heads分别为预测第i+1,i+2…个token。如上图,并且每个头可以指定topk个结果,这样可以将所有的topk组装成一个一个的候选结果,最后选择最优的结果。

1、多头美杜莎预测,记录logits

2、预测的token组合输入大模型,token的组合太多了,每个分别输入大模型判断耗时太长,Madusa提出了下图所示的树形注意力机制,预测的所有token可以同时输入进大模型,输出logits概率进行判别是否接受以及接收长度。

3、选择最优,重复1

多头美杜莎还会面临的一个问题是随着美杜莎头数量增加,top-k的树状分支也将会以指数增长,造成庞大的计算开销。此外,许多基础和微调模型并没有开放其训练数据集,因此多头美杜莎面临的另一大问题是使用什么数据来训练美杜莎头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目——送水管理系统

1、导入坐标 坐标作用pagehelper-spring-boot-startermybatis分页插件spring-boot-starter-thymeleafJSP模板引擎mybatis-spring-boot-startermybatisspring-boot-starter-webwebspring-boot-starter-testtestlombok不需要再写getter、setter或equals方法,只要有一…

3D问界—什么是blender,与MAYA有什么区别

问题提出:什么是blender,与MAYA有什么区别 Blender 是一个开源的、免费的 3D 建模和动画软件,广泛应用于各种领域。它提供了丰富的功能和工具,适用于从业余爱好者到专业艺术家的不同需求。 1. Blender 的主要用途和功能 属 性描述…

Vue2基础 13:内置指令

内置指令 1 指令梳理2 补充指令2.1 v-text2.2 v-html2.3 v-cloak案例--延迟引入vue造成js阻塞 2.4 v-once案例--点击按钮1并展示初始的值 2.5 v-pre 1 指令梳理 前面几节的基础学习已经用到了部分的指令,先梳理一下。 指令描述v-bind单向绑定解析表达式&#xff0…

高项论文老是过不了!换种方法与思路…

2024年上半年信息系统项目管理师成绩公布后,许多考生的论文成绩都不理想,很多人得了30多分,及格线上的考生大多只有45、46分,而50分以上的考生似乎并不多。以下应该是许多考生的心声: 每次都是论文不及格,…

蚂蚁全媒体总编刘鑫炜谈新媒体时代艺术家如何创建及提升个人品牌

新媒体时代艺术家如何创建及提升个人品牌形象——专访蚂蚁全媒体总编刘鑫炜 图为蚂蚁全媒体总编刘鑫炜 在新媒体风潮席卷全球的今天,传统艺术与新媒体技术的融合越来越紧密。这种变革不仅改变了艺术作品的呈现方式,也给艺术家们提供了更多的可能性。那么…

【SOLID原则前端中的应用】接口隔离原则(Interface Segregation Principle,ISP)- vue3示例

接口隔离原则(Interface Segregation Principle,ISP)在Vue 3中的应用 接口隔离原则(Interface Segregation Principle,ISP)规定,客户端不应该被迫依赖于它不使用的方法。 换句话说,…

图形编辑器基于Paper.js教程07:鼠标画直线或移动路径

探索Paper.js: 使用鼠标绘制直线和轨迹 在数字图形设计和Web应用开发中,提供一个直观和互动的界面供用户绘制图形是极为重要的。Paper.js是一款功能强大的JavaScript库,它使得在HTML5 Canvas上绘制矢量图形变得简单快捷。本文将介绍如何使用Paper.js实现…

LT86101UXE 国产原装 HDMI2.0 / DVI中继器方案 分辨率 4Kx2K 用于多显示器 DVI/HDMI电缆扩展模块

1. 描述 Lontium LT86101UXE HDMI2.0 / DVI中继器特性高速中继器符合HDMI2.0/1.4规范,最大6 gbps高速数据率、自适应均衡RX输入和pre-emphasized TX输出支持长电缆应用程序,没有晶体在船上保存BOM成本,内部灵活的PCB TX巷交换路由。 LT86101UXE HDMI2.0/DVI中继器自动检测线缆损…

新时代【机器学习】与【Pycharm】:【随机数据生成】与智能【股票市场分析】

目录 第一步:准备工作 1.1 安装必要的库 小李的理解: 1.2 导入库 小李的理解: 第二步:生成和准备数据 2.1 生成随机股票数据 小李的理解: 2.2 数据探索与可视化 小李的理解: 2.3 数据处理 小李…

可编程直流电源的恒压模式(CV)和恒流模式(CC)

本文介绍可编程直流电源的恒压模式(CV)和恒流模式(CC)。 可编程直流电源在硬件开发过程中经常被用到,通常,它有2种模式,恒压模式(CV)和恒流模式(CC&#xff…

桌面记事便签哪款好 好用的桌面记事本app

很多人喜欢在桌面上记事,尤其是经常使用电脑的上班族,这样查看起来更加方便。但在网上众多的记事软件中,哪款才是最好用的呢? 在众多选择中,敬业签以其出色的功能和用户体验脱颖而出,成为很多人记事的首选…

Debezium报错处理系列之第111篇:Can‘t compare binlog filenames with different base names

Debezium报错处理系列之第111篇:Cant compare binlog filenames with different base names 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技…

#数据结构 链表

单向链表 1. 概念 单向链表 单向循环链表 双向链表 双向循环链表 解决:长度固定的问题,插入和删除麻烦的问题 1、逻辑结构: 线性结构 2、存储结构: 链式存储 链表就是将 结点 用链串起来的线性表,链就是 结点 中的…

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上,生成不同相机对应的SpringArm组件。其次是在Controller上,拿到这个Pawn,并在其中设置输入响应,并定义响应事件。响应事件里有指向Pawn的指针,并把Pawn的缩放平移功能进行…

MySQL的慢sql

什么是慢sql 每执行一次sql,数据库除了会返回执行结果以外,还会返回sql执行耗时,以mysql数据库为例,当我们开启了慢sql监控开关后,默认配置下,当sql的执行时间大于10s,会被记录到慢sql的日志文件…

优选算法之技巧(一):双指针一:移位0与复写0

引用:我们之前学过快排,首先用三元取中,找(key),然后就用到了双指针的方法来进行交换排序,那我们今天要讲的双指针其实大同小异,无非在数组中就变成了下标。 题一: 给定一个数组 nums&#xf…

LDR6020-VR串流线:开启虚拟现实新纪元的钥匙

随着科技的飞速发展,虚拟现实(VR)技术已经从科幻概念逐渐走进我们的生活,成为娱乐、教育、医疗等多个领域的热门话题。而VR串流线,作为这一技术的重要组成部分,正逐步成为连接用户与高质量VR体验的关键桥梁…

移动硬盘坏道深度解析与应对全攻略

一、现象解读:移动硬盘坏道的直观展示 在数字化信息爆炸的今天,移动硬盘作为便捷的数据存储与传输工具,其重要性不言而喻。然而,随着使用时间的推移,不少用户遭遇了移动硬盘出现“坏道”的困扰。坏道,作为…

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架,它提供了许多内置的功能,包括:支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下: …

scp命令快速上手用法

作用 scp命令可以实现linux和linux,linux和windows之间文件互传 操作 实验准备 windows系统 ip:192.168.172.1 linux系统A ip:192.168.172.181 linux系统B ip:192.168.172.181 实验1:linux系统A推送文件到linxu…