随着自动驾驶和智能机器人技术的发展,准确可靠的3D目标检测变得至关重要。点云数据通常由激光雷达(LiDAR)获取,具有稀疏性和不均匀分布的特点,这使得处理和理解这些数据变得复杂。现有的基于窗口的Transformer在捕捉上下文信息方面表现良好,但由于点云的稀疏性,导致每个窗口中的体素数量存在显著差异。这种差异使得现有方法需要对窗口内的体素进行分组和填充,增加了计算和内存开销。为了解决这些问题,本文提出了一种新的架构——ScatterFormer。其核心模块是散布线性注意力(Scattered Linear Attention),旨在直接对场景中的体素序列应用注意力机制,而无需将体素组织成固定长度的序列。这种方法不仅提高了计算效率,还减少了不必要的内存分配和排列操作。ScatterFormer在公开数据集Waymo和NuScenes上均取得了SOTA(State of the Art)的效果,性能优于HEDNet和DSVT。同时,ScatterFormer在A100显卡上能够达到23FPS的运行速度,显示了其在实际应用中的潜力和优势。
ScatterFormer的出发点在于,是否可以将场景体素视为一个长序列,然后对该序列的不同体素段(segment)采用独立的注意力计算?ScatterFormer的核心模块是散布线性注意力(Scattered Linear Attention),它直接对场景中的体素序列应用注意力机制,而无需将体素组织成固定长度的序列。
散布线性注意力(Scattered Linear Attention)
散布操作大致可以描述为基于给定的“组索引”对张量进行归约操作,具体可参考
https://github.com/rusty1s/pytorch_scatter
。ScatterFormer将这一形式拓展到Attention的计算上,并借助线性注意力(Linear Attention)的Softmax-free性质,提出一种散布线性注意力(Scattered Linear Attention),用于高效处理非均匀分段序列。
在GPU上的实现
:受到FlashAttention的启发,Scattered Linear Attention采用分块矩阵乘法来实现。首先会将体素序列切成固定大学的矩阵块,这些矩阵块会被事先放入GPU的共享内存中。GPU会为每一个窗口分配一只线程,该线程会快速遍历属于该窗口的矩阵快,累加
以获得每个窗口的hidden state matrix。对于输出特征,GPU则是为每个矩阵块分配一只线程,将query矩阵与所对于的hidden state matrix进行乘法计算。
速度和内存开销
:作者采用Triton来实现Scattered Linear Attention。具体代码放在
https://github.com/skyhehe123/ScatterFormer/blob/master/pcdet/models/model_utils/scatterformer_utils.py
。同时作者也比较了基于分块计算和基于torch_scatter的逐点计算在不同数量体素上的延迟和内存开销。由于每个矩阵块的计算都是并行触发, 所以该模块的延迟增长稳定,内存与窗口中的体素数量呈线性关系。在A100 GPU上,Scattered Linear Attention在处理十万体素量级的计算时,能够在1毫秒内完成。