愿本文能将小猪们从代代相传的诅咒1中解救出来

简介

CosmoMC是估计宇宙学参数的标准工具,主体是马尔科夫链蒙特卡罗(MCMC)引擎,并且集成了重要性采样和用于分析马尔科夫链的fortran/python代码,当然也可以用作一般的抽样工具

CosmoMC本身的安装并不复杂,但因为是设计为在集群上跑的,需要预装相当很多科学计算方面的软件和库,这些软件和库对于大多数人来说都是很陌生的,并且根据你选择的预装软件,每步安装的命令会稍微有所不同,对刚刚进入这个领域,急着开始干活的萌新们相当不友好2

下面我会尽可能的(在我知识范围以内3)给出详细的步骤,讲明白为什么要这么做,每个参数是什么意思,并且在文尾附上大量参考的网页(这些网页大多是我安装过程中搜罗的)。本文的步骤和代码一定会过时,但我希望后来者仍能沿着我的脚印走到更远的地方

环境和预配置

本文的安装是在VirtualBox虚拟环境中进行的,使用的是Linux系统,发行版为Ubuntu 18.04LTS

原则上使用Windows系统也能完成安装,但有很多不去这么做的理由

首先要确认一下你是否有root权限,与Windows不同,Linux对权限的控制很严格。如果你是在个人电脑上安装,那不会有什么问题请继续往下看;如果你准备在服务器/集群上安装,但又没有相应的管理员帮你配置好一切,你也没有root权限,请确保这节中的软件已经安装在服务器上了

sudo apt install gcc g++ build-essential
sudo apt install tar gzip
sudo apt install git

gccg++用于编译c和c++文件,build-essential是运行make命令必须的;后两者用于解压文件;最后一个用于下载cosmomc。如果你发现你安装的速度很慢,请去这个网站换一下apt源,可以运行sudo mv /etc/sources.list /etc/sources.list.bak做备份,然后sudo gedit /etc/sources.list把网站上的内容复制/写进去(某些发行版不会预装vim,如果已经预装了可以使用vim编辑,如果没有图形界面那么还是先装vim吧)

此外,你还需要一个python。这里推荐使用conda环境,管理和python有关的一切。请去这个网站,根据指引安装miniconda并更换conda源,关于conda安装使用网上有很丰富的教程,这里不再赘述。记得创建一个新的conda环境,然后安装conda install pip(也有可能创建时默认已经帮你装好了),运行which pip确认你使用的是conda环境提供的pip,这样所有通过pip安装的软件都属于这个conda环境,便于管理,也不容易起冲突

CosmoMC主体是由Fortran03/08写成的,首先我们需要一个Fortran编译器,这里有两种选择:Intel Fortran Compiler(ifort)和gfortran,根据选择的不同,接下来的步骤会稍微有些区别。前者编译出来的代码运行速度更快,并且可以和著名的高性能运算库MKL一同下载,但是缺点是体积庞大,后续安装的过程中容易出问题;后者轻量级并且能极大简化后续的安装,缺点是编译速度较慢。本文将会同时讲解两者的安装,但是我在安装ifort的后续过程中出了一些问题,所以最后安装并且确认成功运行的是gfortran,因此只能对使用ifort的步骤给出指导性建议(但曾经成功安装使用过ifort),这些建议将会以引用的形式呈现

如果选择gfortran

sudo apt install gfortran

如果选择ifort,请去这个网站申请学生免费使用的资格,需要有校邮箱,大概两天左右回复,可以白嫖一个全功能的Intel Parallel Studio xe cluster edition,这个Studio包含ifort

CosmoMC可以并行运行,因此我们需要安装一个并行软件/库,这里选择openmpi,请去这个网站下载。如果上面选择的是gfortran,你可以直接从apt安装,但是版本会比较老,具体见下下节

如果选择ifort,你有两种方案,一种是使用parrallel studio cluster edition附赠的intel MPI,但CosmoMC官方的readme中提到,2019版本(可能包括更新的2020版)的intel MPI使用有问题,因此下载parallel studio时你需要2018及以前的版本;一种还是使用openmpi,但这时你不能从apt安装openmpi,必须手动编译。这是因为openmpi似乎只适配编译它的编译器,而从apt获取的是用gfotran编译的。前者我并没有实际操作过,只能道听途说了。4

