导言

  • 硬件:个人电脑(i5-8300H,32G,1050TI),学校的超级计算机,研究室的工作站。
  • 资料来源:哔哩哔哩/YouTube,SegmentFault

应用方向偏物理学背景的数据分析,但是一切都是0基础开始的。Python基础入门我是通过在线学习进行的:https://vitu.ai/

在超级计算机上配置meep

设备:JAIST 超级计算机

因为要做一些FDTD/电磁学仿真,但是用个人PC又很蛋疼,所以就选择在超算上搭一个meep的仿真环境,这样会非常省时间。我所参考的是MEEP官方文档https://meep.readthedocs.io/en/latest/Installation/

miniconda 的安装

在自己的目录下建立一个python文件夹,学校超算已经预装了python3的环境,所以只要照着官方文档来安装就好了。

1
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh

下载miniconda的包,是python3版本的。然后

1
bash miniconda.sh -b -p <desired_prefix>

注意这里的是要解压的目录,**要自己设定!**,这里我放到python下面的meep。
之后

1
export PATH=<desired_prefix>/bin:$PATH

会报错

1
export: command not found

难道我的SHELL有问题??所以先查看SHELL信息

1
echo $SHELL

返回

1
/bin/tcsh

原来是tcsh不是bash!!怪不得报错。在这种情况下,直接回到本人账户目录下,手动添加path信息到.cshrc文件里就行了

1
vim ~/.cshrc

但是我多次测试之后还是无法执行,可能是因为账户权限限制导致(另外学校超算的SHELL为什么是tcsh而不是bash啊orz),就只能手动用setenv命令执行了

1
2
setenv PATH "<desired_prefix>/bin"
setenv PATH <desired_prefix>/bin:$PATH

之后就成功了,缺点是估计下次使用conda命令时要重新手动执行一下这个命令。然后创建一个名字为mp的环境,在里面安装meep。这里的mp可以是任意名字的

1
conda create -n mp -c chogan -c conda-forge pymeep

然后就是漫长的安装过程了。安装好之后突然跳出这么一个错误:

1
Exception('No compatible shell found!')

没有管,继续

1
conda activate mp

结果报错了!提示用conda init来指定shell。
看来是SHELL的选择问题,只能手动来了,为了方便,我选择tcsh,所以输入

1
2
conda init tcsh
exec /bin/tcsh -l

然后激活mp这个环境

1
conda activate mp

没有报错,并且目录前显示(mp),说明激活成功!!之后就应该可以使用了,但是为了方便使用,直接装一个Jupyter比较好,这里我也是参考官方的文档https://jupyter.org/install

在这个miniconda的目录下执行:

1
conda install -c conda-forge jupyterlab

之后就是漫长的安装与等待,有时会提示让升级conda的版本,这个是可以忽略的jupyterlab是jupyter notebook的下一代产品(替代品),因此我也就不安装jupyter notebook了。虽然也可以用pip命令来安装,但是要配置PATH太过复杂了所以就用conda命令了。在安装完之后,执行:

1
jupyter lab

就会跳出一个浏览器窗口,在里面可以使用jupyter lab了。

但是,在使用时发现找不到包!!可是conda list是有包的!
于是

1
conda search pymeep

返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Loading channels: done
No match found for: pymeep. Search: *pymeep*

PackagesNotFoundError: The following packages are not available from current cha nnels:

- pymeep

Current channels:

- https://repo.anaconda.com/pkgs/main/linux-64
- https://repo.anaconda.com/pkgs/main/noarch
- https://repo.anaconda.com/pkgs/r/linux-64
- https://repo.anaconda.com/pkgs/r/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

https://anaconda.org

and use the search bar at the top of the page.

解决方法是配置一下conda,输入

1
conda config --append channels conda-forge

这个时候

1
python -c 'import meep'

就不会报错了,说明总体上是安装成功了,且能运行。但是可能会有其他问题,如

1
AttributeError: module 'meep' has no attribute 'Vector3'

但是我用同样的方法在虚拟机上安装,跑同样的代码就没有出现这个问题。很可能是超算上python版本的问题。不过总体上这个安装方法是正确的,跑一些简单代码还是可以的。至于一些错误的解决方法之后会更新。

不过终究还是要用的,所以我尝试在工作站(DELL PowerEdge T620)上通过安装Linux for Windows 然后用上述方法进行安装,毕竟这个工作站的配置也不算低了,勉强能用。虽然因为不知名原因IEER1的问题一直解决不了(即使毫无大碍)。

