在M1 Mac上配置numpy和scipy

在M1 Mac上配置numpy和scipy

写篇文章记录一下在M1 Mac上配置anaconda以及科学计算全家桶(numpy、scipy、matplotlib)的痛苦经历。

首先,到目前为止(2022年6月),qutip还没有很好地支持M1的Mac,当我直接naively从conda-forge下载qutip的时候,先是安装的时候不停地报错,最后妥协了一下安装了4.5.2版本没安上最新的。然后当我兴奋地打开python终端输入import qutip as qt之后,就不停的raise Exception了。先是list index out of range,查了一下发现是qutip提取cpu信息的格式和apple M1的cpu给出的格式不一致,因此报错,于是我直接冲进qutip的hardware_info.py文件把提取cpu信息的两行删掉,本以为万事大吉,结果再次import qutip的时候,又报错说numpy.array size changed, may indicate binary imcompatibility,我**直接放弃在M1的Mac上使用qutip。

(6月6日更新:按照本文步骤安装好numpy和scipy后,qutip 4.7版本也是可以正常安装的。)

没事,反正平常用qutip只是为了方便,用numpy算也是一样的,我安慰自己道。

结果当我用numpy跑DMRG和TDVP的时候直接精神错乱,这一台2w+RMB的电脑跑张量计算的速度比4年前价格只有它一半的电脑还慢,我真是*******,f**k。

好吧,google了一下,跑这么慢可能是因为安装的numpy版本不太对,因为M1 Mac上不支持mkl,所以肯定没有在intel芯片上跑的快。为此,貌似要用apple veclib编译的numpy版本才行,感觉太麻烦了......

最后找到了一种妥协的办法,就是直接安装anaconda的arm64版本,最好还是命令行安装。测试了一下跑TDVP算Heisenberg动力学,我的那台18年的macbook pro耗时21秒,这台新电脑耗时23秒,好吧,也差不多了,反正以后主要也是在服务器上跑,电脑上跑的速度不重要,唉~

最后又改了一下bond dimension,增大了一倍,旧电脑耗时1分钟,M1 Mac要6分钟,嗯,一言难尽......

还是要尝试一下apple acceleration framework,唉~,一天的时间就这样被浪费掉了。


吐槽结束,接下来是正文,即在M1 Mac上安装python及numpy、scipy的具体过程。

1.先安装老朋友anaconda,这里建议不要安装图形界面,直接用命令行安装就好

anaconda在上个月(2022.5.6)刚刚支持了M1 Mac,直接下载这个就可以了,点击下方链接,拉倒最底下:

下载红框里标的那个版本

下载完成后,打开terminal,输入bash空格后,直接将下载的文件拖到terminal里面,会直接转换成当前文件所在的路径,然后回车:

bash /Users/yourname/Downloads/Anaconda3-2022.05-MacOSX-arm64.sh 

然后一直回车,后面的选项建议都是yes,就不要自己改动了。

2.安装好arm64版本的anaconda后,先创建一个新环境,在terminal中输入

conda create -n EnvName python=3.8

中间的EnvName为环境名称,可以自己设置

然后激活这个环境:

conda activate EnvName

3.首先安装numpy

第一步:由于我们需要自己编译numpy,所以先下载cython和pybind11

pip install cython pybind11

这里建议不要用conda命令

第二部:安装numpy

pip install --no-binary :all: --no-use-pep517 numpy

安装完成之后可以打开Python,import numpy as np后输入

np.show_config()

如果安装没有问题的话可以看到:

blas_armpl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
  NOT AVAILABLE
accelerate_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
blas_opt_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
lapack_armpl_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
  NOT AVAILABLE
openblas_clapack_info:
  NOT AVAILABLE
flame_info:
  NOT AVAILABLE
lapack_opt_info:
    extra_compile_args = ['-I/System/Library/Frameworks/vecLib.framework/Headers']