YOLOv8+DCNv3报错:RuntimeError: Not implemented on the CPU

img

default 文件中已经设置了device使用GPU,训练时还是会提示不能使用CPU报错,感觉像是YOLOv8在训练前会用CPU跑一次模型?有没有同学能解答一下

我使用的是YOLOv8.0.70版本 解决办法是:
使用从头开始构建的新模型时,YOLOv8会调用 \ultralytics-main\ultralytics\yolo\engine\model.py下的def _new 来构建
运行至一下语句时

 self.model = TASK_MAP[self.task][0](cfg_dict, verbose=verbose and RANK == -1) # build model

改为

 self.model = TASK_MAP[self.task][0](cfg_dict, verbose=verbose and RANK == -1).cuda # build model

使用GPU运行,之后似乎会生成一个全0张量将整个模型跑一次,而这个全0张量默认是在CPU中运行的,因为不知道哪一个会起效而且计算时要在同一个设备运行,于是我将模型\ultralytics-main\ultralytics\nn\task.py下的class DetectionModel(BaseModel):中的

        if isinstance(m, (Detect, Segment, Pose)):
            s = 256  # 2x min stride
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") #增加的,将模型放入GPU运行
            m.inplace = self.inplace
            m.cuda() #增加的,将模型放入GPU运行
            forward = lambda x: self.forward(x)[0] if isinstance(m, (Segment, Pose)) else self.forward(x)
            m.stride = torch.tensor([s / x.shape[-2] for x in forward(torch.zeros(1, ch, s, s).to(device))])  # forward 在张量后加了一个to(device)

把生成的全0张量和model都放入GPU运算。第一次遍历模型使用的def _forward_once方法中也加入

 def _forward_once(self, x, profile=False, visualize=False):
        self.model.cuda()

之后成功运行,具体哪个起效也不确定

强制使用gpu,参考
https://blog.csdn.net/qq_44747572/article/details/121316568