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

如何解决Apple M1的MPS设备加载模型时float64转float32的问题

解决M1 MPS加载YOLOv7权重时的float64类型错误

问题原因

Apple M1的MPS框架不支持float64(双精度)张量,而你的预训练权重文件中包含这类张量,直接加载到MPS设备就会触发类型转换错误。

解决方案

方法一:先加载到CPU,转float32再迁移到MPS

你想到的这个临时方案完全可行,操作步骤如下:

  • 先把权重加载到CPU,避免直接触发MPS的类型错误
  • 遍历权重字典,把所有张量统一转换为float32
  • 最后将整个权重迁移到MPS设备

代码示例:

import torch

# 1. 加载权重到CPU
weights = torch.load('yolov7_training.pt', map_location='cpu')

# 2. 批量转换所有张量为float32
if isinstance(weights, dict):
    for key, tensor in weights.items():
        if isinstance(tensor, torch.Tensor):
            weights[key] = tensor.float()
elif isinstance(weights, torch.Tensor):
    weights = weights.float()

# 3. 迁移到MPS设备
device = torch.device('mps')
weights = weights.to(device)

方法二:用自定义map_location函数,加载时一步转换

通过给torch.load的map_location参数传一个自定义函数,可以在加载每个张量时同时完成设备迁移和类型转换,代码更简洁:

import torch

def convert_to_mps_float32(storage, location):
    # 先加载到CPU转float32,再移到MPS
    return storage.cpu().float().to('mps')

# 加载权重时自动处理类型和设备
weights = torch.load('yolov7_training.pt', map_location=convert_to_mps_float32)

补充说明

YOLOv7模型通常是用float32训练的,转换为float32不会影响模型性能,反而能更好适配MPS的硬件加速特性。

内容的提问来源于stack exchange,提问作者Ahasanul Haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:45:27