运行

git clone --recursive https://github.com/cmbant/CosmoMC.git

下载CosmoMC,注意,如果直接从github网站上下载zip安装包是不完整的。由于国内对git的访问限制,下载非常容易失败,请通过科学上网解决

如果5你需要安装使用Planck Likelihood/Data,你需要额外装些东西

首先需要cfitsio,这个库能帮助我们读取fits文件——Planck的data就是用fits文件组织的。去这个网站下载

然后是Planck的Likelihood Code以及baseline data。在这个网站选定Likelihood按钮,然后下载代码COM_Likelihood_Code-v3.0_R3.01.tar.gz和baseline数据COM_Likelihood_Data-baseline_R3.00.tar.gz,如果你还需要使用Planck Release2的Likelihood和data来follow一些比较老的文章,请去掉页面上的"Only legacy products"勾,然后选择PR2,下载baseline数据COM_Likelihood_Data-baseline_R2.00.tar.gz,代码则在这里下载,因为网页上的版本只能通过python2编译

这样我们就完成了所有准备工作

ifort/gfortran的安装配置

如果选择gfortran,那么很简单

sudo apt install gfortran

如果选择ifort,下载完成后解压

tar -xf [your parallel studio package] -C [path where you want to unzip]
cd [your path]
./install_GUI.sh

如果没有图形界面请运行./install.sh。如果你运行了sudo ./install_GUI.sh,默认的安装目录在/opt/intel,否则在/home/[username]/intel。安装在后者可能会导致一些问题,但我不是很确定是不是这个原因

根据指引一路安装下去,注意有些包你是不需要的,节省空间起见,我建议只安装intel inspector,intel C++ Compiler,intel Fortran compiler和两个MKL库,以及一个勾选C++编译器就会自动勾选的Intel Threading Building Blocks。当然如果你要用Intel MPI,你可能还会安装Analyzer之类的包,取决于你。注意customize界面上面有个IA32的小框,记得不要勾选,勾选之后会安装32位支持,并且似乎会导致MKL安装在32位模式

安装完毕后需要将iccifort添加到路径(也就是告诉终端我们在哪找icc和ifort),一般我们想要开机后就已经完成添加了,因此编辑vim ~/.bashrc,在文件最后加上source [path]/intel/xxx.sh(这里具体是多少有点忘了,只需要source一个整体的.sh文件即可,这样可以把所有需要的东西都添加到路径)。保存然后source ~/.bashrc,在终端中输入ifort -Vicc -V可以看到当前的Intel编译器版本,说明安装成功

openmpi的安装和配置

如果你使用gfortran并且想通过apt安装,那么运行如下命令即可

sudo apt install openmpi-bin openmpi-doc libopenmpi-dev

如果想自行编译安装,我这里以使用ifort编译器的情况为例

tar -xf [openmpi package name] -C [path where you want to unzip]
./configure --prefix=[path where you want to install] CC=icc CXX=icpc FC=ifort
make
make install

这里要注意一下权限问题,虽然不是很确定,但是很可能我无数次安装失败都是这个问题。--prefix指定安装的目录,如果这个目录你没有写权限,那么最后make install需要用sudo make install替代。如果不指定--prefix那么运行make install会默认安装在/usr/local/,而运行sudo make install会安装在/usr/,前者是local的用户安装包的位置,后者一般是为包管理器安装的程序准备的。注意这里CXX=icpc而不是CXX=icc,否则会引起大量的编译错误

另外如果intel编译器安装在了用户目录,似乎运行sudo make install的时候会出现找不到iccifort的错误,但我不是很确定,保险起见安装在/opt/intel更好一些

最后需要把二进制程序和库文件添加到路径,在~/.bashrc末尾添加

export PATH="[your path/bin]":${PATH}
export LD_LIBRARY_PATH="[your path/lib]":$LD_LIBRARY_PATH

然后source ~/.bashrc

运行mpifort --versionmpicc --version以及mpirun --version,前两者输出所关联的编译器的版本信息,后者输出openmpi相关信息,说明安装成功

CosmoMC的安装

在解压后的文件夹中执行命令make,如果之前的步骤都是正确的话,编译应该会通过

然后运行

