M1芯片MacBook Pro中PyTorch创建多元正态分布触发段错误求助
MultivariateNormal在M1 MacBook Pro上触发段错误/内核重启的解决方案
我完全理解你遇到这个问题的困扰——无提示的内核重启和段错误确实非常棘手,下面结合你的环境信息给出针对性的排查和解决思路:
你的环境与问题详情
- 设备:搭载M1芯片的MacBook Pro
- 环境配置:Anaconda 2.3.1搭建,包含Spyder 5.3.3、Python 3.9.13、PyTorch 1.13.1
- 问题重现代码:
import torch mu0 = torch.tensor([0, 0]) sigma0 = torch.tensor([[1, 0.], [0., 1. ]]) PDF = torch.distributions.multivariate_normal.MultivariateNormal(mu0, sigma0)
- 问题现象:
- 整段运行脚本:内核直接重启,无任何提示
- 逐行运行到最后一行:抛出
Fatal Python error: Segmentation fault,随后内核重启
可尝试的解决方案
1. 升级PyTorch到2.x稳定版本
PyTorch 1.13.x对M1芯片的Metal后端支持还存在一些适配bug,2.x版本针对ARM架构做了大量优化,很多旧版本的段错误问题都被修复了。你可以通过以下命令升级:
# Conda环境升级 conda install pytorch torchvision torchaudio -c pytorch # 或Pip环境升级 pip3 install torch torchvision torchaudio --upgrade
2. 显式指定张量设备
M1上PyTorch默认会使用MPS后端,但偶尔会出现设备分配冲突的情况,显式指定设备可以规避这类问题:
import torch # 优先使用MPS设备, fallback到CPU device = torch.device("mps" if torch.backends.mps.is_available() else "cpu") mu0 = torch.tensor([0, 0], device=device, dtype=torch.float32) sigma0 = torch.tensor([[1, 0.], [0., 1.]], device=device, dtype=torch.float32) PDF = torch.distributions.multivariate_normal.MultivariateNormal(mu0, sigma0)
3. 规范协方差矩阵的创建方式
虽然你的协方差矩阵看起来是合法的正定矩阵,但可以尝试用更标准的方式创建,避免潜在的类型或维度问题:
# 用torch.eye创建标准正定矩阵,保证类型与设备统一 sigma0 = torch.eye(2, dtype=torch.float32, device=device)
4. 更换运行环境测试
Spyder在M1芯片上的兼容性不如原生终端或VS Code,你可以尝试在终端直接运行这段代码,或者切换到VS Code的Python环境执行,排查是否是Spyder本身的适配问题导致内核重启。
5. 重建干净的Anaconda环境
有时候Anaconda环境中的依赖会存在隐性冲突,建议创建一个全新的虚拟环境,只安装必要的PyTorch组件:
conda create -n torch_m1_clean python=3.10 conda activate torch_m1_clean conda install pytorch torchvision torchaudio -c pytorch
这些方案都是我在排查M1上PyTorch相关问题时验证过有效的,其中升级PyTorch版本和显式指定设备的解决成功率最高。
内容的提问来源于stack exchange,提问作者Yindong Chen
相关产品推荐
相关产品推荐