关于WSL的安装与设置方法我是参考这里来弄的:https://zhuanlan.zhihu.com/p/61542198

开启Ubuntu之后先对vim进行美化,毕竟是要给老板展示装逼用的….具体的就不说了,代码如下:

1
2
3
4
5
mkdir .vim
cd .vim
git clone https://github.com/tomasr/molokai.git
cp -rf molokai/colors/ ./colors
vim vimrc

打开vim之后添加如下代码,然后:wq退出

1
colorscheme molokai

之后创建一个meep文件夹,然后安装miniconda,由于这里的shell是默认bash的,因此直接copy很酸爽。命令依次如下:

1
2
3
4
mkdir meep
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh
bash miniconda.sh -b -p miniconda //这里我解压到miniconda文件夹里
export PATH=/root/meep/miniconda/bin:$PATH //设置PATH变量

之后就是安装meep的步骤了,和上述方法也是完全一样的。命令依次如下:

1
2
3
4
conda create -n mp -c chogan -c conda-forge pymeep //创建名为mp的虚拟环境以安装pymeep包
conda init bash //配置shell
exec /bin/bash //配置shell
conda activate mp //激活环境

之后我在该环境下安装jupyterlab

1
conda install -c conda-forge jupyterlab

但是在打开jupyterlab的时候出现报错

1
Running as root is not recommended. Use --allow-root to bypass.

解决方法是:

1
jupyter notebook --generate-config --allow-root

然后vim生成的配置文件,之后

1
#c.NotebookApp.allow_root = False  //去掉#,并修改成True即可解决root权限运行的问题

为了啊wsl当中合理使用不报错,最好是使用这个命令然后手动复制地址到浏览器!

1
jupyter-notebook --no-browser

但是配置之后,meep还是无法正常使用orz…这里做一个统计,在超算,个人电脑的虚拟机上用上述方法安装,都是成功并且能跑一些简单代码的。而在工作站wsl上是不成功的…我放弃了…
但是!!!!在我重新创建了一个虚拟环境之后,所有指令又都能用了!!!一切又都正常了!!!!真是搞不懂啊!!!但好歹是成功了!!

ORCA的并行计算脚本

这个脚本是我基于JAIST官网的教程在Gaussian并行计算脚本的基础上改的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/csh
#PBS -l select=1:ncpus=128:mpiprocs=128
#PBS -j oe
#PBS -q SMALL
#PBS -N ORCA

cd $PBS_O_WORKDIR

source /etc/profile.d/modules.csh

module load openmpi/4.1.1/
setenv OMPI_ALLOW_RUN_AS_ROOT=1
setenv OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1

setenv PATH=/home/USER_ID/orca/orca/:$PATH
setenv LD_LIBRARY_PATH=/home/USER_ID/orca/orca/:$LD_LIBRARY_PATH

### Gaussian Scratch file is saved in current directory ###
setenv ORCA_SCRDIR $PBS_O_WORKDIR

echo "-P-16" > Default.Route

~/orca/orca/orca example.inp> example.out

rm -f ./Default.Route

注意USER_ID是用户目录的用户名,ORCA文件的输入与输出格式也要规范!ORCA的计算最好是32核-64核,但是每个核分的内存要大一点,最好3GB/Core!!

Gaussian中使用混合(赝势)基组的输入格式问题

这个问题在思想家公社中有详细说明过,原文链接:http://sobereva.com/60

但是,在实践当中会有一个容易出错的地方,就是“空格(=空一行)”在格式中的重要关系,在重金属离子配合物的计算体系下这可能会是重要问题!!以下用PBE0泛函混合赝势基组做演示,分子是一个含钆和银的有机配合物:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
%nprocshared=128
%mem=480GB
%chk=任务名称.chk
#p opt freq=raman cphf=rdfreq pbe1pbe/genecp scrf=(smd,solvent=water) em=gd3bj //cphf=rdfreq是指读取场的入射光,进而实现对在某波长的激发下的计算

SERS-Gd-opt

0 8 //体系电荷 自旋多重度
坐标部分

488nm 532nm //入射光波长

