在MacOS上使用PyTorch出现计算结果不一致的诡异问题
MacOS与Google Colab中PyTorch计算结果不一致的原因分析
问题现象
MacOS本地运行结果
Last login: Tue Aug 22 14:42:20 on ttys000 (base) crk@crkdeMacBook-Air ~ % conda activate kk (kk) crk@crkdeMacBook-Air ~ % python Python 3.8.17 (default, Jul 5 2023, 15:35:58) [Clang 14.0.6 ] :: Anaconda, Inc. on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import torch >>> x = torch.arange(4.0) >>> x tensor([0., 1., 2., 3.]) >>> x.requires_grad_(True) tensor([0., 1., 2., 3.], requires_grad=True) >>> y = 2 * torch.dot(x, x) >>> y tensor(0., grad_fn=<MulBackward0>) >>>
Google Colab运行结果
tensor(28., grad_fn=<MulBackward0>)
本地环境配置
(kk) crk@crkdeMacBook-Air ~ % conda list # packages in environment at /Users/crk/miniconda3/envs/kk: # # Name Version Build Channel appnope 0.1.3 pyhd8ed1ab_0 conda-forge asttokens 2.2.1 pyhd8ed1ab_0 conda-forge backcall 0.2.0 pyh9f0ad1d_0 conda-forge backports 1.0 pyhd8ed1ab_3 conda-forge backports.functools_lru_cache 1.6.5 pyhd8ed1ab_0 conda-forge ca-certificates 2023.7.22 hf0a4a13_0 conda-forge comm 0.1.4 pyhd8ed1ab_0 conda-forge contourpy 1.1.0 pypi_0 pypi cycler 0.11.0 pypi_0 pypi debugpy 1.6.7 py38h313beb8_0 decorator 5.1.1 pyhd8ed1ab_0 conda-forge entrypoints 0.4 pyhd8ed1ab_0 conda-forge executing 1.2.0 pyhd8ed1ab_0 conda-forge fonttools 4.42.0 pypi_0 pypi glob2 0.7 pypi_0 pypi importlib-resources 6.0.1 pypi_0 pypi ipykernel 6.25.1 pyh5fb750a_0 conda-forge ipython 8.12.0 pyhd1c38e8_0 conda-forge jedi 0.19.0 pyhd8ed1ab_0 conda-forge jupyter_client 7.3.4 pyhd8ed1ab_0 conda-forge jupyter_core 5.3.0 py38hca03da5_0 kiwisolver 1.4.4 pypi_0 pypi libcxx 14.0.6 h848a8c0_0 libffi 3.4.4 hca03da5_0 libsodium 1.0.18 h27ca646_1 conda-forge matplotlib 3.7.2 pypi_0 pypi matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge ncurses 6.4 h313beb8_0 nest-asyncio 1.5.6 pyhd8ed1ab_0 conda-forge numpy 1.24.4 pypi_0 pypi opencv-python 4.8.0.76 pypi_0 pypi openssl 3.1.2 h53f4e23_0 conda-forge packaging 23.1 pyhd8ed1ab_0 conda-forge pandas 2.0.3 pypi_0 pypi parso 0.8.3 pyhd8ed1ab_0 conda-forge pexpect 4.8.0 pyh1a96a4e_2 conda-forge pickleshare 0.7.5 py_1003 conda-forge pillow 10.0.0 pypi_0 pypi pip 23.2.1 py38hca03da5_0 platformdirs 3.10.0 pyhd8ed1ab_0 conda-forge prompt-toolkit 3.0.39 pyha770c72_0 conda-forge prompt_toolkit 3.0.39 hd8ed1ab_0 conda-forge psutil 5.9.0 py38h1a28f6b_0 ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge pygments 2.16.1 pyhd8ed1ab_0 conda-forge pyparsing 3.0.9 pypi_0 pypi python 3.8.17 hb885b13_0 python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge python_abi 3.8 2_cp38 conda-forge pytz 2023.3 pypi_0 pypi pyzmq 25.1.0 py38h313beb8_0 readline 8.2 h1a28f6b_0 setuptools 68.0.0 py38hca03da5_0 six 1.16.0 pyh6c4a22f_0 conda-forge sqlite 3.41.2 h80987f9_0 stack_data 0.6.2 pyhd8ed1ab_0 conda-forge tk 8.6.12 hb8d0fd4_0 torch 1.9.0 pypi_0 pypi torchaudio 0.9.0 pypi_0 pypi torchvision 0.10.0 pypi_0 pypi tornado 6.1 py38hea4295b_1 conda-forge tqdm 4.66.0 pypi_0 pypi traitlets 5.9.0 pyhd8ed1ab_0 conda-forge typing-extensions 4.7.1 hd8ed1ab_0 conda-forge typing_extensions 4.7.1 pyha770c72_0 conda-forge tzdata 2023.3 pypi_0 pypi wcwidth 0.2.6 pyhd8ed1ab_0 conda-forge wheel 0.38.4 py38hca03da5_0 xz 5.4.2 h80987f9_0 zeromq 4.3.4 hbdafb3b_1 conda-forge zipp 3.16.2 pypi_0 pypi zlib 1.2.13 h5a0b063_0 (kk) crk@crkdeMacBook-Air ~ %
原因分析
从环境配置可以看到,本地安装的PyTorch版本为1.9.0,而Google Colab默认使用的是远高于该版本的PyTorch(通常为2.x系列)。
在PyTorch 1.9.0及更早版本中,针对Apple Silicon芯片(M系列)的支持存在缺陷:当张量开启自动求导(requires_grad=True)后,CPU上的部分运算会出现计算错误,尤其是点积操作。这是因为早期PyTorch对M系列芯片的加速适配不完善,导致张量计算时出现数值异常。
Colab使用的是x86架构的CPU或GPU,且PyTorch版本较新,不存在该适配问题,因此计算结果正确(2*(0²+1²+2²+3²)=2*14=28)。
解决办法
- 升级本地PyTorch版本到1.12.0及以上:Apple Silicon的适配在1.12版本后得到修复,升级后即可正常计算。
- 若暂时无法升级,可在创建张量时指定设备为CPU并禁用MPS加速,或关闭自动求导验证计算结果(仅作为临时方案)。
内容的提问来源于stack exchange,提问作者K Demons
相关产品推荐
相关产品推荐

