金属表面反应路径探索的自动化工作流程
项目描述
平塔
pynta
是一种用于金属表面反应路径探索的自动化工作流程。
该pynta
代码旨在自动表征与多相催化相关的化学反应。特别是,它产生并处理了大量从头算量子化学计算,以研究晶面上的气相反应。它设计用于在 petascale 和即将推出的 exascale 机器上运行。
该代码通过列举各种独特的晶体位点并考虑吸附物和表面的对称性,系统地将吸附物放置在晶面上。这些结构被系统地扰动,以尝试研究所有可能的吸附几何形状。在此之后,代码对这些结构进行修改,并在势能图上搜索鞍点,以表征这些吸附物可能发生的反应。经过一系列这样的计算后,代码得到了表征良好的反应途径,这些反应途径又可以用来计算速率系数,并且可以在微动力学机制/模型中实现。
pynta
旨在与工作流代码一起使用
balsam
,它可以在超级计算机上无缝运行令人尴尬的并行计算。pynta
包括几个所谓的应用程序,这些应用程序运行
balsam
,并在队列系统中显示为一个整体作业提交。从头算程序获得了另一个级别的并行性,它可能包括也可能不包括 GPU 加速。我们使用原子模拟环境 (ASE),它能够耦合到大量的从头算量子化学代码。
1.安装
以下说明假设您的系统上安装了多个软件,例如:
- 队列系统,例如
Slurm
,PBS
或Cobalt
- 一个 MPI 例如
OpenMPI
- 一个数学库,例如
OpenBlas/LAPACK
或Intel's MKL
- 编译器套件,例如
GCC
或Intel
1.1 安装所有先决条件
1.1.1 设置要用于pynta
构建的位置。建议创建一个虚拟环境,例如“pynta”:
cd <path/whr/to/build/pynta>
python3 -m venv pynta
1.1.2 激活你的虚拟环境:
source pynta/bin/activate
1.1.3(可选)安装所需的python包(如果你跳过这个过程,pynta
安装程序稍后会这样做。)
pip3 install matplotlib<3.2 spglib==1.14.1.post0 networkx<2.4 ase==3.19.0 scipy==1.3.1 numpy==1.18.1 PyYAML==5.3.1 sella==1.0.3
1.1.4 下载适合您系统的PostgreSQL预编译二进制文件并通过修改添加path_to_PostgreSQL/pgsql/bin
到您的PATH
~/.bashrc
echo 'export PATH=path_to_PostgreSQL/pgsql/bin:$PATH' >> ~/.bashrc
1.1.5 安装mpi4py:
git clone https://github.com/mpi4py/mpi4py.git
cd mpi4py
python3 setup.py install
cd ../
通过运行确保它有效
>>> mpirun -n 2 python3 -c 'from mpi4py import MPI; print(MPI.COMM_WORLD.Get_rank())'
0
1
1.1.6使用serial-mode-perf分支安装balsam 。
git clone https://github.com/balsam-alcf/balsam.git -b serial-mode-perf
cd balsam
python3 setup.py install
cd ../
通过运行发布在balsam GitHub 页面上的测试来确保它正常工作。
1.1.7 按照那里提供的说明安装xTB-python。确保正确链接所有必需的库。例如:
- 使用
OpenBlas
和GNU
基于编译器:
git clone https://github.com/grimme-lab/xtb-python.git
cd xtb-python
git submodule update --init
LDFLAGS="-L/opt/custom/OpenBLAS/0.3.7/lib" meson setup build --prefix=$PWD --libdir=xtb/xtb --buildtype release --optimization 2 -Dla_backend=openblas
ninja -C build install
pip install -e .
- 使用
MKL
和英特尔编译器:
git clone https://github.com/grimme-lab/xtb-python.git
cd xtb-python
git submodule update --init
# (ALCF's Theta specific)
# conda instal cffi
# module swap PrgEnv-intel PrgEnv-cray; module swap PrgEnv-cray PrgEnv-intel
CC=icc CXX=icpc FC=ifort meson setup build --prefix=$PWD --libdir=xtb -Dla_backed=mkl -Dpy=3 --buildtype release --optimization 2
ninja -C build install
python3 setup.py install
ln -s ./xtb/xtb/_libxtb*.so ./xtb
通过运行确保它工作:
>>> from xtb.ase.calculator import XTB
>>> from ase.build import molecule
>>> from math import isclose
>>> atoms = molecule('H2O')
>>> atoms.calc = XTB(method="GFN2-xTB")
>>> total_ener = atoms.get_potential_energy()
>>> is_close = isclose(total_ener,-137.9677758730299)
>>> print (total_ener) # True -> that's good; False -> something is wrong
警告 - 您可能会收到 SEGFAULT 错误 -
Segmentation Fault (Core dumped)
在执行任何 xTB-python
工作时,尤其是对于相对较大的分子。最简单的解决方案是不限制系统堆栈以避免堆栈溢出。在 bash
尝试:
ulimit -s unlimited
如果xTB-python
仍然失败,请尝试安装xtb并测试xTB
自身是否有任何错误。
git clone https://github.com/grimme-lab/xtb.git
cd xtb
mkdir build
pushd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_FC_COMPILER=ifort ..
make
ctest
popd
echo 'export LD_LIBRARY_PATH=path/to_xtb/xtb/build:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=$HOME/.local/bin:\$PATH' >> ~/.bashrc
然后,在您的系统上重建xTB-python
,忽略git submodule update --init
并链接您当前的xTB
安装。
1.2 安装pynta
1.2.1 将项目克隆到您喜欢的位置。
git clone https://github.com/zadorlab/pynta.git
通常,master
分支应该没问题。如果不知何故它不起作用,请确保通过检查标签切换到最新的稳定版本。
1.2.2 进入pynta
目录
cd pynta
1.2.3a 安装pynta
:
python setup.py install
1.2.3b(可选)如果您没有管理员权限(例如,您将pynta
在超级计算机上使用),请执行以下操作而不是 1.2.3a:
python setup.py install --user
你应该很好相处pynta
使用工作流程完成后,键入:
cd pynta
deactivate
2.如何运行
在运行任何pynta
计算之前,请确保您的balsam
数据库已初始化并激活,例如
balsam init ~/myWorkflow
source balsamactivate ~/myWorkflow
您的提示应更改为:
~[BalsamDB: myWorkflow] <username>@<host>:
您将需要4 个文件来运行工作流程:
run_me.py
执行工作流或restart_me.py
重新启动未完成计算的 python 脚本run_me.sh
将作业提交到balsam
数据库的 bash 脚本input.json
一个包含所有用户可修改参数的 json 文件pynta
reactions.yaml
包含要研究的所有反应的 yaml 文件
一个示例run_me.py
文件:
#!/usr/bin/env python3
from pynta.main import WorkFlow
def run():
# instantiate a WorkFlow() class
workflow = WorkFlow()
# create all input files
workflow.gen_job_files()
# execute the workflow
workflow.execute_all()
if __name__ == '__main__':
run()
一个示例run_me.py
文件:
#!/usr/bin/env python3
from pynta.main import WorkFlow
def restart():
return WorkFlow().restart()
if __name__ == '__main__':
restart()
一个示例run_me.sh
文件:
#!/bin/bash
#SBATCH -J job_name # name of the job e.g job_name = pynta_workflow
#SBATCH --partition=queue # queue name e.g. queue = day-long-cpu
#SBATCH --nodes=x # number of nodes e.g. x = 2
#SBATCH --ntasks=y # number of CPUs e.g. 2 x 48 = y = 96
#SBATCH -e %x.err # error file name
#SBATCH -o %x.out # out file name
# load your quantum chemistry calculation package or provide a path to the
# executable in 'inputR2S.py'
module load espresso
# activate balsam environment, e.g.
source balsamactivate ~/myWorkflow
# run python executable script
python3 $PWD/run_me.py
# required environment variable if using balsam branch serial-mode-perf and SLURM
export SLURM_HOSTS=$(scontrol show hostname)
# launch serial jobs
balsam launcher --job-mode=serial --wf-filter _ --limit-nodes=1 --num-transition-threads=1 &
# wait a bit to prevent timeing out you jobs before the sockets are ready
sleep 45
# launch mpi jobs
balsam launcher --job-mode=mpi --wf-filter QE_Sock --offset-nodes=x-1 --num-transition-threads=1 &
# wait until finished
wait
# deactivate balsam environment
source balsamdeactivate
一个示例reactions.yaml
文件:
- index: 0
reaction: OHX + X <=> OX + HX
reaction_family: Surface_Abstraction
reactant: |
multiplicity -187
1 *1 O u0 p0 c0 {2,S} {4,S}
2 *2 H u0 p0 c0 {1,S}
3 *3 X u0 p0 c0
4 X u0 p0 c0 {1,S}
product: |
multiplicity -187
1 *1 O u0 p0 c0 {4,S}
2 *2 H u0 p0 c0 {3,S}
3 *3 X u0 p0 c0 {2,S}
4 X u0 p0 c0 {1,S}
- index: 1
reaction: H2OX + X <=> OHX + HX
reaction_family: Surface_Abstraction
reactant: |
multiplicity -187
1 *1 O u0 p0 c0 {2,S} {3,S} {4,S}
2 *2 H u0 p0 c0 {1,S}
3 H u0 p0 c0 {1,S}
4 X u0 p0 c0 {1,S}
5 *3 X u0 p0 c0
product: |
multiplicity -187
1 *1 O u0 p0 c0 {2,S} {4,S}
2 *2 H u0 p0 c0 {1,S}
3 H u0 p0 c0 {5,S}
4 X u0 p0 c0 {1,S}
5 *3 X u0 p0 c0 {3,S}
一个示例inputR2S.py
文件:
{
"quantum_chemistry": "espresso",
"optimize_slab": true,
"surface_types_and_repeats": {
"fcc111": [
[3, 3, 1],
[1, 1, 4]
]
},
"metal_atom": "Cu",
"a": 3.6,
"vacuum": 8.0,
"pseudo_dir": "/home/mgierad/espresso/pseudo",
"pseudopotentials": "dict(Cu='Cu.pbe-spn-kjpaw_psl.1.0.0.UPF',H='H.pbe-kjpaw_psl.1.0.0.UPF',O='O.pbe-n-kjpaw_psl.1.0.0.UPF',C='C.pbe-n-kjpaw_psl.1.0.0.UPF',N='N.pbe-n-kjpaw_psl.1.0.0.UPF')",
"executable": "/home/mgierad/00_codes/build/q-e-qe-6.4.1/build/bin/pw.x",
"node_packing_count": 48,
"balsam_exe_settings": {
"num_nodes": 1,
"ranks_per_node": 48,
"threads_per_rank": 1
},
"calc_keywords": {
"kpts": [3, 3, 1],
"occupations": "smearing",
"smearing": "marzari-vanderbilt",
"degauss": 0.01,
"ecutwfc": 40,
"nosym": true,
"conv_thr": 1e-11,
"mixing_mode": "local-TF"
},
"yamlfile": "reactions.yaml",
"scfactor": 1.4,
"scfactor_surface": 1.0,
"scaled1": false,
"scaled2": false
}
有关这些关键字的含义,请查看文档
示例输入文件也位于./pynta/example_run_files/
3. 文档
此处提供了完整的文档。
致谢
如果您正在使用pynta
或希望使用它,请告诉我!
版权声明
自 2021 年 1 月 19 日起的五 (5) 年内,美国政府被授予其自身和代表其行事的其他人在此数据中复制、准备衍生作品和公开表演的已付清、非排他性、不可撤销的全球许可由政府或代表政府公开展示。有可能延长本许可期限的规定。在该期限或授予的任何延期之后,美国政府被授予其自身和代表其行事的其他人在此数据中复制、准备衍生作品、向公众分发副本、执行公开和公开展示,并允许他人这样做。具体许可期限可向桑迪亚国家技术与工程解决方案公司查询,
美国政府、美国能源部、SANDIA, LLC 的国家技术和工程解决方案公司及其任何员工均不对准确性、完整性作出任何明示或暗示的保证,或承担任何法律责任,或披露的任何信息、设备、产品或过程的用途,或表示其使用不会侵犯私有权利。
本软件的任何被许可人都有义务和责任遵守适用的出口管制法律、法规和与技术数据出口有关的一般禁令。未能从政府获得出口管制许可证或其他授权可能导致根据美国法律承担刑事责任。
许可通知
版权所有 2021 Sandia, LLC (NTESS) 的国家技术与工程解决方案。根据与 NTESS 签订的合同 DE-NA0003525 的条款,美国政府保留对该软件的某些权利。