已关闭
[Usage]: BEVFusion 模型运行报错:RuntimeError: get_indice_pairs is not implemented on CPU #240
Pla-Yer创建于  5月19日关闭于  5月26日
Pla-Yer
Pla-Yer
5月19日 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

例如:
- 操作系统
- 昇腾硬件信息
- CANN软件版本
- 安装的对应软件版本

使用 swr.cn-south-1.myhuaweicloud.com/ascendhub/drivingsdk:8.3.RC1_alpha001-arm64 镜像

Linux localhost.localdomain 5.10.0-216.0.0.115.oe2203sp4.aarch64 #1 SMP Thu Jun 27 15:22:10 CST 2024 aarch64 aarch64 aarch64 GNU/Linux

NAME="openEuler"
VERSION="22.03 (LTS-SP4)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP4)"
ANSI_COLOR="0;31"

🐛 问题描述

按照quick_start_guide.md完成后,运行

bash test/train_full_8p_base_fp32.sh --batch-size=4 --num-npu=8

log信息如下:

Traceback (most recent call last):
  File "tools/train.py", line 221, in <module>
    main()
  File "tools/train.py", line 140, in main
    runner.train()
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1777, in train
    model = self.train_loop.run()  # type: ignore
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mmengine/runner/loops.py", line 98, in run
    self.run_epoch()
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mx_driving/patcher/mmengine_patch.py", line 576, in run_epoch
    self.run_iter(idx, data_batch)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mmengine/runner/loops.py", line 131, in run_iter
    outputs = self.runner.model.train_step(
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mmengine/model/wrappers/distributed.py", line 121, in train_step
    losses = self._run_forward(data, mode='loss')
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/mmengine/model/wrappers/distributed.py", line 161, in _run_forward
    results = self(**data, mode=mode)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/parallel/distributed.py", line 1519, in forward
    else self._run_ddp_forward(*inputs, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/parallel/distributed.py", line 1355, in _run_ddp_forward
    return self.module(*inputs, **kwargs)  # type: ignore[index]
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmdetection3d/mmdet3d/models/detectors/base.py", line 75, in forward
    return self.loss(inputs, data_samples, **kwargs)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmdetection3d/projects/BEVFusion/bevfusion/bevfusion.py", line 292, in loss
    feats = self.extract_feat(batch_inputs_dict, batch_input_metas)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmdetection3d/projects/BEVFusion/bevfusion/bevfusion.py", line 274, in extract_feat
    pts_feature = self.extract_pts_feat(batch_inputs_dict)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmdetection3d/projects/BEVFusion/bevfusion/bevfusion.py", line 174, in extract_pts_feat
    x = self.pts_middle_encoder(feats, coords, batch_size)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmdetection3d/projects/BEVFusion/bevfusion/sparse_encoder.py", line 134, in forward
    x = self.conv_input(input_sp_tensor)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmcv/mmcv/ops/sparse_modules.py", line 134, in forward
    input = module(input)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1518, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/root/miniconda3/envs/torch2.1.0_py38/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1527, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmcv/mmcv/ops/sparse_conv.py", line 157, in forward
    outids, indice_pairs, indice_pair_num = ops.get_indice_pairs(
  File "/home/player/DrivingSDK/model_examples/BEVFusion/mmcv/mmcv/ops/sparse_ops.py", line 99, in get_indice_pairs
    return get_indice_pairs_func(indices, batch_size, out_shape,
RuntimeError: get_indice_pairs is not implemented on CPU

完整log已上传连接。
0cbad0627a264cc59604c12b9d9d5a99.log
一个验证示例如下:

import torch
from mmcv.ops import SparseConvTensor, SubMConv3d

print("Torch NPU available:", torch.npu.is_available())

features = torch.randn(4, 8).float()
indices = torch.tensor([
    [0, 0, 0, 0],
    [0, 1, 0, 0],
    [0, 1, 1, 0],
    [0, 2, 1, 0]
], dtype=torch.int32)

spatial_shape = [10, 10, 3]
batch_size = 1

# ✅ 关键修复:features 和 indices 都移到 NPU
features = features.npu()
indices = indices.npu()          # ← 这行是修复核心

sp = SparseConvTensor(features, indices, spatial_shape, batch_size)

print("Features device:", sp.features.device)
print("Indices device:", sp.indices.device)   # 验证 indices 设备

conv = SubMConv3d(
    in_channels=8,
    out_channels=16,
    kernel_size=3,
    bias=False
).npu()

try:
    out = conv(sp)
    print("Sparse conv on NPU executed successfully!")
    print("Output features device:", out.features.device)
except RuntimeError as e:
    print("Sparse conv runtime error:", e)

运行报错:(torch2.1.0_py38) [root@localhost driveingsdk_data]# python test_sparse.py
Torch NPU available: True
Features device: npu:0
Indices device: npu:0
Sparse conv runtime error: get_indice_pairs is not implemented on CPU

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
ascend-robotascend-robot成员
5月19日 添加了label:bug
xiangyuming
xiangyuming成员
5月19日 评论:

/label add triaged

likedislike
ascend-robotascend-robot成员
5月19日 添加了label:triaged
xiangyuming
xiangyuming成员
5月19日 评论:

您好,目前bevfusion内默认代码下sparse系列模块如SubMConv3d等正常情况下会使能mx_driving库内算子,您可以确认下当前环境以及仓内一键patcher是否正常生效,若使用mmcv仓内原函数则训练效率会相对较低

likedislike
Pla-Yer
Pla-Yer
5月19日 评论:

您好,目前bevfusion内默认代码下sparse系列模块如SubMConv3d等正常情况下会使能mx_driving库内算子,您可以确认下当前环境以及仓内一键patcher是否正常生效,若使用mmcv仓内原函数则训练效率会相对较低

@zjuxym

你说的patch是指/
install_BEVFusion.sh里面的git apply bevfusion.patch --reject吗,我单独运行过的,全部skip了。

likedislike
xiangyuming
xiangyuming成员
5月20日 评论:

是指主函数("DrivingSDK/model_examples/BEVFusion/mmdetection3d/tools/train.py")中的default_patcher_builder,这个模块的导入会自动识别部分mx_driving已优化的算子;从您的日志中没有看到spconv相关的patch生效,可能mx_driving是去年较早期的版本了,您可以拉取最新代码编译安装mx_driving后再尝试。
spconv相关pr:https://gitcode.com/Ascend/DrivingSDK/pull/1841/diffs

likedislike
Pla-Yer
Pla-Yer
5月20日 评论:

是指主函数("DrivingSDK/model_examples/BEVFusion/mmdetection3d/tools/train.py")中的default_patcher_builder,这个模块的导入会自动识别部分mx_driving已优化的算子;从您的日志中没有看到spconv相关的patch生效,可能是去年较早期的版本了,您可以拉取最新代码后再尝试

@zjuxym

你是指我下载的镜像里面的Drivingsdk太老了,需要重新下载当前的并重新编译吗,还是说直接用最新的mmcv_patch即可?

likedislike
xiangyuming
xiangyuming成员
5月20日 评论:

建议重新下载并编译,如果有报错可以再确认下model_examples/BEVFusion内的代码是不是老版本,是的话建议基于最新版本再更新下代码

likedislike
Pla-Yer
Pla-Yer
5月20日 评论:

建议重新下载并编译,如果有报错可以再确认下model_examples/BEVFusion内的代码是不是老版本,是的话建议基于最新版本再更新下代码

@zjuxym

重新下载编译后,确实可以运行了,但是结果为:

mAP: 0.0000
mATE: 1.0000
mASE: 1.0000
mAOE: 1.0000
mAVE: 1.0000
mAAE: 1.0000
NDS: 0.0000
Eval time: 6.4s

Per-class results:
Object Class AP ATE ASE AOE AVE AAE
car 0.000 1.000 1.000 1.000 1.000 1.000
truck 0.000 1.000 1.000 1.000 1.000 1.000
bus 0.000 1.000 1.000 1.000 1.000 1.000
trailer 0.000 1.000 1.000 1.000 1.000 1.000
construction_vehicle 0.000 1.000 1.000 1.000 1.000 1.000
pedestrian 0.000 1.000 1.000 1.000 1.000 1.000
motorcycle 0.000 1.000 1.000 1.000 1.000 1.000
bicycle 0.000 1.000 1.000 1.000 1.000 1.000
traffic_cone 0.000 1.000 1.000 nan nan nan
barrier 0.000 1.000 1.000 1.000 nan nan
完整log如下:
e1495446b0c64ba28aa5e6acd36ea276.log
是因为我用的是nuscence-mini吗。但也不应该为0吧。

likedislike
xiangyuming
xiangyuming成员
5月21日 评论:

您好,当前仓上模型训练示例以nusences全量数据集为主,但相关问题您可以看一下这个issue,有开发者曾经遇到过:https://gitcode.com/Ascend/DrivingSDK/issues/180
同时确认一下当前使用脚本中是否包含了该PR的改动:https://gitcode.com/Ascend/DrivingSDK/pull/1973
有可能是您镜像中的model_examples/BEVFusion内的代码还是老版本,可以照着上面的PR编辑对应脚本即可
同时仓上更新了docker列表,后续开发如果方便的话您可以更换新版的镜像,8.3的版本较为早期,部分算子已做进一步性能优化:https://gitcode.com/Ascend/DrivingSDK/tree/master/docker

likedislike
Pla-Yer
Pla-Yer
5月22日 评论:

您好,当前仓上模型训练示例以nusences全量数据集为主,但相关问题您可以看一下这个issue,有开发者曾经遇到过:https://gitcode.com/Ascend/DrivingSDK/issues/180
同时确认一下当前使用脚本中是否包含了该PR的改动:https://gitcode.com/Ascend/DrivingSDK/pull/1973
有可能是您镜像中的model_examples/BEVFusion内的代码还是老版本,可以照着上面的PR编辑对应脚本即可
同时仓上更新了docker列表,后续开发如果方便的话您可以更换新版的镜像,8.3的版本较为早期,部分算子已做进一步性能优化:https://gitcode.com/Ascend/DrivingSDK/tree/master/docker

@zjuxym

好的,我去试试。

likedislike
xiangyumingxiangyuming成员
5月26日 修改标题为 “[Usage]: BEVFusion 模型运行报错:RuntimeError: get_indice_pairs is not implemented on CPU”,原标题为“[Bug]: BEVFusion 模型运行报错:RuntimeError: get_indice_pairs is not implemented on CPU”
ascend-robotascend-robot成员
5月26日 添加了label:usage
xiangyumingxiangyuming成员
5月26日 添加了label:resolved;删除了label:bug, triaged
xiangyumingxiangyuming成员
5月26日 issue状态由 TODO 改变为 DONE
xiangyumingxiangyuming成员
5月26日 关闭了 issue