You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Faster R-CNN训练出现cuda/cpu设备不匹配RuntimeError问题求助

故障排查步骤
  • 优先检查模型本身的设备状态:你只验证了输入图像和target的张量状态,大概率是Faster R-CNN模型本身仍有部分参数残留在CPU上。很多场景下用户写了model.to(device)但没有校验迁移结果,尤其是自定义了Faster R-CNN的检测头、或者模型实例化后中途新增子模块的场景,新增子模块不会随主模型自动迁移到CUDA。你可以加一行代码快速验证:print(next(model.parameters()).device),如果输出为cpu即可直接定位问题。
  • 检查target的隐式生成字段:你已经确认bboxes、labels、area的is_cuda属性为True,但PyTorch官方的Faster R-CNN实现要求target包含iscrowd字段,如果你的ToolDataset没有显式返回该字段,框架会自动在CPU上生成全0的iscrowd张量,这部分张量不会被你手动的设备迁移代码覆盖,直接触发设备不匹配错误。
  • 检查train_one_epoch的迁移逻辑:如果你使用的是PyTorch官方Detection工程提供的engine.py,默认的迁移逻辑仅处理图像和target中已有的键值对,不会覆盖模型内部生成的中间张量;另外如果你的自定义collate_fn返回了CPU上的辅助张量,随batch一同传入但没有做迁移,也会触发报错。
  • 检查jit.trace的特殊限制:Faster R-CNN属于动态图结构,内部包含NMS、Proposal生成等依赖输入尺寸的动态分支,直接trace会因为控制流变化报错,且如果模型存在CPU侧参数,trace过程也会触发设备不匹配错误。
解决方案
  • 补充模型迁移校验:实例化模型后立刻执行model = model.to('cuda:0'),添加校验代码确保所有参数都在CUDA上:
all_cuda = all(p.is_cuda for p in model.parameters())
assert all_cuda, "Model has parameters on CPU"
  • 补全Dataset返回的target字段:在ToolDataset的__getitem__方法返回的target里显式添加iscrowd字段,值为和其他target张量同设备的全0张量:
target['iscrowd'] = torch.zeros((len(bboxes),), dtype=torch.int64)
  • 完善target全字段迁移逻辑:在train_one_epoch的batch处理部分,遍历target所有键完成迁移,不要硬编码仅迁移部分字段:
images = list(image.to(device) for image in images)
targets = [{k: v.to(device) if isinstance(v, torch.Tensor) else v for k, v in t.items()} for t in targets]
  • 适配TorchScript导出要求:如果要导出模型供C++调用,优先使用torch.jit.script而非torch.jit.trace;如果必须用trace,需要先把模型切到eval模式,固定输入尺寸,关闭NMS等动态分支的可变参数后再执行导出,导出前确保模型和输入样例都在同一设备上。

内容的提问来源于stack exchange,提问作者Nathane Berrebi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 07:48:02