NPU 3DGS Ascend C Precise Intersection算子优化【免费下载链接】cann-recipes-spatial-intelligence本项目针对空间智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-spatial-intelligenceOutlineHighLightsPrecise Intersection算法Precise Intersection算子Tiling设计Vector-MTE流水并行优化高斯球坐标初筛优化掩码过滤优化计算优化性能实验CitationHighlightsPrecise Intersection算子用于计算高斯球-像素块映射关系基于FlashGS算法实现具有以下特点和优势充分利用硬件特性实现计算与搬运流水并行发挥Ascendc硬件优势充分利用AscendC语言特性优化计算流程减少重复计算提升算子性能降低渲染耗时加速3DGS-Splat训练和推理速度Precise Intersection算法3DGS溅射算法主要包含预处理、排序和渲染等步骤。其中经过预处理操作后高斯球的均值与协方差矩阵等由3D球面投影到了2D平面为了对高斯球进行排序需要根据高斯球的2D均值、2D协方差矩阵等属性建立高斯球与像素块之间的映射关系即相交情况。假设图像被切分成M个像素块每个像素块的边长为tileSize传统的高斯球-像素块映射关系计算基于以下原理实现通常高斯球在2D平面的投影为椭圆形假定椭圆的长半径为Radii则传统的高斯球-像素块映射以下简称为GS确定了以高斯球投影中心点为圆心以Radii为半径的圆形从而获得该圆形的正切边界框。如果像素块m与边界框有相交面积则认为高斯球与m相交。所有与m相交的高斯球都会进行排序确定该高斯球对m像素块的贡献程度并参与该像素块的渲染。然而由于高斯球的2D平面投影为椭圆形因此使用正切四边形计算高斯球-像素块映射关系的GS算法可能把没有与像素块重叠的高斯球加入排序与渲染导致计算量增大渲染效率降低。Precise Intersection算法对GS算法进行了优化提高了3DGS渲染速度减少内存开销。与GS算法相比Precise Intersection算法的优化点主要包含使用与高斯球2D投影椭圆相切的矩形边界框判断像素块与高斯球的相交关系如下图所示Precise Intersection算法的矩形边界框表示比正方形边界框表示更加精准。对于与边界框重合的像素块判断该像素块是否与椭圆相交。为了降低求解相交问题二次方程的计算成本Precise Intersection算法将相交问题转化为判断椭圆在边界框上的投影是否与边界框重叠。下图为Precise Intersection算法的原理实现可以看出Precise Intersection算法对于高斯球边界框的计算更为精确且增加了更多相交判断将没有真正与像素块相交的高斯球剔除到了该像素块的高斯球排序和渲染范围之外减少了计算量。Precise Intersection算法的计算流程可拆解为以下步骤假设输入高斯球的批次大小为batchSize相机数量为cameraView高斯球数量为N像素块数量为M则每个像素块都需要与全部的高斯球进行映射关系计算。对每个像素块计算全部高斯球相切矩形边界框的顶点坐标判断全部高斯球边界框是否与像素块相交计算结果表示为掩码mask判断全部高斯球中心点坐标是否在像素块范围内计算结果表示为掩码centerFlag判断像素块边界是否与高斯球投影相交计算结果表示为掩码intersectFlag三个掩码进行与或操作获得该像素块与高斯球最终的映射关系掩码Precise Intersection算子Tiling设计Ascendc算子在计算时利用片上UB暂时存储计算数据由于UB空间有限因此计算过程需要进行切块。UB存储空间是否被充分利用决定了算力利用程度及计算效率。本节阐述了Precise Intersection算子的Tiling设计如何充分利用UB存储空间高效实现核内计算。Tiling设计包含分核与切块两部分设计。分核设计分核是指如何将计算任务分配到每个AICore上让每个AICore并行计算不同的任务。AICore中包含Cube核与Vector核Precise Intersection算子仅使用了Vector核。Precise Intersection算子将像素块的个数M作为总任务数进行分核。假设NPU的Vector核总数为blockDim个则每个Vector核上平均会分配M/blockDim个像素块映射任务。由于M与blockDim不一定为倍数关系所以Precise Intersection算子进一步使用了大小核分核策略前n个Vector核计算K个任务后blockDim-n个Vector核计算K-1个任务如下图所示切块设计由于在分核时将像素块数量作为总任务分配给AICore因此需要对高斯球进行切块设计将高斯球分块搬入UB并与每个核上的像素块分别进行计算计算完成后搬出UB。算子Tiling设计将UB的85%作为高斯球搬入、搬出、分块计算的区域剩余的15%用于临时Buffer存储计算API的临时结果如下图所示采用这样的切块设计一次切块计算的高斯球数量为2.62K。Vector-MTE流水并行优化通常AscendC算子核内计算的流程为将分块数据从GM上搬运到UB中此时需设置Vector等待MTE2的流水同步当同步信号完成后Vector确定MTE2的搬运完成才能开始进行计算否则会因搬运数据未完成导致计算出错。Vector核进行计算此时需设置MTE3等待Vector的流水同步当同步信号完成后MTE3才能将UB上的计算结果搬出到GM上。将计算结果从UB中搬运到GM上此时需等待MTE2等待MTE3的流水同步当同步信号完成后重复1-3步骤。下图为核内计算流水的示意图可以看出上述计算流程没有进行流水并行MTE2、Vector和MTE3为线性工作Precise Intersection算子所计算的像素块数量通常较多高斯球数量在10万~100万如果采用这样的线性流水将会浪费许多时间降低算力效率。为了降低算子耗时开销充分利用昇腾硬件特性Precise Intersection算子对流水进行了并行优化如下示意图所示优化点主要包含当前分块计算完成后MTE3搬出计算结果。由于MTE搬出的数据与下一分块计算的数据是独立的因此MTE3搬出与下一分块计算并行减少一次流水同步开销。若当前分块计算是高斯球对Vector核上最后一个像素块进行映射计算则在当前分块计算过程中同步搬入下一次分块计算所需的高斯球数据使下一次分块计算的Vector核不必等待MTE2的流水同步减少一次流水同步开销。对mipnerf360_v2数据集中的garden场景进行测试流水并行优化带来的开销收益如下表所示优化方法前向device耗时(ms)收益比例无优化4.550-搬出并行4.2167.9%搬出并行 搬入并行3.9486.8%与流水并行之前相比总体开销收益为15.2%。计算优化从Precise Intersection算法计算步骤的介绍中可以看出尽管每个高斯球都需要对全部的像素块计算映射关系但高斯球本身的属性如2D投影坐标、协方差逆矩阵和不透明度是不变的因此如果在每一次分块计算时都搬入对应的高斯球数据那么会增加不必要的搬入耗时。因此在流水并行优化的基础上进一步对计算进行了拆解将Precise Intersection的计算过程拆解为高斯球相关特征计算如计算高斯球的边界框、不透明度对数和高斯球-像素块映射关系计算分块计算过程中首先完成高斯球相关特征计算然后对每个像素块进行映射关系计算减少搬入核计算耗时开销。拆解后的算子流水示意图如下此外在计算过程中我们还基于AscendC编译器特性、昇腾硬件特点对计算过程进行了优化。算子的计算步骤有时存在依赖需要获取上一步的计算结果后再进行下一步的计算。AscendC编译器会根据代码自动判断是否存在依赖并在可能存在依赖的代码之间自动插入Vector流水同步。因此我们对计算过程进行了调整尽量减少上下文之间的依赖例如Precise Intersection算子在计算边界框时的公式为 $$ w \lfloor(\sqrt{2 * cov_{00} * power} 1)\rfloor $$ $$ h \lfloor(\sqrt{2 * cov_{11} * power} 1)\rfloor $$ 常规的计算步骤为依次计算$w$和$h$但在AscendC算子中可以同步计算公式中相同或相近的部分 $$ step1: w_0 2 * cov_{00} * power, h_0 2 * cov_{11} * power $$ $$ step2: w_1 \sqrt{w_0} 1, h_1 \sqrt{h_0} 1 $$ $$ step3: w \lfloor w_1 \rfloor, h \lfloor h_1 \rfloor $$这类计算优化能够进一步减少算子开销提升Precise Intersection算子的性能。对mipnerf360_v2数据集中的garden场景进行测试计算优化带来的开销收益如下表所示优化方法前向device耗时(ms)收益比例流水并行优化3.948-流水并行 计算拆解3.26021.1%流水并行 计算拆解 计算过程调整3.1164.6%与计算优化之前相比总体开销收益为26.7%。高斯球坐标初筛优化由于算子对像素块数量M分核因此每个核上分到的像素块纵坐标最小值Y_min和纵坐标最大值Y_max是不完全重叠的。假设图像尺寸为(144, 1440)每个像素块的尺寸为(32, 32)则总像素块数量为160个第1个核分配4个像素块对应像素块的纵坐标范围是[0, 36]第2个核分配4个像素块对应像素块的纵坐标范围是[36, 72]...依此类推。因此在进行相交关系计算之前每个核可以通过对高斯球在图像中的位置进行高斯球坐标初筛初步过滤相切矩形Y坐标不在当前核Y值范围的高斯球减少后续相交关系计算量。以mipnerf360_v2数据集中Bicycle场景为例在不进行高斯球坐标初筛的情况下每个像素块需要对高斯球进行多次切块计算。高斯球坐标初筛不涉及像素块可以过滤约90%的高斯球因此在后续计算像素块-高斯球相交关系时只需循环2-3次即可完成大大减少了循环次数。掩码过滤优化高斯球坐标初筛时算子将高斯球坐标初筛后的高斯球属性及索引保存在中间变量中。在计算mask时输入不再是原始的高斯球属性而是高斯球坐标初筛的结果类似地在mask计算时算子将掩码过滤后的高斯球属性和索引进行保存centerFlag和intersectFlag的输入是mask的掩码过滤结果输出是centerFlag | intersectFlag的掩码过滤结果。这样每一轮的计算都可以仅保留有效高斯球的信息避免重复冗余开销。高斯球坐标初筛和掩码过滤优化进一步提升了算子性能对mipnerf360_v2数据集中的场景采样进行对比测试高斯球坐标初筛和掩码过滤带来的开销收益如下表所示注意“优化方法”中的“基线方法”指应用了流水并行和计算优化的Precise Intersection算法“过滤优化”指在基线方法基础上应用高斯球坐标初筛和掩码过滤优化的Precise Intersection算法。高斯球数量像素块数量优化方法前向device耗时(ms)收益比例20w425基线方法过滤优化0.6560.59310.7%40w425基线方法过滤优化1.0390.91114.0%60w425基线方法过滤优化1.2701.2134.7%80w425基线方法过滤优化1.6101.41413.9%100w425基线方法过滤优化1.9921.66319.8%140w425基线方法过滤优化2.9862.31329.1%170w425基线方法过滤优化3.2182.53427.0%200w425基线方法过滤优化3.9153.99530.3%300w425基线方法过滤优化5.4624.55819.8%与优化之前相比总体开销收益为18.8%。性能实验Precise Intersection算法采用比原始GS算法更加精确的相交判断算法实现了快速高效过滤高斯球的功能。通过对mipnerf360_v2数据集中的场景进行测试可以看出Precise Intersection算法能够比GS算法剔除更多的高斯球从而使渲染耗时降低、渲染速度加快。高斯球数量像素块数量映射关系计算方法渲染前向device耗时(ms)20w425GSPrecise Intersection8.9556.67140w425GSPrecise Intersection17.49913.017100w425GSPrecise Intersection35.95722.8807w1107GSPrecise Intersection7.7834.86314w1107GSPrecise Intersection15.3849.48928w1107GSPrecise Intersection25.31115.493Citationmisc{feng2024flashgsefficient3dgaussian, title{FlashGS: Efficient 3D Gaussian Splatting for Large-scale and High-resolution Rendering}, author{Guofeng Feng and Siyan Chen and Rong Fu and Zimu Liao and Yi Wang and Tao Liu and Zhilin Pei and Hengjie Li and Xingcheng Zhang and Bo Dai}, year{2024}, eprint{2408.07967}, archivePrefix{arXiv}, primaryClass{cs.CV}, url{https://arxiv.org/abs/2408.07967}, }【免费下载链接】cann-recipes-spatial-intelligence本项目针对空间智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-spatial-intelligence创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN 3DGS精确相交优化
NPU 3DGS Ascend C Precise Intersection算子优化【免费下载链接】cann-recipes-spatial-intelligence本项目针对空间智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-spatial-intelligenceOutlineHighLightsPrecise Intersection算法Precise Intersection算子Tiling设计Vector-MTE流水并行优化高斯球坐标初筛优化掩码过滤优化计算优化性能实验CitationHighlightsPrecise Intersection算子用于计算高斯球-像素块映射关系基于FlashGS算法实现具有以下特点和优势充分利用硬件特性实现计算与搬运流水并行发挥Ascendc硬件优势充分利用AscendC语言特性优化计算流程减少重复计算提升算子性能降低渲染耗时加速3DGS-Splat训练和推理速度Precise Intersection算法3DGS溅射算法主要包含预处理、排序和渲染等步骤。其中经过预处理操作后高斯球的均值与协方差矩阵等由3D球面投影到了2D平面为了对高斯球进行排序需要根据高斯球的2D均值、2D协方差矩阵等属性建立高斯球与像素块之间的映射关系即相交情况。假设图像被切分成M个像素块每个像素块的边长为tileSize传统的高斯球-像素块映射关系计算基于以下原理实现通常高斯球在2D平面的投影为椭圆形假定椭圆的长半径为Radii则传统的高斯球-像素块映射以下简称为GS确定了以高斯球投影中心点为圆心以Radii为半径的圆形从而获得该圆形的正切边界框。如果像素块m与边界框有相交面积则认为高斯球与m相交。所有与m相交的高斯球都会进行排序确定该高斯球对m像素块的贡献程度并参与该像素块的渲染。然而由于高斯球的2D平面投影为椭圆形因此使用正切四边形计算高斯球-像素块映射关系的GS算法可能把没有与像素块重叠的高斯球加入排序与渲染导致计算量增大渲染效率降低。Precise Intersection算法对GS算法进行了优化提高了3DGS渲染速度减少内存开销。与GS算法相比Precise Intersection算法的优化点主要包含使用与高斯球2D投影椭圆相切的矩形边界框判断像素块与高斯球的相交关系如下图所示Precise Intersection算法的矩形边界框表示比正方形边界框表示更加精准。对于与边界框重合的像素块判断该像素块是否与椭圆相交。为了降低求解相交问题二次方程的计算成本Precise Intersection算法将相交问题转化为判断椭圆在边界框上的投影是否与边界框重叠。下图为Precise Intersection算法的原理实现可以看出Precise Intersection算法对于高斯球边界框的计算更为精确且增加了更多相交判断将没有真正与像素块相交的高斯球剔除到了该像素块的高斯球排序和渲染范围之外减少了计算量。Precise Intersection算法的计算流程可拆解为以下步骤假设输入高斯球的批次大小为batchSize相机数量为cameraView高斯球数量为N像素块数量为M则每个像素块都需要与全部的高斯球进行映射关系计算。对每个像素块计算全部高斯球相切矩形边界框的顶点坐标判断全部高斯球边界框是否与像素块相交计算结果表示为掩码mask判断全部高斯球中心点坐标是否在像素块范围内计算结果表示为掩码centerFlag判断像素块边界是否与高斯球投影相交计算结果表示为掩码intersectFlag三个掩码进行与或操作获得该像素块与高斯球最终的映射关系掩码Precise Intersection算子Tiling设计Ascendc算子在计算时利用片上UB暂时存储计算数据由于UB空间有限因此计算过程需要进行切块。UB存储空间是否被充分利用决定了算力利用程度及计算效率。本节阐述了Precise Intersection算子的Tiling设计如何充分利用UB存储空间高效实现核内计算。Tiling设计包含分核与切块两部分设计。分核设计分核是指如何将计算任务分配到每个AICore上让每个AICore并行计算不同的任务。AICore中包含Cube核与Vector核Precise Intersection算子仅使用了Vector核。Precise Intersection算子将像素块的个数M作为总任务数进行分核。假设NPU的Vector核总数为blockDim个则每个Vector核上平均会分配M/blockDim个像素块映射任务。由于M与blockDim不一定为倍数关系所以Precise Intersection算子进一步使用了大小核分核策略前n个Vector核计算K个任务后blockDim-n个Vector核计算K-1个任务如下图所示切块设计由于在分核时将像素块数量作为总任务分配给AICore因此需要对高斯球进行切块设计将高斯球分块搬入UB并与每个核上的像素块分别进行计算计算完成后搬出UB。算子Tiling设计将UB的85%作为高斯球搬入、搬出、分块计算的区域剩余的15%用于临时Buffer存储计算API的临时结果如下图所示采用这样的切块设计一次切块计算的高斯球数量为2.62K。Vector-MTE流水并行优化通常AscendC算子核内计算的流程为将分块数据从GM上搬运到UB中此时需设置Vector等待MTE2的流水同步当同步信号完成后Vector确定MTE2的搬运完成才能开始进行计算否则会因搬运数据未完成导致计算出错。Vector核进行计算此时需设置MTE3等待Vector的流水同步当同步信号完成后MTE3才能将UB上的计算结果搬出到GM上。将计算结果从UB中搬运到GM上此时需等待MTE2等待MTE3的流水同步当同步信号完成后重复1-3步骤。下图为核内计算流水的示意图可以看出上述计算流程没有进行流水并行MTE2、Vector和MTE3为线性工作Precise Intersection算子所计算的像素块数量通常较多高斯球数量在10万~100万如果采用这样的线性流水将会浪费许多时间降低算力效率。为了降低算子耗时开销充分利用昇腾硬件特性Precise Intersection算子对流水进行了并行优化如下示意图所示优化点主要包含当前分块计算完成后MTE3搬出计算结果。由于MTE搬出的数据与下一分块计算的数据是独立的因此MTE3搬出与下一分块计算并行减少一次流水同步开销。若当前分块计算是高斯球对Vector核上最后一个像素块进行映射计算则在当前分块计算过程中同步搬入下一次分块计算所需的高斯球数据使下一次分块计算的Vector核不必等待MTE2的流水同步减少一次流水同步开销。对mipnerf360_v2数据集中的garden场景进行测试流水并行优化带来的开销收益如下表所示优化方法前向device耗时(ms)收益比例无优化4.550-搬出并行4.2167.9%搬出并行 搬入并行3.9486.8%与流水并行之前相比总体开销收益为15.2%。计算优化从Precise Intersection算法计算步骤的介绍中可以看出尽管每个高斯球都需要对全部的像素块计算映射关系但高斯球本身的属性如2D投影坐标、协方差逆矩阵和不透明度是不变的因此如果在每一次分块计算时都搬入对应的高斯球数据那么会增加不必要的搬入耗时。因此在流水并行优化的基础上进一步对计算进行了拆解将Precise Intersection的计算过程拆解为高斯球相关特征计算如计算高斯球的边界框、不透明度对数和高斯球-像素块映射关系计算分块计算过程中首先完成高斯球相关特征计算然后对每个像素块进行映射关系计算减少搬入核计算耗时开销。拆解后的算子流水示意图如下此外在计算过程中我们还基于AscendC编译器特性、昇腾硬件特点对计算过程进行了优化。算子的计算步骤有时存在依赖需要获取上一步的计算结果后再进行下一步的计算。AscendC编译器会根据代码自动判断是否存在依赖并在可能存在依赖的代码之间自动插入Vector流水同步。因此我们对计算过程进行了调整尽量减少上下文之间的依赖例如Precise Intersection算子在计算边界框时的公式为 $$ w \lfloor(\sqrt{2 * cov_{00} * power} 1)\rfloor $$ $$ h \lfloor(\sqrt{2 * cov_{11} * power} 1)\rfloor $$ 常规的计算步骤为依次计算$w$和$h$但在AscendC算子中可以同步计算公式中相同或相近的部分 $$ step1: w_0 2 * cov_{00} * power, h_0 2 * cov_{11} * power $$ $$ step2: w_1 \sqrt{w_0} 1, h_1 \sqrt{h_0} 1 $$ $$ step3: w \lfloor w_1 \rfloor, h \lfloor h_1 \rfloor $$这类计算优化能够进一步减少算子开销提升Precise Intersection算子的性能。对mipnerf360_v2数据集中的garden场景进行测试计算优化带来的开销收益如下表所示优化方法前向device耗时(ms)收益比例流水并行优化3.948-流水并行 计算拆解3.26021.1%流水并行 计算拆解 计算过程调整3.1164.6%与计算优化之前相比总体开销收益为26.7%。高斯球坐标初筛优化由于算子对像素块数量M分核因此每个核上分到的像素块纵坐标最小值Y_min和纵坐标最大值Y_max是不完全重叠的。假设图像尺寸为(144, 1440)每个像素块的尺寸为(32, 32)则总像素块数量为160个第1个核分配4个像素块对应像素块的纵坐标范围是[0, 36]第2个核分配4个像素块对应像素块的纵坐标范围是[36, 72]...依此类推。因此在进行相交关系计算之前每个核可以通过对高斯球在图像中的位置进行高斯球坐标初筛初步过滤相切矩形Y坐标不在当前核Y值范围的高斯球减少后续相交关系计算量。以mipnerf360_v2数据集中Bicycle场景为例在不进行高斯球坐标初筛的情况下每个像素块需要对高斯球进行多次切块计算。高斯球坐标初筛不涉及像素块可以过滤约90%的高斯球因此在后续计算像素块-高斯球相交关系时只需循环2-3次即可完成大大减少了循环次数。掩码过滤优化高斯球坐标初筛时算子将高斯球坐标初筛后的高斯球属性及索引保存在中间变量中。在计算mask时输入不再是原始的高斯球属性而是高斯球坐标初筛的结果类似地在mask计算时算子将掩码过滤后的高斯球属性和索引进行保存centerFlag和intersectFlag的输入是mask的掩码过滤结果输出是centerFlag | intersectFlag的掩码过滤结果。这样每一轮的计算都可以仅保留有效高斯球的信息避免重复冗余开销。高斯球坐标初筛和掩码过滤优化进一步提升了算子性能对mipnerf360_v2数据集中的场景采样进行对比测试高斯球坐标初筛和掩码过滤带来的开销收益如下表所示注意“优化方法”中的“基线方法”指应用了流水并行和计算优化的Precise Intersection算法“过滤优化”指在基线方法基础上应用高斯球坐标初筛和掩码过滤优化的Precise Intersection算法。高斯球数量像素块数量优化方法前向device耗时(ms)收益比例20w425基线方法过滤优化0.6560.59310.7%40w425基线方法过滤优化1.0390.91114.0%60w425基线方法过滤优化1.2701.2134.7%80w425基线方法过滤优化1.6101.41413.9%100w425基线方法过滤优化1.9921.66319.8%140w425基线方法过滤优化2.9862.31329.1%170w425基线方法过滤优化3.2182.53427.0%200w425基线方法过滤优化3.9153.99530.3%300w425基线方法过滤优化5.4624.55819.8%与优化之前相比总体开销收益为18.8%。性能实验Precise Intersection算法采用比原始GS算法更加精确的相交判断算法实现了快速高效过滤高斯球的功能。通过对mipnerf360_v2数据集中的场景进行测试可以看出Precise Intersection算法能够比GS算法剔除更多的高斯球从而使渲染耗时降低、渲染速度加快。高斯球数量像素块数量映射关系计算方法渲染前向device耗时(ms)20w425GSPrecise Intersection8.9556.67140w425GSPrecise Intersection17.49913.017100w425GSPrecise Intersection35.95722.8807w1107GSPrecise Intersection7.7834.86314w1107GSPrecise Intersection15.3849.48928w1107GSPrecise Intersection25.31115.493Citationmisc{feng2024flashgsefficient3dgaussian, title{FlashGS: Efficient 3D Gaussian Splatting for Large-scale and High-resolution Rendering}, author{Guofeng Feng and Siyan Chen and Rong Fu and Zimu Liao and Yi Wang and Tao Liu and Zhilin Pei and Hengjie Li and Xingcheng Zhang and Bo Dai}, year{2024}, eprint{2408.07967}, archivePrefix{arXiv}, primaryClass{cs.CV}, url{https://arxiv.org/abs/2408.07967}, }【免费下载链接】cann-recipes-spatial-intelligence本项目针对空间智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-spatial-intelligence创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考