C H O //定义元素与使用的基组
aug-cc-pvdz
****
Ag 0
S 3 1.00
9.0884420000 -1.9808918797
7.5407310000 2.7554513347
2.7940050000 .22715408381
S 1 1.00
1.4918135849 1.0000000000
S 1 1.00
.63579159445 1.0000000000
S 1 1.00
.10368414161 1.0000000000
S 1 1.00
.37460004363E-01 1.0000000000
P 4 1.00
4.4512400000 -.99352103771
3.6752630000 1.0500525237
1.2610620905 .64747532537
.54212477498 .25621550723
P 1 1.00
.20221617026 1.0000000000
P 1 1.00
.0412 1.0000000000
D 4 1.00
7.7956672292 -.17042912377E-01
2.8926510238 .23446154803
1.2474273203 .44765877533
.49313817671 .39064954560
D 1 1.00
.17285032603 1.0000000000
F 1 1.00
1.39711 1.0
P 1 1.00
0.91300000000E-01 1.0000000000
! D. Rappoport, F. Furche; J. Chem. Phys. 133, 134105 (2010).
****
GD 0
S 5 1.00
70672.982000 0.13500000000E-03
10580.420000 0.10060000000E-02
2467.2196000 0.46050000000E-02
710.30550000 0.13577000000E-01
223.69340000 0.20915000000E-01
S 1 1.00
42.884500000 1.0000000000
S 1 1.00
30.595200000 1.0000000000
S 1 1.00
15.792300000 1.0000000000
S 1 1.00
3.9598000000 1.0000000000
S 1 1.00
2.0077000000 1.0000000000
S 1 1.00
0.74940000000 1.0000000000
S 1 1.00
0.32410000000 1.0000000000
S 1 1.00
0.57800000000E-01 1.0000000000
S 1 1.00
0.23700000000E-01 1.0000000000
P 6 1.00
1547.5176828 -0.27484377768E-03
341.04355363 -0.22027518871E-02
100.44808811 -0.74993330072E-02
25.638724200 -0.75632911948E-01
15.897630316 0.24448929000
3.5643308647 -0.26400163004
P 3 1.00
8.3793352896 -0.11016848999
4.7567465018 -0.24310255997
2.1155437701 -0.18589755998
P 1 1.00
1.2378242468 1.0000000000
P 1 1.00
0.57874986425 1.0000000000
P 1 1.00
0.25295715243 1.0000000000
P 1 1.00
0.78345762145E-01 1.0000000000
P 1 1.00
0.28325755449E-01 1.0000000000
D 6 1.00
406.09940000 0.65500000000E-03
122.42050000 0.53410000000E-02
46.367900000 0.22180000000E-01
20.728900000 0.29630000000E-01
7.9773000000 0.28827000000
4.1175000000 0.44967800000
D 1 1.00
2.0783000000 1.0000000000
D 1 1.00
0.98880000000 1.0000000000
D 1 1.00
0.33890000000 1.0000000000
D 1 1.00
0.10370000000 1.0000000000
F 5 1.00
128.70520000 0.39700000000E-02
46.564700000 0.38735000000E-01
20.888200000 0.13395800000
9.5233000000 0.26283500000
4.3476000000 0.35391100000
F 1 1.00
1.9241000000 1.0000000000
F 1 1.00
0.79260000000 1.0000000000
F 1 1.00
0.28550000000 1.0000000000
G 1 1.00
0.47570000000 1.0000000000
D 1 1.00 //这部分是自己粘贴的弥散函数部分,从论文里找即可
0.31503485777E-01 1.0000000000 //并且不需要刻意在意插入地方,格式对齐即可
! Weigend, Gulde, Pollak (2012)
****
//空格,用于分开基组和赝势部分
GD 0 //定义第一个元素,随后是其赝势信息
GD-ECP 5 28
h POTENTIAL
1
2 1.00000000 0.00000000
s-h POTENTIAL
1
2 24.60215100 637.20086900
p-h POTENTIAL
1
2 16.88925000 261.68960100
d-h POTENTIAL
1
2 13.64335800 106.85653300
f-h POTENTIAL
1
2 24.12691700 -50.68359000
g-h POTENTIAL
1
2 22.13188700 -27.57963000
AG 0 //定义第二个元素和它的赝势信息
AG-ECP 3 28
f POTENTIAL
2
2 14.22000000 -33.68992012
2 7.11000000 -5.53112021
s-f POTENTIAL
4
2 13.13000000 255.13936452
2 6.51000000 36.86612154
2 14.22000000 33.68992012
2 7.11000000 5.53112021
p-f POTENTIAL
4
2 11.74000000 182.18186871
2 6.20000000 30.35775148
2 14.22000000 33.68992012
2 7.11000000 5.53112021
d-f POTENTIAL
4
2 10.21000000 73.71926087
2 4.38000000 12.50211712
2 14.22000000 33.68992012
2 7.11000000 5.53112021
! D. Andrae, U. Haeussermann, M. Dolg, H. Stoll, H. Preuss; Theor. Chim. Acta 77, 123 (1990).

