M2 Mac本地运行Segment Anything报错:无法推断numpy.uint8类型
解决M2 MacBook上SAM ONNX示例中torch.as_tensor无法识别numpy.uint8的问题
问题背景
在搭载Sonoma 14.5系统的M2 MacBook本地运行Segment Anything的onnx_model_example.ipynb第11步时,持续触发错误:
RuntimeError: Could not infer dtype of numpy.uint8
报错栈指向torch.as_tensor转换环节。当前使用的conda环境依赖版本:
numpy==1.24.4 torch==1.9.0 torchvision==0.10.0 opencv-python==4.10.0.84
曾测试Python 3.9.19和3.11环境,尝试过多个numpy版本仍未解决;该notebook在Google Colab上可正常运行,但Colab使用的高版本依赖(numpy 1.25.2、torch 2.3.0+cu121等)无法在Mac本地安装。
排查原因
- Torch版本与Apple Silicon兼容性缺陷:torch 1.9.0属于早期版本,对M系列芯片的原生支持不完善,ARM架构下对numpy数据类型的处理存在适配bug。
- Numpy与Torch版本不匹配:numpy 1.24.x对数据类型定义有调整,而旧版torch(1.9.0)未同步适配这种变化,导致类型推断失败。
- ONNX Runtime的ARM适配不足:SAM的ONNX示例依赖ONNX Runtime,若版本过旧,在M系列芯片上处理numpy uint8类型时可能出现兼容性问题。
解决步骤
1. 升级到Apple Silicon原生支持的PyTorch版本
放弃torch 1.9.0,安装官方针对M系列芯片优化的稳定版,在conda环境中执行:
conda install pytorch torchvision torchaudio -c pytorch
该命令会自动安装适配ARM架构的PyTorch 2.x版本,并同步匹配兼容的torchvision、numpy版本。
2. 调整Numpy版本适配新Torch
若自动安装的numpy仍存在兼容性问题,可手动指定适配版本:
conda install numpy=1.26.x
1.26.x系列与PyTorch 2.x在Apple Silicon上兼容性良好。
3. 替换为Apple Silicon优化的ONNX Runtime
卸载原onnxruntime,安装针对ARM架构优化的版本:
pip uninstall onnxruntime pip install onnxruntime-silicon
确保ONNX模型在M芯片上的类型处理逻辑正常。
4. 临时修改代码绕过自动推断(应急方案)
若暂时无法升级依赖,可在报错位置显式指定数据类型:
# 原代码示例 tensor = torch.as_tensor(numpy_array) # 修改后 tensor = torch.as_tensor(numpy_array, dtype=torch.uint8)
强制指定dtype可跳过自动推断环节,直接完成转换。
5. 验证环境依赖一致性
安装完成后,运行以下代码确认版本兼容性:
import torch import numpy import cv2 print(f"Torch version: {torch.__version__}") print(f"Numpy version: {numpy.__version__}") print(f"OpenCV version: {cv2.__version__}")
确保所有依赖均为Apple Silicon原生支持版本,无跨架构兼容问题。
内容的提问来源于stack exchange,提问作者LNI
相关产品推荐
相关产品推荐

