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