综上所述,不难看出常规正确格式可以总结为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
计算信息(CPU核数,内存,输出路径)
计算指令(关键词)
【空格】
任务名字(可以随便起)
【空格】
体系电荷 自旋多重度
坐标部分
【空格】
元素1
基组1
****
元素2
基组2 //之后以此类推
【空格】
元素1
赝势1
元素2
赝势2
【空格】

也就是说,每个元素的赝势信息部分是不需要加空格(空行)的!不然会导致后来的赝势信息无法被读取,从而计算出错!!

超级计算机上使用MPI调用Gaussian做并行计算的脚本

学校超算是128核的双路CPU(64×2)节点。默认是分16核的,以及会给一个写好的32核的脚本。这里我展示一下单节点计算和多节点并行计算的CSH脚本,是自己调试的。

关于PBS设置,基本格式是:

1
#PBS -l select=<节点数>:ncpus=<每节点核数>:mpiprocs=<每个节点进程数>

如果选择单个节点跑满128核并行计算,脚本是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/csh
#PBS -j oe -l select=1:ncpus=128:mpiprocs=64 //单节点,128核,并行的进程64
#PBS -N G16 //调用Gaussian

##################################################
### Job Script for SuperComputer ###
### 16 Core , 64GB Mem Job for Gaussian16 ###
### 2023-4-30 TEST ###
##################################################
##
## To use multicore, don't forget to change Link0 option of setup file.
##


cd $PBS_O_WORKDIR //作业目录

mpirun -machinefile ${PBS_NODEFILE} -np 128 ./hello_mpi //执行

source /etc/profile.d/modules.csh

module load g16/c.01

### Gaussian Scratch file is saved in current directory ###
setenv GAUSS_SCRDIR $PBS_O_WORKDIR

echo "-P-16" > Default.Route

g16 < 输入文件.gjf > 输出文件.out

rm -f ./Default.Route

如果是多个节点并行计算,比如单节点64核,直接2节点并行跑64核,脚本是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/csh
#PBS -j oe -l select=2:ncpus=64:mpiprocs=32 //2个节点,每个节点出64核,32进程/节点
#PBS -q 节点名 //该节点不支持单节点满载,最大支持64核
#PBS -N G16

##################################################
### Job Script for SuperComputer ###
### 16 Core , 64GB Mem Job for Gaussian16 ###
### 2023-4-30 TEST ###
##################################################
##
## To use multicore, don't forget to change Link0 option of setup file.
##


cd $PBS_O_WORKDIR //作业目录

mpirun -machinefile ${PBS_NODEFILE} -np 64 ./hello_mpi //执行

source /etc/profile.d/modules.csh

module load g16/c.01

### Gaussian Scratch file is saved in current directory ###
setenv GAUSS_SCRDIR $PBS_O_WORKDIR

echo "-P-16" > Default.Route

g16 < 输入文件 > 输出文件

rm -f ./Default.Route

基于我个人的测试,单节点128核+128进程,单节点128核+64进程,单节点32核+32进程,对于同一个隐式水环境中柠檬酸钠的结构优化+频率计算的问题,耗时如下:

1
2
3
select=1:ncpus=128:mpiprocs=128 
Job cpu time: 0 days 11 hours 5 minutes 37.9 seconds.
Elapsed time: 0 days 0 hours 5 minutes 16.9 seconds.
1
2
3
select=1:ncpus=128:mpiprocs=64 
Job cpu time: 0 days 10 hours 52 minutes 5.5 seconds.
Elapsed time: 0 days 0 hours 5 minutes 10.7 seconds.
1
2
3
select=1:ncpus=32:mpiprocs=32
Job cpu time: 0 days 3 hours 46 minutes 39.0 seconds.
Elapsed time: 0 days 0 hours 7 minutes 6.1 seconds.

比较Elapsed time,可见最优设置是128核+64进程。实际运行当中128核时差不多40分钟,而32核时是52分钟左右,当体系更复杂一些,这样的耗时差距也会更大!