tensorrt,tensorrtllm优化原理

ops/2024/10/22 18:49:05/


tensorrt

1.算子融合
水平融合,垂直融合,删除冗余
计算图优化的目标是对计算图进行等价的组合变换,使得减少算子的读写操作提供效率。模型中有很多层,在部署模型推理时,每一层的运算操作都是由GPU完成的,但实际上是GPU通过启动不同的CUDA(Compute unified device architecture)核心来完成计算的,CUDA核心计算张量的速度是很快的,但是往往大量的时间是浪费在CUDA核心的启动和对每一层输入/输出张量的读写操作上面,这造成了内存带宽的瓶颈和GPU资源的浪费。TensorRT通过对层间的横向或纵向合并(合并后的结构称为CBR,意指 convolution, bias, and ReLU layers are fused to form a single layer),使得层的数量大大减少。横向合并可以把卷积、偏置和激活层合并成一个CBR结构,只占用一个CUDA核心。纵向合并可以把结构相同,但是权值不同的层合并成一个更宽的层,也只占用一个CUDA核心。合并之后的计算图(图4右侧)的层次更少了,占用的CUDA核心数也少了,因此整个模型结构会更小,更快,更高效。

2.数据排布优化
在TensorFlow框架的输入格式NHWC,而pytorch是NCHW。这些格式是框架抽象出来的矩阵格式,实际在内存中的存储都是按照1维的形式存储。这就涉及物理存储和逻辑存储之间的映射关系,如何更好的布局数据能带来存储数据的访问是一个优化方向;另外在硬件层面,有些硬件在某种存储下有最佳的性能,通常可以根据硬件的读写特点进行优化。

3.量化(低精度优化)
FP16/BF16/INT8/FP8/INT4
低精度的Tensor Core可以加速计算,量化的weight可以减少内存的访问,从而提性能

4.组batch(动态batch)
模型的输入只有单个batch的时候,单个batch的计算量并不能充分的利用CUDA核心的计算资源,有相当一部分的核心在闲置等待中;当输入有多个batch的时候,由于GPU的并行计算的特性,不同的batch会同步到不同的CUDA核心中进行并行计算,提高了单位时间GPU的利用率。

5.动态张量显存
在每个tensor的使用期间,TensorRT可能具有在运行时根据实际需要动态分配和释放张量内存的能力,避免显存重复申请释放,最大限度的重复利用,提高重复使用效率。
推理过程就涉及到存储设备的申请、释放以及内存对齐等操作,而这部分也是比较耗时的。
因此内存优化的方向,通常是减少频繁的设备内存空间的申请和尽量做到内存的复用。
一般的,可以根据张量生命周期来申请空间:
静态内存分配:比如一些固定的算子在整个计算图中都会使用,此时需要再模型初始化时一次性申请完内存空间,在实际推理时不需要频繁申请操作,提高性能
动态内存分配:对于中间临时的内存需求,可以进行临时申请和释放,节省内存使用,提高模型并发能力
内存复用:对于同一类同一个大小的内存形式,又满足临时性,可以复用内存地址,减少内存申请。

6.内核调整
TensorRT可以针对不同的算法,不同的网络模型,不同的GPU平台,进行 CUDA核的调整,选择最佳数据层和算法,以保证当前模型在特定平台上以最优性能计算。

7.多流并行
 识别可并行的模块,使用多流GPU并行处理

8.计算图优化
在计算图中,存在某些算子是串行依赖,而某些算子是不依赖性;这些相互独立的子计算图,就可以进行并行计算,提高推理速度,这就是计算图的调度。

tensorrtllm

在tensorrt优化的功能上还有以下优化
1.KV Cache
LLM推理的过程是一个自回归的过程,也就是说前i次的token会作为第i+1次的预测数据送入模型,拿到第i+1次的推理token。在这个过程中Transformer会执行自注意力操作,为此需要给当前序列中的每个项目(无论是prompt/context还是生成的token)提取键值(kv)向量。这些向量存储在一个矩阵中,通常被称为kv cache。kv cache是为了避免每次采样token时重新计算键值向量。利用预先计算好的k值和v值,可以节省大量计算时间,尽管这会占用一定的存储空间。

