1.vllm代码走读(四)-- 模型执行
2.[fastllm]fastllm源码结构解析
3.DETR解读
4.retnetålinearattentionçåºå«
5.MMDet——Deformable DETR源码解读
6.对Deformable DETR的理解
vllm代码走读(四)-- 模型执行
本文主要对vllm代码走读(四)-- 模型执行过程中的细节进行深入分析,特别关注模型推理的实现。在上一节中,我们讨论了分布式环境下的模型执行机制,但模型推理的细节未能覆盖,这不利于后续流程的led控制器app源码理解。因此,本节将聚焦于模型推理的实现,以单GPU处理为例进行讲解。
模型执行的入口函数包含了对推理数据的准备、基于seq的数据封装、数据统计以创建设备相关资源、seq分析、整体封装、资源申请等关键步骤。在seq分析中,VLLM调度的单位是seqGroups,处理实际推理中的seq。seq分析涉及两层循环,处理数据。对于seq核心代码,主要对seq_len、context_len、query_len等进行处理,形成实际需要处理的数据长度。
在整体封装过程中,seq之上进行统一数据处理,batch_size为此次调度处理的TOKEN数量,max_query_len为seq中间最长TOKEN处理个数。block_tables进行扩充,但实际是数据上的扩充,并非KV CACHE的申请,以避免GPU KV CACHE利用率过高。
资源申请阶段,gap缺口源码seq_start_loc和seq_start_loc基于query_lens_tensor和seq_lens_tensor进行处理,涉及ATTENTION加速的内存相关操作。在SamplingMetadata.prepare中,处理seq_lens和query_lens,基于SEQ GROUP进行遍历。prefill阶段处理分支不作分析,decode阶段处理prompt_logprob_len为0,sample_len为seq groups包含的seq数量。
model_executable对应的函数,输入数据主要由_prepare_model_input生成。这部分分析了input_embedding、layer、ATTENTION、QKVParallelLinear、Attention、RowParallelLinear、MLP等关键组件的实现。input_embedding使用VocabParallelEmbedding类的forward函数,处理分布式embedding实现。layer以LlamaDecoderLayer为例,详细分析了self_attn和mlp的实现,重点关注ATTENTION部分,使用了flash-attention库进行优化。
ATTENTION部分的实现包括QKVParallelLinear的创建、Attention的具体实现以及RowParallelLinear的使用,其中Attention部分使用了flash-attention的后端实现。MLP部分则拆解为了up&gate、silu&mul、down三个算子,分别对应MLP结构的不同部分。
最后,execute_model得到模型多层网络的hidden_state。compute_logit阶段涉及_prune_hidden_states、est源码解析get_logits、_apply_logits_processors等步骤,分别处理隐藏状态的剪枝、获取概率和应用定制运算。
总结而言,本文从模型执行的入口、数据准备、处理细节、资源申请、ATTENTION和MLP实现到最终输出,全面解析了vllm模型执行的核心流程,为深入理解模型推理提供了详细的步骤和原理分析。
[fastllm]fastllm源码结构解析
fastllm源码结构解析 主要文件结构和继承关系如下: main包含factoryllm工厂,用于生成各种llm模型实例,basellm作为基类,包含通用方法和参数,所有模型使用相同的命名空间,fastllm为基本类,定义数据格式、权重映射和基础算子操作。 fastllm类属性解析:SetThreads(int t): 设置线程数
SetLowMemMode(bool m): 设置低内存模式
LowBitConfig: 包含量化参数,提供量化与反量化方法
DataType: 包括浮点、int8、int4等数据类型
DataDevice: 包含CPU与CUDA
WeightType: 包括LINEAR、EMBEDDING和None
Data: 包括形状、大小、扩容信息,量化配置等,提供复制、分配、预扩容等功能
Tokenizer: 包含TrieNode链表和token-to-string字典,提供插入、编码和解码函数
WeightMap: 存储模型名称与数据内存,oracle项目源码支持从文件加载和保存低位量化权重
core类操作分析:Embedding: 根据输入与权重计算输出
RMSNorm: L2归一化后乘以权重
LayerNorm: 使用gamma、beta进行层归一化
Linear: 线性变换
Split: 按轴分割数据
Cat: 按轴拼接数据
MatMulTransB: 多线程下矩阵转置乘法
Softmax: 激活函数
Silu: SiLU激活函数
GeluNew: 新型Gelu激活函数
Mul: 矩阵与浮点数乘法
MulTo: 点乘
AddTo: 点加操作(带alpha和不带alpha)
AttentionMask: 根据mask值替换
Permute: 数据通道转换
ToDevice: 数据迁移至GPU
basellm作为抽象类,继承自fastllm,包含纯虚函数如加载权重、模型推理、保存低比特模型、热身等。 chatglm、moss和vicuna继承自basellm,实现具体模型,函数与basellm类似。 fastllm结构体与属性解析:FileBuffer: 文件读写操作,包括读取各种类型数据和文件写操作
Data操作: 包括数据拷贝、统计、扩容、转置、计算权重和等
Tokenizer方法: 包括初始化、清空、插入、编码和解码
WeightMap方法: 包括从文件加载和保存低位量化权重
fastllm方法: 包括矩阵转置、通道转换、数据迁移、多线程乘法、激活函数等
DETR解读
DETR(Detection Transformer)是一种新型的目标检测模型,它基于Transformer架构,由Facebook AI Research(FAIR)提出。DETR与传统目标检测方法不同,不使用锚框或候选区域,而是直接将整个图像输入到Transformer中,同时输出目标的类别和边界框。
DETR的主要构成部分包括backbone、transfomer以及head模块。本文将结合源码对DETR进行解析。dubbo源码扩展
Backbone部分包含PE(position embedding)和cnn(resnet)主干网络。
PE采用二维位置编码,x和y方向各自计算了一个位置编码,每个维度的位置编码长度为num_pos_feats(该数值实际上为hidden_dim的一半),奇数位置正弦,偶数位置余弦,最后cat到一起(NHWD),permute成(NDHW)。输入的mask是2**,那么最后输出的pos encoding的shape是2***。
CNN_backbone采用resnet,以输入3**为例,输出**,下采样5次合计倍。
Transfomer主要由encoder和decoder两大模块构成。
TransformerEncoder中,qkv都来自src,其中q和k加了位置编码,v没有加,猜测原因可能是qk之间会计算attention,所以位置是比较重要的,value则是和attention相乘,不需要额外的位置编码。
TransformerDecoder中,几个重点的变量包括object query的自注意力和cross attention。
Head部分,分类分支是Linear层,回归分支是多层感知机。
Matcher采用的是HungarianMatcher匹配,这里计算的cost不参与反向传播。
Criterion根据匈牙利算法返回的indices tuple,包含了src和target的index,计算损失:分类loss+box loss。
分类损失采用交叉熵损失函数,回归损失采用L1 loss + Giou loss。
推理部分,先看detr forward函数,后处理,预测只需要卡个阈值即可。
论文链接:arxiv.org/pdf/....
代码链接:github.com/facebookrese...
参考链接:zhuanlan.zhihu.com/p/... zhuanlan.zhihu.com/p/...
如需删除侵权内容,请联系我。
retnetålinearattentionçåºå«
ç»æä¸åï¼è®¡ç®å¤æ度ä¸åçã
ç»æä¸åï¼RetNetéç¨æ®å·®åç»æï¼éè¿å¼å ¥è·³è·è¿æ¥æ¥é¿å 梯度æ¶å¤±å表示ç¶é¢é®é¢ãèLinearAttentioné常æ¯ä¸ä¸ªçº¿æ§åæ¢ï¼æ²¡ææ®å·®è¿æ¥ã
计ç®å¤æ度ä¸åï¼RetNetç±äºå¼å ¥äºæ®å·®åï¼å ¶è®¡ç®å¤æ度ç¸å¯¹è¾é«ãèLinearAttentionç计ç®å¤æ度ç¸å¯¹è¾ä½ï¼å 为å®åªæ¶åä¸ä¸ªçº¿æ§åæ¢æä½ã
MMDet——Deformable DETR源码解读
Deformable DETR: 灵活与精准的检测架构 Deformable DETR是对DETR模型的革新,通过引入Deformable结构和Multi-Scale策略,实现了性能提升与训练成本的优化。它解决了DETR中全像素参与导致的计算和收敛问题,通过智能地选取参考点,实现了对不同尺度物体的高效捕捉。这种结构弥补了Transformer在视觉任务上的局限,如今已经成为业界标准。 核心改进在于对Attention机制的重塑,Deformable DETR基于Resnet提取的特征,融入了多尺度特征图和位置编码,生成包含目标查询的多层次特征。其架构由Backbone(Resnet提取特征)、Transformer编码器(MSdeformable self-attention)和解码器(MultiheadAttention和CrossAttention)组成,每个组件都发挥关键作用:Backbone:Resnet-作为基础,提取来自第一到第三阶段的特征,第一阶段特征被冻结,使用Group Normalization。
Neck:将输入通道[, , ]映射到通道,利用ChannelMapper,生成4个输出特征图。
Bbox Head:采用DeformableDETRHead类型的结构,负责目标检测的最终预测。
Deformable Attention的核心在于其创新的处理方式:参考点(Reference Points)作为关键元素,预先计算并固定,offsets由query通过线性层生成,Attention权重由query通过线性变换和Softmax函数确定。而在Value计算上,输入特征图通过位置选择,结合参考点和offset,实现精确特征提取。最后,Attention权重与Value的乘积经过Linear层,得出最终输出。 在Decoder部分,Self-Attention模块关注对象查询,Cross-Attention则在对象查询与编码器输出间进行交互,生成包含物体特征的query。输入包含了query、值(编码器特征图)、位置编码、padding mask、参考点、空间形状等信息,输出则是每层decoder的object query和更新后的参考点。 简化后的代码,突出了关键部分的处理逻辑,如Encoder使用Deformable Attention替换传统的Self Attention,输入特征map经过处理后,参考点的初始化和归一化操作确保了模型的高效性能。Decoder中的注意力机制和输入输出细节,都展现出模型灵活且精准的检测能力。 Deformable DETR的设计巧妙地融合了Transformer的灵活性和Transformer架构的效率,为目标检测任务提供了全新的解决方案,展现出了其在实际应用中的优越性。对Deformable DETR的理解
理解Deformable DETR:一种改进的端到端物体检测方法(ICLR 口头报告) 首先,了解DETR的基础,特别是其Multi-head attention模块,相关知识可以参考arxiv.org/abs/....。Deformable DETR针对DETR的两个主要问题进行了优化:收敛速度慢和小目标检测性能不佳。 核心改进在于Deformable attention模块。以K=3, M=3为例,它将输入特征分解为多个Query feature,通过Linear计算Sampling Offsets和Attention Weights。每个Query feature与K个key交互,但不同之处在于,Deformable DETR的Attention Weights是通过Linear生成,而非原始方式。这种方法通过引入参考点和采样点,仅与部分特征点进行交互,显著减少了计算量。 多尺度Deformable Attention Module进一步提升了模型性能,通过cross attention在不同尺度特征间传递信息,无需使用FPN。对于小目标检测,这种方法效果显著。算法流程清晰,通过参考点和采样点的可学习位置,模型能直接与decoder attention关联,加快收敛。 在计算复杂度方面,Deformable DETR相较于原始DETR有所优化。具体复杂度对比可以参考公式[公式] 和 [公式]。若对内容有帮助,欢迎分享你的理解。 深入学习Deformable DETR,可以参考以下资源:科技猛兽:Vision Transformer详细解读
深入理解DETR系列中Deformable DETR视频教程
论文原文:arxiv.org/pdf/....
详解AFT(Attention Free Transformer )
Transformer中的自注意力机制曾因其复杂性而备受关注。Apple引领的创新,AFT(Attention Free Transformer)提出了一种突破性的计算方式,挑战了传统矩阵乘法在自注意力中的地位。AFT家族包括AFT-local(局部注意力)、AFT-simple和AFT-conv,每一个版本都在效率与复杂性之间寻求平衡。其中,AFT-full的精髓在于:首先,通过三个线性变换进行权值计算;接着,位置信息被巧妙地编码并归一化;然后,sigmoid激活和点乘操作赋予了模型新的动态;最后,权重加权赋予了模型决策的力量。尽管AFT-full的实现细节需要留意广播加法和矩阵乘法,但其精简的计算流程令人瞩目。
尽管AFT-full与Transformer在复杂度上保持一致,但位置编码的密集计算为优化提供了可能。AFT-local的创新在于它仅在局部范围内考虑位置信息,尽管计算量保持稳定,却能有效聚焦关键区域。AFT-simple进一步简化,摒弃了无关位置编码,类似于Linear Attention,以更纯粹的线性方式处理注意力。而AFT-conv更是将CNN特性与注意力结合,通过分组卷积实现多头注意力,代码如下:
class AFTConv(nn.Module): ... def __init__(self, heads, max_len, dim, hid_dim, window_size): ... self.wq = nn.Linear(dim, hid_dim * heads) self.wk = nn.Linear(dim, ...)
AFT通过参数化位置偏置,特别是1维卷积的重参数化(),赋予了模型更强的适应性和表现力。尽管表面看起来AFT似乎跳过了传统的注意力机制,实际上它通过矩阵逐元素乘法替代了原有方法,但速度优化并不简单。AFT-full、AFT-local、AFT-simple和AFT-conv模型的出现,是对参数w的精细调整,展现了AFT设计的巧妙和灵活性。然而,AFT的真正实力还需在大量实验中验证,揭示其在实际应用中的潜力和优势。
线性Attention的探索:Attention必须有个Softmax吗?
当前最流行的Attention机制当属 Scaled-Dot Attention,形式为:
在进行Attention之前,用两个[公式] 的矩阵 [公式] 分别对 [公式] 进行投影,即变为:
这样一来,[公式] 就只是一个 [公式] 的矩阵,而作者声称对于哪怕对于很大的序列长度n,m也可以保持为一个适中的常数,从而这种Attention也是线性的。
但是,本文介绍的几种Linear Attention都能做到这一点。以式[公式] 和式 [公式] 为例,如果要Mask掉未来信息,那么只需要把求和 [公式] 改为 [公式]:
实现上式有两种方式:第一方式是设[公式] 以及 [公式],我们有:
这说明这种Attention可以作为一个RNN模型用递归的方式实现,它的空间复杂度最低,但是要串性计算,适合预测解码时使用;第二种是直接将[公式] 做外积,得到一个 [公式] 的矩阵,然后对n那一维执行 [公式] 运算,这样就一次性得到 [公式] 了,它的速度最快,但空间占用最大,适合训练时使用。
相比于其他类似的改进结构的工作,这种修改能在把复杂度降到 [公式] 的同时,依然保留所有的“token-token“的注意力,同时还能保留用于做自回归生成的可能性。