针对你提到的 subconv3d(稀疏子流形3D卷积)算子,目前地平线工具链确实不支持。这是稀疏卷积(Sparse Convolution)的核心算子之一,在 spconv、MinkowskiEngine 等库中广泛使用。
核心结论
subconv3d 不在官方算子支持列表中,无法直接在 BPU 上加速。必须通过算子替换或网络结构调整来实现部署。
可行方案
方案 1:使用 PointPillarsScatter 替代(推荐)
社区已有成熟的 PointPillars 参考算法,它通过以下方式规避了稀疏卷积:
# 关键改动:使用地平线定制的 PointPillarsScatter 算子
# 将稀疏体素特征转换为稠密伪图像,然后用标准 2D 卷积处理
# 原始稀疏卷积流程(不支持)
# sparse_tensor → subconv3d → sparse_tensor
# 替代方案(支持)
# 点云 → Voxelization → PillarFeatureNet → PointPillarsScatter → 2D CNN
优势:
PointPillarsScatter是地平线定制算子,已集成在horizon_plugin_pytorch中- 后续使用标准
Conv2d,BPU 完全支持 - 已在 J5/S100 平台上验证,性能 25.8ms + 后处理 2.6ms
方案 2:体素化 + 标准 3D 卷积
将稀疏卷积网络改为稠密 3D 卷积:
# 修改前(spconv)
import spconv
self.conv1 = spconv.SubMConv3d(...)
# 修改后(标准卷积)
import torch.nn as nn
# 1. 先将稀疏体素转换为稠密张量
# 2. 使用标准 3D 卷积
self.conv1 = nn.Conv3d(in_channels, out_channels, kernel_size=3, padding=1)
注意:
- 需要调整网络结构,确保体素网格尺寸合理(避免显存爆炸)
- 可能损失稀疏性带来的效率优势
方案 3:算子分解(复杂,不推荐)
尝试将 subconv3d 分解为支持的算子组合:
Gather+Conv2D+Scatter- 但实现复杂,性能难以保证
验证步骤
-
检查算子支持
# 导出 ONNX 模型 hb_compile --check-model your_model.onnx # 查看报错的算子类型 -
参考 PointPillars 实现
- 源码位置:OE 包中
ddk/samples/ai_toolchain/horizon_model_train_sample - 关键算子:
horizon_plugin_pytorch.nn.PointPillarsScatter - 文档:PointPillars 参考算法详解
- 源码位置:OE 包中
-
联系官方支持
- 如果是商业项目,可在原帖中说明项目背景
- 官方可能提供定制化算子支持或优化建议
建议
优先采用 PointPillars 架构,这是目前社区验证最成熟的点云部署方案。如果必须使用稀疏卷积网络(如 CenterPoint 的稀疏 Backbone),建议:
- 评估是否可改为 Pillar-based 方法
- 联系地平线技术支持,确认是否有未公开的稀疏卷积优化方案
- 考虑在 CPU/GPU 上运行稀疏卷积部分,BPU 仅处理稠密部分(混合部署)
需要我帮你分析具体的网络结构,给出修改建议吗?