mpirun -np 4 ./cosmomc params.ini

可以跑一个二维高斯分布的抽样测试,如果测试成功运行则说明安装成功

cfitsio的安装

cfitsio的安装和openmpi类似,运行

tar -xf cfitsio_latest.tar.gz -C [path where you want to unzip]
cd [path]
./configure --prefix=/usr/local/cfitsio --enable-sse2 --enable-ssse3 --enable-reentrant
make
sudo make install

和前面的说明一致,这里--prefix=/usr/local/cfitsio设置了一个你可能没有读写曲线的文件夹,因此需要加sudo make install,当然换其他文件夹也是可以的。--enable-reentrant选项允许cfitsio以多线程打开一个文件,从而有效提高读写速度,如果不设置的话,在依赖cfitsio的软件运行时可能会报错。另外两个选项是加速算法,提高构建速度。安装完成后添加到系统路径export LD_LIBRARY_PATH=/usr/local/lib/cfitsio:${LD_LIBRARY_PATH},然后source ~/.bashrc

Planck相关的代码编译和安装

tar -xf COM_Likelihood_Code-v3.*.tar.bz2 -C [where I want to unzip]
cd [path]/plc-3.0
./waf configure --cfitsio_prefix=/usr/local/cfitsio

注意,这里你还可以指定安装位置--prefix=[...],如果openmpi是手动编译的,还需要添加openmpi的路径。这里没有添加--install_all_deps选项,因为我不想自动安装的依赖安装在奇怪的地方

如果使用的是intel编译器,会附送一个mkl库给你,你需要在选项里添加mkl库的位置--lapack_mkl=${MKLROOT}

然后程序会运行一系列检查,你只需要对照检查表上not found的项目,一个一个安装后再次configure一遍

这里我忽略了几项,似乎对实际使用也没有影响

Asking python-config for pyembed '--cflags --libs --ldflags --embed' flags : not found
checking for RTLD_DEFAULT in dl                                            : no
pmc-config : not found

默认的检查循序会先检查ifort然后gfortran,因此使用ifort的话也不用在选项中设置

我实际缺少的是cythonastropy(或者作为下位替代的pyfits),这两者可以直接通过conda安装,运行conda install cython astropy

另外还缺少lapack库和blas库,这两者可以通过apt获得,运行sudo apt install liblapack-dev libblas-dev即可。如果想手动编译安装的话,流程应该类似cfitsio

如果使用的是ifort,不用安装lapack和blas库,因为这两者都已经包含在mkl中了(只要安装的时候勾上了即可)

检查通过之后运行./waf install安装

然后添加到路径,即运行命令

cd [your path]
source [your path]/bin/clik_profile.sh
echo -e "\nsource $(pwd)/bin/clik_profile.sh" >> ~/.bashrc

如果你同时安装了plc-2.0和plc-3.0,注意两者应该只source一个,不然可能会发生冲突

对于baseline data,解压到某个路径,然后切换到CosmoMC所在的目录,创建符号链接

cd COSMOMC...PATH
ln -s DATA...PATH/plc_3.0 ./data/clik_14.0

对于plc-2.0的data,需要做不同的链接

cd COSMOMC...PATH
ln -s DATA...PATH/plc_2.0 ./data/clik

然后make编译CosmoMC,如果按照流程,会发现没有发生变换,这是由make的机制决定的,因此可以cd COSMOMC...PATH/source,然后改变其中一个文件的时间戳sudo [anyfile].f90。再次make就将Planck Likelihood Code编译进去了。

运行mpirun -np 1 ./cosmomc test_planck.ini测试是否安装成功,我安装的时候报了两个警告Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_UNDERFLOW_FLAG,这应该是Plik中一些不合法的运算以及往下溢出导致的,只要能够正常运行,这样的警告是可以忽略的,因为很常见

如果你想测试plc-2.0是否安装成功,需要旧版的planck.ini配置,但是这个配置没有包含在最新版内。我将旧版的配置文件附在下面

#Check that the Planck likelihood files run OK, see readme_planck.html to set up
#Planck 2015, default just include native likelihoods (others require clik)
DEFAULT(batch2/plik_dx11dr2_HM_v18_TT.ini)
DEFAULT(batch2/lowTEB.ini)

