搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
秋刀鱼在做梦
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【记录&经验分享】——TensorFlow 2.1.0 GPU版安装成功经验分享_tensorflow-gpu==2.1.0安装
2
groubi下载、安装、激活、测试
3
Django 后端架构开发:DRF 高可用API设计与核心源码剖析_drf后端开源项目
4
【工具推荐】强大的“小程序反编译”工具推荐_小程序反编译工具
5
【数据库的连接查询】
6
软件开发不会立刻消失!
7
python并发测试脚本_压力测试python脚本由测试部维护
8
Neo4j底层存储结构_neo4j的数据库底层架构
9
Docker Compose运行Elasticsearch
10
聊聊测试工程师的核心能力模型_测试人员能力模型
当前位置:
article
> 正文
总结:大模型推理优化策略
作者:秋刀鱼在做梦 | 2024-08-20 20:21:25
赞
踩
大模型推理优化
原文地址:
大模型推理优化策略
7.1 显存优化
Qunatized KV Cache
MQA/GQA
核心思想是减少kv-cache的数量,以少量kv-cache对应多个query
PagedAttention
KV cache,其具有以下特点:1. 显存占用大,14b级别的模型,每个token需要约0.7M-1M的显存;2. 动态变化:KV 缓存的大小取决于序列长度,这是高度可变和不可预测的。因此,这对有效管理 KV cache 挑战较大。该研究发现,由于碎片化和过度保留,现有系统浪费了 60% - 80% 的显存。
为了解决这个问题,该研究引入了 PagedAttention,这是一种受操作系统中虚拟内存和分页经典思想启发的注意力算法。与传统的注意力算法不同,PagedAttention 允许在非连续的内存空间中存储连续的 key 和 value 。具体来说,PagedAttention 将每个序列的 KV cache 划分为块,每个块包含固定数量 token 的键和值。在注意力计算期间,PagedAttention 内核可以有效地识别和获取这些块。因为块在内存中不需要连续,因而可以用一种更加灵活的方式管理 key 和 value ,就像在操作系统的虚拟内存中一样:可以将块视为页面,将 token 视为字节,将序列视为进程。序列的连续逻辑块通过块表映射到非连续物理块中。物理块在生成新 token 时按需分配。在 PagedAttention 中,内存浪费只会发生在序列的最后一个块中。这使得在实践中可以实现接近最佳的内存使用,仅浪费不到 4%。
PagedAttention 还有另一个关键优势 —— 高效的内存共享。例如在并行采样中,多个输出序列是由同一个 prompt 生成的。在这种情况下,prompt 的计算和内存可以在输出序列中共享。PagedAttention 自然地通过其块表格来启动内存共享。与进程共享物理页面的方式类似,PagedAttention 中的不同序列可以通过将它们的逻辑块映射到同一个物理块的方式来共享块。为了确保安全共享,PagedAttention 会对物理块的引用计数进行跟踪,并实现写时复制(Copy-on-Write)机制。PageAttention 的内存共享大大减少了复杂采样算法的内存开销,例如并行采样和集束搜索的内存使用量降低了 55%。这可以转化为高达 2.2 倍的吞吐量提升。
vllm的其他优化:continuous batching,CUDA kernel优化
FlashAttention
解释1:记I为模型的计算强度I,单位FLOP/byte代表模型进行单位byte数据交互可实现的操作数,则I*带宽beta即模型的计算性能,单位为FLOP/s。令I_max=计算平台算力/计算平台带宽,当模型的计算强度I小于平台的理论计算强度I_max,模型的计算能力P即I*beta,当模型的计算强度大于I_max,则模型的计算性能P等于平台的算力。故若模型的计算强度小,则瓶颈在带宽,若模型的计算强度大,则瓶颈在算力。为提高计算性能,需提高计算强度,即每bytes数据交互的操作数。
解释2:记N=每次操作要求的FLOP,单位FLOP/OP;pi=平台的算力,单位FLOP/s;beta=内存带宽,单位byte/s;P=实际实现计算速度,单位为FLOP/s;优化目标为O=P/N每秒钟实现的运算次数,单位为OP/s.由于N固定,故优化目标转而为P,P=min{beta_r*I_max=beta_r*pi/beta,pi},故优化目标转而为beta,即改变内存访问策略,实现beta最大化。
出发点:注意力操作中,S和P的计算空间复杂度都是O(N^2),此外,scale,mask,softmax,dropout都是带宽约束操作。
思路:输入数据K、Q、V是存储在HBM上的,中间结果S、A都不需要存储到HBM上。通过这种方式,FlashAttention可以将内存开销降低到线性级别,并实现了2-4倍的加速,同时避免了对中间结果的频繁读写,从而提高了计算效率。
方法:O(N^2)空间复杂度的矩阵计算对HBM的读写是主要的内存瓶颈,因此主要优化点是:1. 在不访问整个输入的情况下计算softmax;2. 不为反向传播存储大的中间attention矩阵。FlashAttention提出两种方法来分步解决上述问题:tiling,recomputation。tiling - 注意力计算被重新构造,将输入分割成块,并通过在输入块上进行多次传递来递增地执行softmax操作。recomputation - 存储来自前向的 softmax 归一化因子,以便在反向中快速重新计算芯片上的 attention,这比从HBM读取中间矩阵的标准注意力方法更快。由于重新计算,这虽然导致FLOPS增加,但是由于大量减少HBM访问,FlashAttention运行速度更快。该算法背后的主要思想是分割输入,将它们从慢速HBM加载到快速SRAM,然后计算这些块的 attention 输出。在将每个块的输出相加之前,将其按正确的归一化因子进行缩放,从而得到正确的结果。kernel融合:tiling分块计算使得我们可以用一个CUDA kernel来执行注意力的所有操作。从HBM中加载输入数据,在SRAM中执行所有的计算操作(矩阵乘法,mask,softmax,dropout,矩阵乘法),再将计算结果写回到HBM中。通过kernel融合将多个操作融合为一个操作,避免了反复地从HBM中读写数据。基于以上思路,flash-attention天然在batch和heads两个维度上进行了并行化:使用一个thread block来处理一个attention head,总共需要thread block的数量等于batch size × number of heads。每个block被调到到一个SM上运行(SM可以调度多个thread block),当线程块数目较大时(例如80个),该调度方法能高效利用GPU上接近全部的计算资源。
此处P=A/l
FlashAttentionv2
出发点:FlashAttention利用了GPU内存的非对称层次结构,将内存消耗降至线性(而非二次方),并相较于优化基线实现了2到4倍的运行速度提升,然而,该技术的速度依然没有达到优化矩阵乘法(GEMM)操作的速度,前向传播的计算吞吐量仅达到理论最大浮点运算速率(FLOPs/s)的30-50%,而反向传播只能达到25-35%。这种低效率是由于GPU上不同线程块之间的负载分配不佳,导致低占用率或不必要的共享内存读/写。
方法:(1)调整算法,减少中间缩放的次数。通常实现Softmax算子为了数值稳定性(因为指数增长太快,数值会过大甚至溢出),会减去最大值,这样带来的代价就是要对token遍历3次。而如果不保存中间最大值和指数和而只保留对数指数和,可以减少非矩阵乘法操作的浮点计算次数;(2)序列长度维度的并行。v1在batch_size和num_heads维度使用了并行化,但在处理长序列输入时,由于内存限制,通常会减小batch size和head数量,这样并行化程度就降低了。因此,FlashAttention-2还在序列长度这一维度上进行并行化,显著提升了计算速度。而序列并行要求我们交换循环的层次,FlashAttention-v2将Q移到外循环,将KV移到内循环,从而分块计算的注意力值矩阵块只存储在SRAM上,避免了在HBM上的频繁读写。(b*s*d->b*s*k*m)。(3)在每个线程块内部,分散warps之间的工作负载,减少通过共享内存的通信。v1使用是split-K策略,这种策略会使所有warp将中间结果写入共享内存进行同步,然后将中间结果相加,这些共享内存读取会拖慢前向传播的计算。v2使用的是split-Q策略,这样在每个warp计算QK^\top后,结果只需要对应的V分片即可得到O的对应分片,而无需进行warps间的通信,减少了中间共享内存读写。
此处e^{S-m}即为A
?每个token的计算都需要加载K,V,O,得到S,故M大小的SRAM容纳的最大token数为[M/4d],取该数与d间的最小值作为K、V的token上限数。
结果:在前向传播中可以达到理论最大吞吐量的73%,反向传播中则可达到63%。当用于端到端训练GPT风格的模型时,每个A100 GPU的训练速度可以达到225 TFLOPs/s。
细节1:GPU由计算元素(如浮点运算单元)和内存层次结构组成。现代GPU中通常包含专门的单元来加速低精度(如FP16/BF16)的矩阵乘法运算,例如Nvidia GPU上的Tensor Core。内存层次结构包括高带宽存储器(HBM上的存储都属于DRAM)和静态随机存取存储器(GPU上所有的on-chip memory都是SRAM)。以A100 GPU为例,它拥有40-80GB的高带宽存储(HBM),带宽达到1.5-2.0TB/s,以及每个流式多处理器108个中的192KB芯片上SRAM,其带宽估计约为19TB/s。Nvidia的A100 GPU具有最大理论吞吐量达到312 TFLOPs/s(每秒万亿次浮点运算)的FP16/BF16格式矩阵乘法性能,然而对于非矩阵乘法的FP32格式计算,这一数字仅为19.5 TFLOPs/s。
细节2:GPU有大量的threads用于执行操作(an operation,也称为a kernel)。这些thread组成了thread block,接着这些blocks被调度在SMs上运行。在每个thread block中,threads被组成了warps(32个threads为一组)。一个warp内的threads可以通过快速shuffle指令进行通信或者合作执行矩阵乘法。在每个thread block内部,warps可以通过读取/写入共享内存进行通信。每个kernel从HBM加载数据到寄存器和SRAM中,进行计算,最后将结果写回HBM中。
Flash-
Decoding
: kv序列长度方向的并行
出发点:FlashAttention优化不适合直接应用于推理过程。因为在训练过程中,FlashAttention对batch size和query length进行了并行化加速。而在推理过程中,query length通常为1,这意味着如果batch size小于GPU上的SM数量(例如A100上有108个SMs),那么整个计算过程只使用了GPU的一小部分!特别是当上下文较长时,通常会减小batch size来适应GPU内存。例如batch size = 1时,FlashAttention对GPU利用率小于1%!
FlashAttention对batch size和query length进行了并行化加速,Flash-Decoding在此基础上增加了一个新的并行化维度:keys/values的序列长度。即使batch size很小,但只要上下文足够长,它就可以充分利用GPU。与FlashAttention类似,Flash-Decoding几乎不用额外存储大量数据到全局内存中,从而减少了内存开销。
Flash Decoding主要包含以下三个步骤:1将keys和values分成较小的block;2 使用FlashAttention并行计算query与每个block的注意力(这是和FlashAttention最大的区别)。对于每个block的每行(因为一行是一个特征维度),Flash Decoding会额外记录attention values的log-sum-exp(标量值,用于第3步进行rescale);3 对所有output blocks进行reduction得到最终的output,需要用log-sum-exp值来重新调整每个块的贡献。第1步中的数据分块不涉及GPU操作(因为不需要在物理上分开),只需要对第2步和第3步执行单独的kernels。虽然最终的reduction操作会引入一些额外的计算,但在总体上,Flash-Decoding通过增加并行化的方式取得了更高的效率。
SparQ Attention:基于稀疏注意力思想减少kv的数量
出发点:1. 注意力机制中的softmax函数输出主要由少数分量主导,大部分分量接近于0。因此,只需从内存中获取具有最高注意力分数的tokens的key和value对,就可以在不影响任务性能的情况下显著减少内存传输。2. 通过稀疏化查询向量q,仅保留r个最大幅度分量,可以有效预测具有最大注意力分数的索引,而无需获取完整的K矩阵。步骤:1. 找到输入查询向量q中r个最大分量的索引,并仅沿着这些索引获取key缓存K。使用切片查询和键来计算近似注意力分数。2. 在近似注意力分数中找到前k个位置,并获取相应
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/1008598
推荐阅读
article
基于
Unity
的
Android
开发(
Unity
与
Android
的
交互
与
嵌入)_
unity
andro...
本文详细指导如何在
Unity
2021.3.19
与
AS2022.3版本下,通过具体项目实例,解决
Unity
与
Android
...
赞
踩
article
HRNet
【
demo
复现
过程】_
hrnet
复现
...
Deep High-Resolution Representation Learning for Human Pose ...
赞
踩
article
MySQL
:
数据库
的
增删
查改_
数据库
增删
改查基本
语句
...
我们这一篇主要介绍
数据库
的
增删
查改~_
数据库
增删
改查基本
语句
数据库
增删
改查基本
语句
我们...
赞
踩
article
Dify
官网
文档
没找到的
上传
文件
api
探索成功
_
dify
上传
文件...
Dify
提供的
api
文档
里提到了files,本地模式是upload
_
file
_
id,但是官网
文档
里没有提到这个id哪来。...
赞
踩
article
[转]
Ubuntu
12.04
Gitolite
安装
指南_
ubuntu
无法
安装
gitolite
...
先概述一下,你手上有一台全新的
Ubuntu
Server,参照本文会
安装
下列内容: 1、Git(这是肯定的) 2、...
赞
踩
article
Ubuntu
切换默认
python
版本
(
python
2
和
python
3
)_
ubuntu
切换默认pyt...
在
python
3
不断发展和
python
2
不再维护的趋势下,公司里面的
python
2
代码逐渐地被
python
3
代替。所以在...
赞
踩
article
【
机器
学习
实战
】-k-
近邻
算法
之手写
数字
识别
_
机器
学习
数字
识别
...
机器
学习
实战
》中k-
近邻
算法
中的第二个例子,使用k-
近邻
算法
来
识别
数字
,跟海伦
算法
区别在于,
数字
是图像的形式,宽高是32...
赞
踩
article
保姆
级
教程从零
搭建
云
服务器
(小彩蛋
,
请
大家
看烟花秀)
_
自己
搭建
云
手机
服务器
_
云
服务器
搭建
...
域名系统(英文:Domain Name System
,
缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的...
赞
踩
article
线程
池(三)----
ThreadPoolTaskExecutor
的提交方法
execute
和submi...
本文对比了Spring ThreadPool中
execute
与
submit
方法在任务提交、执行顺序、异常处理及事务回滚上...
赞
踩
article
JavaEE
-网络编程-
TCP
流
套
接字
编程_
java
实现
tcp
套
接字
...
本文介绍了
JavaEE
中
TCP
网络编程的基础,包括ServerSocket和Socket的使用,阐述了
TCP
的长连接和短...
赞
踩
article
js中的
ajax
【
Axios
,
XMLHttpRequest
,
Promise
,
async
】回调函数地狱...
js中的
ajax
【
Axios
,
XMLHttpRequest
,
Promise
,
async
】回调函数地狱等问题_js axi...
赞
踩
article
Ubuntu
系统
安装
Python
3.6.
8
-
Python
源代码
编译
安装
-
Python
环境
安装
_ubu...
本文将着重介绍如何在
Python
环境下,
安装
Python
3.6.
8
,以满足在
Ubuntu
系统中使用
Python
的需求。_...
赞
踩
article
QQ
集成登陆
_
集登
qq
录
我
...
QQ
授权登陆文档详解与步骤一、在
QQ
的开发平台申请Appkey与Appid。但是申请的前提是需要域名。把拿到的appke...
赞
踩
article
protobuf
的
更新
或
安装
_
linux
更新
protocbuf
库文件
版本
...
然后
安装
:其中第一行3.6.0表示
版本
号,可以换成你想要的
版本
号 最后:查看是否
安装
成功若为如下显示,则表示
安装
成功_l...
赞
踩
article
Linux
下
protobuf
保姆级
安装
教程_
linux
protoc
...
Linux
中
protobuf
保姆级教程_
linux
protoc
linux
protoc
...
赞
踩
article
读"
淘宝
技术
这
十年"有感_
淘宝
技术
这
十年
读后感
...
工作十几年了,拿了
这
本书看看,可以引起很多思想的共鸣,也能对
淘宝
的
技术
发展有一个大致的了解。读完
这
本书,可以看到
淘宝
技术
...
赞
踩
article
Excel之
match
与
index
函数_=
index
(
客户
基本
信息
表!b3
:
i1235
,
match
(...
本文介绍了Excel中
match
和
index
函数的使用方法。
match
函数用于查找指定
信息
的位置,例如=MATCH(B2...
赞
踩
article
ThreadPoolExecutor
的
execute
()和
submit
()方法_threadpool...
我希望使用多线程执行一个运算,并且线程执行完毕后我要获取执行结果。其实使用线程池
ThreadPoolExecutor
的e...
赞
踩
article
一个
手机
到
手机
之间
通话经过了哪些
设备
...
来源:https://www.bilibili.com/video/BV1ic411F7mM/?
一个
手机
到
手机
之间
通话经...
赞
踩
article
你给我解释解释
,
为什么
TMD非得选择
SpringCloud
alibaba
作为微
服务
开发
框架?_sp...
手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传
,
导出图片展现)
,
但都可提供源文件给每位爱学习的朋友《互...
赞
踩
相关标签
unity
android
交互
深度学习
pytorch
python
姿势检测
数据库
mysql
sql
低代码
开源软件
ubuntu
linux
机器学习
近邻算法
人工智能
服务器
运维
servlet
java
jvm
网络
tcp/ip