1.1.优化注意力机制
MHA
Multi-head Attention 标准的多头注意力机制,h个Query、Key 和 Value 矩阵。
MQA 
Multi Query Attention 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量
GQA
Group-Query Attention GQA将查询头分成N组,每个组共享一个Key 和 Value 矩阵
FlashAttention
修改某些计算的顺序,以更好地利用 GPU 的内存层次结构
1.2.PageAttention
PageAttention提供了一种技术手段解决显存碎片化的问题,从而可以减少显存占用,提高KV cache可使用的显存空间,提升推理性能。PageAttention命名的灵感来自OS系统中虚拟内存和分页的思想。可以实现在不连续的空间存储连续的kv键值。序列的连续逻辑块通过 block table 映射到非连续物理块。

2.in-flight batching
传统的 Batching 技术为 Static Batching 的,需要等 Batching 中所有序列推理完成后才能进行下一次批次。In-Flight Batching 又名 Continuous Batching 或 iteration-level batching,一次推理会重复多个迭代,以更小的迭代粒度组batch,该技术可以提升推理吞吐率,降低推理时延。

3.支持多机多卡
张量并行,流水线并行
当模型太大从而一张卡load不了,在一些低latency server情况下,由于memory-bound的存在,只batch size是不可以得到更高的吞吐率的场景
TP:权重做切分,但需要更高的GPU之间的通信nv-link
PP:按照layer进行拆分,前面layer算完才能给下一个layer计算,所以可能存在bubble,但可以通过再将batch进行拆分,减少weight的冗余加载,pp通产用在卡见通信比较受限的情况下。
单节点情况下:
GPU之间有比较好的通信情况,可以选择PP=1;
GPU之间有没有比较好的通信情况:
当bs或者输入输出比较大的情况下,可以选择PP>1,其他情况pp=1比较好。
多节点情况下:
节点机通信效率高的话:1<PP<=num_nodes
当通信效率不高的情况下:
当bs或者输入输出比较大的情况下,PP>num_nodes,其他情况pp=num_nodes比较好。


参考资料
http://www.xiaoutech.com/article/5/231.html

LLM推理优化技术综述:KVCache、PageAttention、FlashAttention、MQA、GQA - 知乎


http://www.ppmy.cn/ops/37089.html

相关文章

【如此简单!数据库入门系列】之效率基石 -- 磁盘空间管理

文章目录 1 前言2 磁盘空间管理3 磁盘空间管理的实现4 存储对象关系5 总结6 系列文章 1 前言 如何将表中的记录存储在物理磁盘上呢&#xff1f; 概念模式中&#xff0c;记录&#xff08;Record&#xff09;表示表中的一行数据&#xff0c;由多个列&#xff08;字段或者属性&…

彻底解决python的pip install xxx报错(文末附所有依赖文件)

今天安装pip install django又报错了&#xff1a; C:\Users\Administrator>pip install django WARNING: Ignoring invalid distribution -ip (d:\soft\python\python38\lib\site-pac kages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting djan…

重新规划路线

题目链接 重新规划路线 题目描述 注意点 题目数据 保证 每个城市在重新规划路线方向后都能到达城市 02 < n < 5 * 10^4connections.length n-1connections[i].length 20 < connections[i][0], connections[i][1] < n-1connections[i][0] ! connections[i][1] …

MySQL表的增删改查

在进行表操作之前,一定要use选中数据库 注释&#xff1a;在SQL中可以使用 --空格描述 来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。 文章目录 数据库约束约束类型NOT NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&…

Window(Qt/Vs)软件添加版本信息

Window&#xff08;Qt/Vs&#xff09;软件添加版本信息 文章目录 Window&#xff08;Qt/Vs&#xff09;软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

DB-GPT: Empowering Database Interactions with Private Large Language Models 导读

本文介绍了一种名为DB-GPT的新技术&#xff0c;它将大型语言模型&#xff08;LLM&#xff09;与传统数据库系统相结合&#xff0c;提高了用户使用数据库的体验和便利性。DB-GPT可以理解自然语言查询、提供上下文感知的回答&#xff0c;并生成高准确度的复杂SQL查询&#xff0c;…

uniapp 文字转语音(文字播报、语音合成)、震动提示插件 Ba-TTS

简介&#xff08;下载地址&#xff09; Ba-TTS 是一款uniapp语音合成&#xff08;tts&#xff09;插件&#xff0c;支持文本转语音&#xff08;无服务费&#xff09;&#xff0c;支持震动提示。 支持语音合成&#xff0c;文本转语音支持震动&#xff08;可自定义任意震动效果…

每日OJ题_贪心算法三⑤_力扣134. 加油站

目录 力扣134. 加油站 解析代码 力扣134. 加油站 134. 加油站 难度 中等 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一…