M1 Mac训练YOLOv8遇'MPS不支持float64'错误的解决咨询
解决M1 MacBook Pro上YOLOv8 MPS训练的float64类型错误
我来帮你搞定这个问题——你遇到的TypeError是因为MPS(Metal Performance Shaders)框架本身不支持float64(双精度浮点)数据类型,而YOLOv8的检测训练逻辑里有部分张量默认用了float64,导致无法在MPS设备上运行。下面是几个简单可行的解决办法:
方法1:修改YOLOv8的训练代码(快速临时修复)
找到报错的文件路径:/opt/homebrew/lib/python3.10/site-packages/ultralytics/yolo/v8/detect/train.py,定位到__call__方法里的第168行左右(也就是你报错的那一行),在targets.to(self.device)后面加上.float(),强制将张量转换为MPS支持的float32类型:
targets = self.preprocess(targets.to(self.device).float(), batch_size, scale_tensor=imgsz[[1, 0, 1, 0]])
修改后保存文件,重新运行训练命令即可。
方法2:全局设置PyTorch默认数据类型
如果不想修改YOLOv8的源码,可以在训练前强制让PyTorch默认使用float32。你可以创建一个简单的Python启动脚本代替原来的CLI命令:
# train_yolo_mps.py import torch # 设置默认数据类型为float32 torch.set_default_dtype(torch.float32) from ultralytics import YOLO # 初始化模型并启动训练 model = YOLO('yolov8s.pt') model.train( task='detect', data='/Users/aditya_nemiwal/Documents/C++/Python/WiDS_Week3_3/datasets/data.yaml', epochs=25, device='mps' )
然后运行这个脚本:
python train_yolo_mps.py
这样所有生成的张量都会默认是float32,避免触发MPS的类型限制。
方法3:检查数据集标注的类型
少数情况下,数据集的标注文件如果用了float64存储坐标,加载后也会导致张量类型不兼容。你可以检查标注文件的格式,确保坐标数据是float32类型,或者在数据加载阶段强制转换类型。
这些方法的核心都是确保所有参与MPS计算的张量都是float32类型——这是MPS框架的硬性要求,只要满足这一点就能正常使用MPS加速训练了。
内容的提问来源于stack exchange,提问作者Aditya Nemiwal
相关产品推荐
相关产品推荐

