稀疏卷积/3D卷积部署问题

针对你提到的 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
  • 但实现复杂,性能难以保证

验证步骤

  1. 检查算子支持

    # 导出 ONNX 模型
    hb_compile --check-model your_model.onnx
    # 查看报错的算子类型
    
  2. 参考 PointPillars 实现

    • 源码位置:OE 包中 ddk/samples/ai_toolchain/horizon_model_train_sample
    • 关键算子:horizon_plugin_pytorch.nn.PointPillarsScatter
    • 文档:PointPillars 参考算法详解
  3. 联系官方支持

    • 如果是商业项目,可在原帖中说明项目背景
    • 官方可能提供定制化算子支持或优化建议

建议

优先采用 PointPillars 架构,这是目前社区验证最成熟的点云部署方案。如果必须使用稀疏卷积网络(如 CenterPoint 的稀疏 Backbone),建议:

  1. 评估是否可改为 Pillar-based 方法
  2. 联系地平线技术支持,确认是否有未公开的稀疏卷积优化方案
  3. 考虑在 CPU/GPU 上运行稀疏卷积部分,BPU 仅处理稠密部分(混合部署)

需要我帮你分析具体的网络结构,给出修改建议吗?