#For low TT without pol
#DEFAULT(batch2/lowl.ini)

#Other settings same as test.ini
#NOTE: I copied old version test.ini here
#general settings
#Bicep-Keck-Planck, varying cosmological parameters
DEFAULT(batch2/BKPlanck.ini)

#Planck 2015, default just include native likelihoods (others require clik)
#DEFAULT(batch2/plik_dx11dr2_HM_v18_TT.ini)
#DEFAULT(batch2/lowTEB.ini)
#DEFAULT(batch2/lowl.ini)
DEFAULT(batch2/lensing.ini)

#Other Likelihoods
#DEFAULT(batch2/BAO.ini)
#DEFAULT(batch2/WiggleZ_MPK.ini)
#DEFAULT(batch2/MPK.ini)
#DEFAULT(batch2/WL.ini)

#general settings
DEFAULT(batch2/common.ini)

#e.g. to vary r in addition to standard 6:
#(for r>0 also need compute_tensors=T)
#compute_tensors = T
#param[r] = 0.03 0 2 0.04 0.04

#high for new runs
MPI_Max_R_ProposeUpdate = 30

propose_matrix= planck_covmats/base_TT_lowTEB_plik.covmat

#Folder where files (chains, checkpoints, etc.) are stored
root_dir = chains/

#Root name for files produced
file_root=test
#action= 0 runs chains, 1 importance samples, 2 minimizes
#use action=4 just to quickly test likelihoods
action = 4

#expected result for -(log like)

num_threads = 0

#if you want to get theory cl for test point
#test_output_root = output_cl_root

start_at_bestfit =F
feedback=1
use_fast_slow = T

checkpoint = F

#sampling_method=7 is a new fast-slow scheme good for Planck
sampling_method = 7
dragging_steps  = 3
propose_scale = 2

#Set >0 to make data files for importance sampling
indep_sample=10

#these are just small speedups for testing
get_sigma8=T

#Uncomment this if you don't want one 0.06eV neutrino by default
#num_massive_neutrinos=
#to vary parameters set param[name]= center, min, max, start width, propose width
#param[mnu] = 0 0 0 0 0


#for PICO install from https://pypi.python.org/pypi/pypico and download data file
#cosmology_calculator=PICO
#pico_datafile = pico3_tailmonty_v34.dat
#pico_verbose=F


#Uncomment if you want to include priors even when parameters fixed
#include_fixed_parameter_priors = T

#expected result for -(log like)
test_check_compare = 5859.141

但是我在运行这个配置的时候发现并不能通过测试,实际的likelihood和跑出来的结果之间差了大概2左右,这可以解释成随机偏差(实际是需要跑很多遍的),或者过时的语法带来的运算精度问题。只要偏差不是非常多,可以理解成安装成功了。

Reference

  1. CosmoMC官方的readme
  2. CosmoMC官方提供的虚拟环境
  3. CosmoMC官方关于安装Planck Likelihood的说明
  4. arXiv上关于CosmoMC安装的指导
  5. 知乎上关于安装CosmoMC的教程
  6. 关于在conda环境中使用pip的官方说明以及可以参阅一些最近的Release Notes
  7. python3版本的planck likelihood code for PR2
  8. Intel官方关于安装intel parallel studio xe的指引
  9. Intel Parallel Studio官方关于安装openmpi的指引
  10. openmpi官方文档里的关于用intel编译器编译的注意事项
  11. 关于make install和sudo make install
  12. GNU关于cfitsio安装的说明
  13. cfitsio官方的安装说明
  14. IEEE_INVALID_FLAG and IEEE_UNDERFLOW_FLAG

  1. 曾经问过师兄应该怎么安装这个软件,他说他折腾了一周也没安装上,于是放弃了,乖乖用集群上的module。我前前后后加起来也差不多花了同样的时间
  2. 再加上小猪们层次不齐的计算机水平,更是雪上加霜——甚至可能第一次接触Linux系统
  3. 如果我什么都懂,那我也不会花费大量时间安装这个东西了,如果有什么地方有疑问或者没法进行,请在评论区留言
  4. Intel MPI只有使用最贵的cluster edition才提供完整的功能,因此基本上都是/不得不使用免费的openmpi
  5. 其实是几乎必定要使用的