1.理解MobileNetV2
2.retinanet 网络详解
3.[转]Megatron-LM源码系列(八): Context Parallel并行
4.mmdetection源码阅读笔记:ResNet
5.PyTorch 源码分析(三):torch.nn.Norm类算子
理解MobileNetV2
和MobielNetV1相比,交交易 MobileNet V2 仍使用深度可分离卷积,易所源码但其主要构成模块如下图1所示:
这次block中有三个卷积层,所完作者分别将其称之为1 x 1 expansion layer、整源3 x 3 depthwise convolution和1 x 1 projection layer。交交易后两层其实就是易所源码东城区效果好的源码出售V1中的depthwise convolution和1×1 pointwise convolution layer,只不过在V2中,所完作者后者称为1 x 1 projection layer,整源并有不同的交交易作用。下面就来看看,易所源码两者的所完差异究竟在哪里。
在V1中,整源逐点卷积要么使通道数保持不变,交交易要么使通道数翻倍。易所源码 在V2中,所完情况恰恰相反:它使通道数变小。 这就是为什么现在将该层称为投影层( Projection Layer)的原因:它将具有大量维(通道)的数据投影到具有较少维数的张量中。
例如,depthwise convolution可以在具有个通道的张量上工作,然后projection layer张量缩小至个通道。这种层也称为bottleneck layer,因为它减少了流经网络的数据量。(这就体现了“bottleneck residual block”名称的一部分:每个块的输出都是瓶颈。)
此外,bottleneck residual block的第一层是新出现的,也就是expansion layer。 它也是1×1卷积, 其目的是在数据进入深度卷积之前扩展数据中的通道数。 因此,expansion layer始终具有比输入通道更多的输出通道(与projection layer相反)。
Expansion layer将通道数扩展多少倍,这个由扩展因子(expansion factor)给出。贝塔系数源码公式 这也是调整不同架构的超参数之一, 默认扩展因子为6。
例如图2所示,如果有一个具有个通道的张量进入一个bottleneck residual block,则expansion layer首先将其转换为具有 x 6 = 个通道的新张量。 接下来,depthwise convolution将其滤波器应用于该通道张量。 最后,projection layer将个过滤后的通道投影回较小的数量,比如说个。
因此,bottleneck residual block的输入和输出是低维张量,而block内发生的滤波步骤是在高维张量上完成的。
思考一下,这样做的好处是什么?
Bottleneck residual block体现了其还存在另一部分,那就是逆残差连接(inverted residual connection),这也是MobileNetV2与MobileNetV1的不同之处。就像在ResNet中一样,它的存在是为了帮助梯度流过网络。只有当进入block的通道数与从block出来的通道数相同时(如图2),才使用inverted residual connection,但并非总是如此,因为每隔几个块输出通道就增加一次。
一般来说,每个层都有批量归一化,激活层则是ReLU6。 但是,projection layer的输出没有应用激活功能。作者发现,在该层之后使用非线性激活,实际上会破坏低维数据中有用的T字战法源码信息。
这样,MobileNet V2将连续包含个这样的block,然后是规则的1×1卷积、全局平均池化层和分类层。
注意:第一个block稍有不同,它使用具有个通道的常规3×3卷积代替扩展层。
具体架构也可见下表。t是扩展因子,c是输出通道数,n是block的重复次数,s是步长,depthwise convolution的卷积核大小均为3 x 3。
V2体系结构的主要变化是残差连接和扩展/投影层。
对于这种模型,通道数随时间增加,空间尺寸也会相应减少。 但总体而言,由于构成块之间连接的瓶颈层,张量保持相对较小,。如图3所示,我们可以看到数据流经V2网络的情况。
相比之下,V1就使其张量变得更大(最大为7×7×)。
使用低维张量是减少计算量的关键。 毕竟,张量越小,卷积层要做的乘法就越少。
但是,仅使用低维张量并不能获得很好的效果!
因为应用卷积层过滤低维张量将无法提取大量信息。风口形成源码 考虑到这个因素,作者首先使用了expansion layer,得到大张量,s使用depthwise convolution对数据进行过滤;然后使用projection layer减小张量。可以说在这方面, MobileNet V2的模块设计做到了两全其美。
举例如图4所示,将块之间流动的低维数据视为真实数据的压缩包。Expansion layer充当解压缩器,它首先将数据还原为完整格式,然后depthwise layer执行重要的滤波工作,最后projection layer将数据压缩以使其再次变小 。
通过学习扩展层和投影层的参数,模型能够在网络的每个阶段最佳地(解)压缩数据。
至此,我们也就能理解,为什么作者将文中的残差连接方式称为“inverted residuals”,我们可以比较一下normal和inverted残差块的区别,如图5所示。
图5中,使用阴影线标记的block后面没有非线性层,通过每个block的宽度来表示相对通道数量。
我们首先从学习的参数和所需的计算量开始,比较MobileNet V1和V2模型的大小。
数据来源于 V1和 V2,它们采用的width multiplier均为1.0,数据越小代表效果越好。
MACs是乘法累加运算,这可测量对单张× RGB图像进行推理所需的计算量。图像越大,需要的微盘源码2022MAC越多。
仅从MAC数量来看,V2的速度应该几乎是V1的两倍。 但是,这不仅仅涉及计算数量。 在移动设备上,内存访问比计算慢得多。 不过,这里V2也有优势:它的参数量只有V1的%。
接下来是准确率的比较。
这里的Top-1 Accuracy和Top-5 Accuracy是在 ImageNet上获得的, 源代码作者声称结果来自与测试集,但查看代码后,结果似乎是从,张图像的验证集上获得的。
其实,比较模型之间的准确度可能会产生误导,因为我们需要准确了解模型的评估方式。 为了获得上述数字,将图像的中心区域裁剪到包含原始图像的.5%的区域,然后将该裁剪的大小调整为×像素。
为了验证V1和V2在语义分割方面的能力,作者选用了PASCAL VOC dataset用来验证,(1)V1和V2分别作为DeepLabv3的特征提取器,(2)简化了DeepLabv3训练头,来加快计算,(3)使用了不同的推理策略来优化运行效果。验证的结果如下表所示。
我们能够得到以下分析结果:
(1)某些推理策略,比如多尺度输入、增加左右翻转的图像,会极大增加乘法累加量,因此不适合于移动设备的应用;
(2)使用output stride = 的效率要比output stride = 8的效率高;
(3)MobileNetV1已经是强大的功能提取器,其所需的乘法累加量比ResNet- 少4.9-5.7倍;
(4)在MobileNetV2的倒数第二个特征图后构建DeepLabv3训练头的效率更高,因为倒数第二个特征图包含个通道,而不是个。因此,在获得类似性能的情况下,但是MobileNetV2所需的运算量比MobileNetV1少2.5倍。
(5)DeepLabv3原先的分割头十分消耗计算力,若删除ASPP模块能够显著降低计算量,但性能只会略微下降。
retinanet 网络详解
主干网络采用ResNet作为backbone。
FPN层:输入照片尺寸为x,经过池化层后,通过ResNet网络提取特征,得到四个不同尺度的特征图,分别为layer1, layer2, layer3, layer4。源代码中的尺度融合从layer2层开始,经过尺度融合后得到f3, f4, f5, f6, f7五个不同尺度的特征层。
一、Focal Loss:Retinanet网络的核心是Focal Loss,它在精度上超越了two-stage网络的精度,在速度上超越了one-stage网络的速度,首次实现了对二阶段网络的全面超越。
Focal Loss是在二分类交叉熵的基础上进行修改,首先回顾一下二分类交叉熵损失。在训练过程中,正样本所占的损失权重较大,负样本所占的损失权重较小。然而,由于负样本的数量较多,即使权重较小,但大量样本数量叠加后同样带来很大的损失,导致在训练迭代过程中难以优化到最优状态。因此,Focal Loss在此基础上进行了改进。
Focal Loss损失:论文中指出gamma=2.0, alpha=0.。当预测样本为简单正样本时,假设p=0.9,(1-p)的gamma次方会变得很小,因此损失函数值会变得非常小。对于负样本而言,当预测概率为0.5时,损失只减少0.倍,因此损失函数更加关注这类难以区分的样本。
二、源代码讲解:model.py、anchors.py、losses.py、dataloader.py、train.py以上部分均为个人理解,如有错误欢迎各位批评指正。
目前已实现口罩数据集检测,效果如下:
[转]Megatron-LM源码系列(八): Context Parallel并行
原文链接: Megatron-LM源码系列(八): Context Parallel并行
Context Parallel并行(CP)与sequence并行(SP)相比,核心差异在于SP只针对Layernorm和Dropout输出的activation在sequence维度进行切分,而CP则进一步扩展,对所有input输入和所有输出activation在sequence维度上进行切分,形成更高效的并行处理策略。除了Attention模块外,其他如Layernorm、Dropout等模块在CP并行中无需任何修改,因为它们在处理过程中没有涉及多token间的交互。
Attention模块之所以特殊,是因为在计算过程中,每个token的查询(query)需要与同一sequence中其他token的键(key)和值(value)进行交互计算,存在内在依赖性。因此,在进行CP并行时,计算开始前需要通过allgather通信手段获取所有token的KV向量,反向计算时则通过reduce_scatter分发gradient梯度。
为了降低显存使用,前向计算阶段每个GPU仅保存部分KV块,反向阶段则通过allgather通信获取全部KV数据。这些通信操作在特定的rank位置(相同TP组内)进行,底层通过send和recv等操作实现allgather和reduce_scatter。
以TP2-CP2的transformer网络为例,CP并行的通信操作在Attention之前执行,其他则为TP通信。AG表示allgather,RS表示reduce_scatter,AG/RS表示前向allgather反向reduce_scatter,RS/AG表示前向reduce_scatter反向allgather。
TP2对应为[GPU0, GPU1], [GPU2, GPU3],CP2指的就是TP组相同位置的rank号,即[GPU0, GPU2], [GPU1, GPU3]。CP并行类似于Ring Attention,但提供了OSS与FlashAttention版本,并去除了冗余的low-triangle causal masking计算。
LLM常因序列长度过长而导致显存耗尽(OOM)。传统解决方法包括重计算或扩大TP(tensor parallel)大小,但各自存在计算代价增加或线性fc计算时间减少与通信难以掩盖的问题。CP则能更高效地解决这一问题,每个GPU处理一部分序列,同时减少CP倍的通信和计算量,同时保持TP不变,使得activation量也减少CP倍。性能优化结果展示于图表中,用户可通过指定--context-parallel-size在Megatron中实现CP。
具体源码实现以Megatron-Core 0.5.0版本为例进行说明。
参考资料:
mmdetection源码阅读笔记:ResNet
ResNet,作为mmdetection中backbone的基石,其重要性不言而喻,它是人工智能领域引用最频繁的论文之一,微软亚洲研究院的杰作。自年提出以来,ResNet一直是目标检测领域最流行的backbone之一,其核心是通过残差结构实现更深的网络,解决深度网络退化的问题。
ResNet的基本原理是利用残差结构,通过1×1、3×3和1×1的卷积单元,如BasicBlock和BottleneckBlock,来构建不同版本的网络,如resnet-到resnet-,它们在基本单元和层数上有所区别。在mmdetection的实现中,从conv2到conv5主要由res_layer构成,其中下采样策略是关键,不同版本的网络在layer1之后的下采样位置有所不同。
ResLayer的构造函数是理解mmdetection中ResNet的关键,它涉及内存优化技术,如torch.utils.checkpoint,通过控制函数的运行方式来节省内存,但可能增加反向传播计算时间。此外,对norm层的处理也体现了与torchvision预训练模型的兼容性。
最后,ResNet的make_stage_plugins方法允许在核心结构中插入拓展组件,这增加了模型的灵活性。总的来说,ResNet的源码阅读揭示了其设计的巧妙和灵活性,是理解深度学习模型架构的重要一步。
PyTorch 源码分析(三):torch.nn.Norm类算子
PyTorch源码详解(三):torch.nn.Norm类算子深入解析
Norm类算子在PyTorch中扮演着关键角色,它们包括BN(BatchNorm)、LayerNorm和InstanceNorm。1. BN/LayerNorm/InstanceNorm详解
BatchNorm(BN)的核心功能是对每个通道(C通道)的数据进行标准化,确保数据在每个批次后保持一致的尺度。它通过学习得到的gamma和beta参数进行缩放和平移,保持输入和输出形状一致,同时让数据分布更加稳定。 gamma和beta作为动态调整权重的参数,它们在BN的学习过程中起到至关重要的作用。2. Norm算子源码分析
继承关系:Norm类在PyTorch中具有清晰的继承结构,子类如BatchNorm和InstanceNorm分别继承了其特有的功能。
BN与InstanceNorm实现:在Python代码中,BatchNorm和InstanceNorm的实例化和计算逻辑都包含对输入数据的2D转换,即将其分割为M*N的矩阵。
计算过程:在计算过程中,首先计算每个通道的均值和方差,这是这些标准化方法的基础步骤。
C++侧的源码洞察
C++实现中,对于BatchNorm和LayerNorm,代码着重于处理数据的标准化操作,同时确保线程安全,通过高效的数据视图和线程视图处理来提高性能。