基于3d稀疏卷积的centerpoint部署
Posted 令狐少侠、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于3d稀疏卷积的centerpoint部署相关的知识,希望对你有一定的参考价值。
目前已实现基于稀疏卷积的centerpoint
部署,精度不丢失,在3080ti
显卡nuscenes
数据集下, pytorch
平均一帧耗时182ms
,本文部署centerpoint fp32
推理平均一帧耗时31ms
左右,是pytorch
推理速度5倍多!
centerpoint
推理网络分3部分:
-
1.
backbone
前面部分用tensorRT
实现定义算子,包含5个TensorRT
算子- 由点云生成
voxel
信息 - 对每个
voxel
计算均值 - 子流线稀疏卷积
- 普通的稀疏卷积
- 稀疏卷积网络部分输出信息经
scatter
转为[N,C,H,W]
形式
该自定义算子部分调用TensorRT API搭建网络,导出用于TensoRT推理的
pfe.trt
文件 - 由点云生成
-
2.
backbone 2D
卷积 ,该部分经过pytorch-->onnx-->Trt
的的形式转换出TensoRT
的rpn.trt
推理文件,方便后续做int8的感知训练量化 -
3.后处理:使用
c++/cuda
实现
性能优化记录
fp32
下 rpn
部分耗时11.5ms
左右,后处理部分耗时1ms
多点,rpn
部分调用TensoRT
的2D
卷积,耗时固定的,接下来主要针对自定义算子的前处理+pfe
+ 后处理速度进行优化
耗时优化记录如下:
- 20230101: 完成初版
pfe 3d conv:216ms
- 20230105 : 针对自定义算子中间变量的显存分配,使用
malloc、free
太耗时,改为手动分配显存,合并内存分配,并保持内存对齐
pfe 3d conv:200ms
- 20230108: 使用二维grid和二维线程块
pfe 3d conv 120ms
- 20230110 : 使用共享内存,每个线程计算一个数
pfe 3d conv 48ms
- 20230202: 针对全局内存加载数据访存比低问题,使用共享内存并分块,每个线程计算
8*8
个数,同时解决M,N不能整除BM,BN的边缘问题,但结果有部分数据异常,需进一步排查
pfe 3d conv 45ms
- 20230302 : 修复分块共享内存的矩阵乘法部分数据异常问题
pfe 3d conv:45ms
20230308
共享内存存在bank冲突,将矩阵A在共享内存中按列缓存,解决共享内存将结果写入全局变量的bank冲突问题,同时使用向量化float4增大全局数据读写的带宽利用率
pfe 3d conv:24ms
- 20230304:
- 使用向量化,定义宏定义#define INT4(pointer) (reinterpret_cast<int4 *>(&(pointer))[0]),替换new_getSubMIndicePairsKernel和fillGridKernelV2核函数中valid_points的全局读操作,增大内存读的带宽率
pfe 3d conv:22.8ms
- 优化稀疏卷积核函数getValidOutPosKernel,去掉valid_points写的原子操作,
利用向量化int4进行全局内存写,同时去掉valid_points_num的原子操作
pfe 3d conv:21.8ms
- 调整子流线卷积中indice_pairs(rulebook)的存储顺序,使用[N,27,2]替换[27,2,N] 便于使用向量化float2,
#define FLOAT2(pointer) (reinterpret_cast<float2 *>(&(pointer))[0]),同时写入rulebook中输入输出序号,增大内存带宽利用率。矩阵乘法部分相应也需要修改
pfe 3d conv:20.6ms
- 使用向量化,定义宏定义#define INT4(pointer) (reinterpret_cast<int4 *>(&(pointer))[0]),替换new_getSubMIndicePairsKernel和fillGridKernelV2核函数中valid_points的全局读操作,增大内存读的带宽率
- 20230305 :
- 调整普通稀疏卷积中indice_pairs(rulebook)的存储顺序,使用[N,27,2]替换[27,2,N] 便于使用向量化float2读写数据
pfe 3d conv:19.8ms
- 稀疏卷积
add_bias_kernel
核函数改为二维grid和二维block,同时使用float4读写数据
pfe 3d conv:19.2ms
- 调整普通稀疏卷积中indice_pairs(rulebook)的存储顺序,使用[N,27,2]替换[27,2,N] 便于使用向量化float2读写数据
以上是关于基于3d稀疏卷积的centerpoint部署的主要内容,如果未能解决你的问题,请参考以下文章
论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解
论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解
论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解