本文经自动驾驶之心公众号授权转载,转载请联系出处。
原标题:Minuet: Accelerating 3D Sparse Convolutions on GPUs
论文链接:https://arxiv.org/pdf/2401.06145.pdf
代码链接:https://github.com/UofT-EcoSystem/Minuet
作者单位:多伦多大学 Vector Institute Amazon Meta Samsung AI Centre Toronto CentML
会议:EuroSys'24
论文思路:
稀疏卷积(Sparse Convolution) (SC) 广泛用于处理本质上稀疏的 3D 点云。与密集卷积不同,SC 通过仅允许输出到特定位置来保留输入点云的稀疏性。为了有效地计算 SC,现有的 SC 引擎(engines)首先使用哈希表来构建内核映射(kernel map),该映射存储要执行的必要的通用矩阵乘法(GEMM)操作 (Map 步骤),然后使用 Gather-GEMM-Scatter 过程来执行这些 GEMM 操作 (GMaS 步骤)。在这项工作中,本文分析了现有最先进的 SC 引擎的缺点,并提出了 Minuet,一种专为现代 GPU 量身定制的新型内存高效 SC 引擎。Minuet 提出 (i) 用一种新颖的分段排序双遍历二分搜索算法(segmented sorting double-traversed binary search algorithm) 替换 Map 步骤中使用的哈希表,该算法高度利用 GPU 的 on-chip 内存层次结构,(ii) 使用轻量级方案在 GMaS 步骤的 Gather 和 Scatter 操作中自动调整 tile 大小,以便使执行适应每个 SC 层、数据集和 GPU 架构的特定特征,以及 (iii) 采用填充高效的 GEMM 聚合方法(grouping approach),减少内存填充和内核启动开销。本文的评估表明,对于端到端点云网络执行,Minuet 的性能明显优于之前的 SC 引擎,平均性能提高 1.74 倍(最大 2.22 倍)。本文新颖的分段排序双遍历二分搜索算法在 Map 步骤中比之前的 SC 引擎平均实现了 15.8 倍(最大 26.8 倍)的卓越加速。
主要贡献:
本文研究了现有 SC 引擎的缺点,并提出了 Minuet,这是一种内存高效的引擎,可以加速现代 GPU 架构上的 SC 执行。
本文提出了一种新颖的分段排序双遍历二分搜索算法来在 SC 中构建内核映射。本文提出的算法高度利用了 GPU 的 on-chip 内存层次结构。本文还在 Gather 和 Scatter 操作中动态选择性能最佳的 tile 大小,并在对 GEMM 操作进行聚合(group)之前重新排序,以最大程度地减少不必要的数据访问和计算。
本文使用广泛的真实数据集、稀疏 3D 网络和 GPU 架构来评估 Minuet,并表明它在分层和端到端执行方面都显着优于先前的工作。Minuet 还在 SC 的 Map 步骤中提供了卓越的加速。
论文方法:
在这项工作中,本文使用各种点云网络、真实数据集和 GPU 架构来描述现有 SC 引擎 [8,9,43],并发现它们存在三个关键缺点。首先,他们使用哈希表(例如,cuckoo 哈希表 [1])来构建内核映射,其中存储必要的 GEMM 操作。然而,在哈希表中执行大量查询会导致不规则的数据访问,其中大部分由昂贵的GPU全局内存来服务,从而导致较高的数据访问成本。其次,最先进的 SC 引擎在 Gather 和 Scatter 操作中将 在 tiles 中的 SC 的多个输入/输出特征通道处理为一组连续的特征通道,以提高 GPU 内存吞吐量。然而,本文观察到他们总是采用单一的固定 tile 大小,这会导致性能不佳。在图 4 中,本文证明了性能最佳的 tile 大小取决于点云网络的每个特定 SC 层、真实数据集和 GPU 架构的特征。第三,在 GMaS 步骤中,现有的SC引擎执行与批处理方案中的多个权重偏移相对应的GEMM操作:它们通过用零值填充GEMM操作数将多个GEMM操作聚合在一起,即,它们在所有GEMM操作数中提供相同的大小,并且将它们作为单个批处理 GEMM 内核执行。通过这种方式,他们可以最大限度地减少 GPU 内核启动开销并提高 GPU 硬件利用率 [43]。然而,本文发现先前的 SC 引擎在 GMaS 步骤中按照 Map 步骤产生的顺序(即权重偏移的顺序)将 GEMM 操作聚合。这种方法会导致高填充开销(第3节),即添加大量零值,从而产生许多冗余数据访问和计算。
为了解决上述问题,本文提出了 Minuet,这是一种专为现代 GPU 量身定制的新型内存高效 SC 引擎。Minuet 高度利用 GPU 的 on-chip 内存层次结构,使 SC 执行适应输入数据集和 GPU 架构的特点,减少不必要的数据访问和计算。在 Map 步骤中,本文挑战了基于哈希表的搜索比 GPU 上的二分搜索性能优越的普遍观念 [1, 2],并提出了一种基于二分搜索的创新算法,专门用于在现代 GPU 架构上的 SC 的 Map 步骤中构建内核映射。本文利用在执行排序查询时,二分搜索实现高系统效率的关键观察结果,利用连续排序查询之间的数据局部性,并提出分段排序双遍历二分搜索算法(segmented sorting double-traversed binary search algorithm)。
本文提出的 SC 算法可以实现与基于哈希表的搜索类似的理论计算复杂度(第 5.1.3 节),并提供显着更高的内存效率,提高 GPU on-chip caches 的命中率(图 16b)。在GMaS执行步骤中,Minuet提供了两种优化。首先,本文在每次 Gather 和 Scatter 操作中即时调整用于处理多个输入/输出特征通道的 tile 大小。这项关键技术使 Minuet 能够使 SC 执行适应点云网络、真实数据集和 GPU 架构中每个 SC 层的特定特征,从而在 Gather 和 Scatter 操作中提供高系统性能。其次,Minuet 集成了一种填充高效的 GEMM 聚合策略,该策略首先根据输入/输出特征向量的大小对 GEMM 操作进行重新排序,然后将 GEMM 操作聚合到批量的 GEMM 内核启动中。通过这种方式,Minuet 可以优化 (i) 零值填充量,从而最大限度地减少对 GEMM 内核中无用数据的不必要的数据访问和计算,以及 (ii) GEMM 内核启动(kernel launch) 开销。
本文使用各种 3D 点云网络、真实数据集和 GPU 架构对 Minuet 进行了广泛评估,并证明 Minuet 显着优于之前的作品。与最先进的 SC 引擎相比,Minuet 的端到端性能平均提高了 1.74 倍(最高 2.22 倍),并且在 Map 步骤比之前的 SC 引擎实现了平均 15.8 倍的卓越加速(最高 26.8倍),在 GMaS 步骤中平均提高 1.39倍(最高 2.38倍)。
图 6.Minuet 的高层概述。
图 1. 密集卷积与稀疏卷积。
图 2. SC 执行可以分为两个步骤。为了简单起见,本文使用二维坐标进行说明。
图 5. 在 SC 中执行 GEMM 操作的各种方法,其中一个蓝色和白色方块分别表示一个实际输入特征向量和一个零填充特征向量。假设 𝑥 和𝑦 分别是填充特征向量和实际输入特征向量的数量,则填充开销定义为(𝑥/𝑦)。
图 7. 随机遍历查询时执行四个查询的二分搜索示例(即未排序查询(左)与排序查询方法(右))。
图 8. 完整查询排序(顶部)和分段查询排序(底部)的示例。绿色实心框代表在 GPU 全局内存中具体化的(materialized)数组。绿色虚线框表示未在内存中具体化的(materialized)数组,它们的值是即时计算的。
图 9. 优化相邻 SC 层中权重偏移和输出坐标的排序开销。
图 10. 当对已排序源数组中的排序查询段执行二分搜索时(表示为二叉搜索树 ),使用反向二分搜索查找查询数组段中 pivot 的下界以减少比较次数的示例。
图 11. 双重遍历二分搜索执行步骤。
实验结果:
总结:
Minuet 是一款高效 SC 引擎,可在 GPU 上加速 3D 点云网络。Minuet 高度利用 GPU on-chip 内存层次结构,提高执行并行性和元数据成本,并减少 SC 执行时不必要的数据访问和计算。本文的评估表明,在各种稀疏点云网络、数据集和 GPU 架构中,Minuet 在端到端执行时的平均加速明显优于之前最先进的 SC 引擎 1.74 倍。本文的结论是 Minuet 是一种专为现代 GPU 量身定制的新型内存高效 SC 引擎,并希望本文的工作能够鼓励对点云网络和其他稀疏深度学习网络的进一步全面研究和优化策略。
原文链接:https://mp.weixin.qq.com/s/0K-LUMnQZ8fovouJiqkflw