安装基于openmpi的mpi4py
在使用PySCF和Block程序做DMRG-SC-NEVPT2计算时,发现它要用到mpi4py(可以在pyscf/pyscf/dmrg/nevpt_mpi.py看到)来实现并行,然而Anaconda2和3的500MB的离线安装包里都没有mpi4py这个模块。当然可以直接联网,使用pip install mpi4py命令来安装,十分方便。但是这有个问题:联网安装的mpi4py是基于mpich2的,它要求一起安装mpich2。由于笔者的电脑里原本安装有openmpi-1.10.3,使用联网安装后,虽然安上了mpi4py,但是所有mpicc, mpicxx, mpirun的环境变量都变成了mpich2的,其他软件并行时就出问题了。因此琢磨了一下基于openmpi的mpi4py的安装方法,这样有2个好处:(1)不用安装mpich2了,直接基于现有的openmpi,或者intel mpi也可以;(2)有些不方便连外网的服务器可以采用此法来安装mpi4py。(不过,连外网问题也可以解决,参看本公众号前几期文章《计算集群使用squid代理访问外网》)
笔者测试时的实际安装版本或环境:mpi4py-3.0.0,openmpi-1.10.3,Anaconda3-5.0.1的Python 3.6.3,intel2018编译器。
1.下载mpi4py 3.0.0
可以从https://pypi.python.org/pypi/mpi4py下载到压缩包。
解压 tar-zxvf mpi4py-3.0.0.tar.gz
cd mpi4py-3.0.0
2. 修改配置文件mpi.cfg
如果想基于openmpi,可以直接到该文件里的[openmpi]处,修改mpi_dir后的路径为真实路径,比如笔者电脑上是/opt/openmpi-1.10.3;如果想基于intel mpi,也可以将此处修改为系统上intel mpi的路径,比如/opt/intel/compilers_and_libraries/linux/mpi,但是要注意,下面几行的mpicc, mpicxx和library_dirs后的路径要做相应的修改,笔者电脑上intel mpi下这些路径里是bin64和lib64,而不是bin和lib。其中的include_dirs和libraries看上去没什么用,保留原样没动。
需要注意的是,基于任一种mpi,安装完后使用就必须对应的mpi。比如安装时基于intel mpi,但是安装完后把intel mpi的环境变量改成openmpi的、或者用openmpi的覆盖掉,是不行的。
3. 编译
python setup.py build --mpi=openmpi
这里的openmpi对应上一步骤的修改之处。
如果基于openmpi-1.10.3,可能会报error: Cannot link MPI programs.的错误,往上看其实是找不到libimf.so, libsvml.so, libirng.so, libintlc.so.5四个库文件,这4个库文件在intel编译器的文件夹里可以找到,但是不知道为什么无法自动识别出来。我的解决办法是将这4个库文件复制一份进/opt/openmpi-1.10.3/lib下。看到此处的小伙伴如果有什么更好的做法,欢迎留言。若是基于intel mpi,自然不会有此问题。
4. 安装
(1)若想安装在自己的目录下:
python setup.py install --user
这样会安装到/home/$USER/.local文件夹下,由于其位置特殊,不需要在.bashrc里增添mpi4py的环境变量,因为.local下的文件会自动被识别。
(2)若想安装在系统的anaconda文件夹里(如/opt/anaconda3,需要root权限):
python setup.py install --prefix=/opt/anaconda3
它其实是自动安装进/opt/anaconda3/lib/python3.6/site-packages/里去,与numpy和scipy同级的目录下。此时由于anaconda的python已有环境变量,mpi4py在其目录下可以被识别,不需要再添加环境变量。
(3)使用--prefix安装至其他指定路径,此时需要自己在.bashrc文件里添加其环境变量。如
python setup.py install --prefix=/localhome/$USER/software/mpi4py-3.0.0
相应的环境变量就是
export PYTHONPATH=/localhome/$USER/software/mpi4py-3.0.0/lib/python3.6/site-packages:$PYTHONPATH
可以看到此时它仍然会保留lib/python3.6/site-packages一长串的路径。若不想要这么长的路径名,可以进入将其中的mpi4py文件夹整个移出来即可。
5. 测试是否安装成功:
$ python
>> from mpi4py import MPI
无报错则安装成功。
参考资料:
https://pypi.python.org/pypi/mpi4py
http://mpi4py.scipy.org/docs/usrman/install.html