thumbnail image


  • 首页
  • Deepmd-kit
  • DP-GEN
  • GPUMD
  • 使用经验
  • …  
    • 首页
    • Deepmd-kit
    • DP-GEN
    • GPUMD
    • 使用经验


    • 首页
    • Deepmd-kit
    • DP-GEN
    • GPUMD
    • 使用经验
    • …  
      • 首页
      • Deepmd-kit
      • DP-GEN
      • GPUMD
      • 使用经验


      • DP-GEN  使用入门

        简介

        Deep Potential Generator (DP-GEN) 是一个将神经网络势能(machine learning potential)和主动学习(active learing)结合起来的工作流。该包主要由张林峰(普林斯顿大学),王涵(北京应用物理与计算数学研究所)开发。如有问题,可以向他们询问。使用DP-GEN之前,应尽量掌握DeepMD-kit、VASP、LAMMPS等软件的使用或拥有一定了解。
         

        以下为参考信息:

        • GitHub
        • 参考文献:Active learning of uniformly accurate interatomic potentials for materials simulation

        DP-GEN的工作流是由以下三步组成的循环:

        • 训练:DeePMD-kit同时训练多条(一般是4条)参数初始化不同的势函数(GPU)。
        • 采样和筛选:基于训练得到的势函数和指定的初始结构利用LAMMPS进行classical MD,扩展构型空间。然后对MD中得到的构型依照特定指标(对某个构型用不同的势函数预测所得的原子力的标准差)进行筛选(GPU)。
        • 标记:将筛选所得的构型进行DFTMD单点能计算,得到力和能量,加入训练集进行新一轮的训练(51或52)。

        安装

        通过下列命令可以下载dpgen源码

         

        git clone https://github.com/deepmodeling/dpgen.git

         

        然后可通过下列命令进行安装

         

        cd dpgen
        pip install

         

        通过这个命令,dpgen被安装在 $HOME/.local/bin/dpgen目录下. 更新环境变量以使用dpgen

         

        export PATH=$HOME/.local/bin:$PATH

         

        通过下列命令查看是否安装成功

         

        dpgen -h

        输入文件

        为了使dpgen运行起来,我们需要准备如下的文件:

        • param.json

          三步计算中所用的参数,具体指神经网络训练的参数,lammps中MD的参数和DFTMD计算单点能的参数。

        • machine.json

          制定上述三个步骤分别在哪个服务器计算。

        注:machine.json只指定计算执行的地址,计算生成的数据存储在param.json和machine.json所在文件夹下,计算所需的训练集和结构文件在param.json中指定路径(位于dpgen run命令所在服务服务器上)。
        • 初始训练集数据

          放在提交dpgen所在的服务器(E.T.Lab集群)上,用于训练势函数,参照DeePMD-kit中方法生

        • MD采样的初始结构

          放在提交dpgen所在的服务器(E.T.Lab集群)上,一般由POSCAR转换而来,可通过dpgen init生成。

        • 此外,使用VASP进行标记过程时,还需要在文件夹中准备INCAR文件,POTCAR文件,KPOINTS通过在INCAR中的参数进行指定。

        输出文件

        在提交dpgen的文件夹下会出现以下输出文件,用于指示任务运行的状况:

        • dpgen.log

          包括了运行轮数,单个任务提交的情况,采样准确度等详细的信息。

        • record.dpgen

          由多行 x y 组成,记录任务进程。其中x为运行的轮数(iteration),从0开始;y取0-8,其中0-2指代训练,3-5指代采样和筛选,6-8指代标记。

          dpgen通过读取这个文件来决定从哪里重启计算,所以我们可以通过手动修改这个文件来决定重启的点。例如,在第x轮中我们发现采样的准确度过低,需要增加初始结构的数量重新跑MD,我们就可以把record.dpgen文件在x 2之后的内容删除,重新提交dpgen任务。

        • nohup.out

          这个并不是必要输出,但是建议使用nohup命令把dpgen挂在后台运行。这个文件中输出的信息和dpgen.log的基本一致。

        例子

        下面进行分段讲解,实际运行时,所有段落包含在同一个文件param.json中
        • 基本参数设置
        {
        "type_map": [
        "O", "H", "Pt"
        ],
        "mass_map": [
        15.999, 1.0079, 195.08
        ],
        "_comment": " atoms in your systems ",
        "init_data_prefix": "/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh",
        "init_data_sys": [
        "init/system-000","init/system-001"
        ],
        "_comment": " path of training set ",
        "init_batch_size": [
        1,1
        ],
        "sys_configs": [
        ["/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh/init/configs/POSCAR_0[0-9]"], ["/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh/init/configs/POSCAR_1[0-9]"]
        ],
        "_comment": " path of initial structure for sampling ",
        "sys_batch_size": [
        1,1
        ],
        ......
        }

        type_map顺序要严格对应训练集的type_map顺序,后文的各项涉及元素相关设置顺序都应保持一致,如POTCAR。
        • 势函数训练(DPMD)
        {
        ......
        "numb_models": 4,
        "_comment": " number of NNP for model deviation ",
        "train_param": "input.json",
        "_comment": " name of automatically generated input file for DPMD ",
        "default_training_param": {
        "model": {
        "descriptor": {
        "type": "se_e2_a",
        "_comment": "could be bigger than the number of atoms of the very element",
        "sel": [68, 136, 64],
        "rcut_smth": 0.50,
        "rcut": 5.00,
        "neuron": [25, 50, 100],
        "resnet_dt": false,
        "axis_neuron": 16,
        "seed": 1
        },
        "fitting_net": {
        "n_neuron": [240, 240, 240],
        "resnet_dt": true,
        "seed": 1
        }
        },
        "learning_rate": {
        "type": "exp",
        "start_lr": 0.005,
        "decay_steps": 2000,
        "_comment": "last 20000 or 400000",
        "decay_rate": 0.95
        },
        "loss": {
        "start_pref_e": 0.02,
        "limit_pref_e": 1,
        "start_pref_f": 1000,
        "limit_pref_f": 1,
        "start_pref_v": 0,
        "limit_pref_v": 0 },
        "training": {
        "systems": [ ],
        "set_prefix": "set",
        "stop_batch": 400000,
        "batch_size": 1,
        "seed": 1,
        "disp_file": "lcurve.out",
        "disp_freq": 100,
        "numb_test": 4,
        "save_freq": 1000,
        "save_ckpt": "model.ckpt",
        "load_ckpt": "model.ckpt",
        "disp_training": true,
        "time_training": true,
        "profiling": false,
        "profiling_file": "timeline.json"
        }},
        "_comment": "modify according your systems!",
        ......
        }
        • 采样和筛选(Lammps)
        {
        "model_devi_dt": 0.0005,
        "_comment": "model_devi_dt: Timesteps for MD. Consistent with DFTMD!",
        "model_devi_skip": 0,
        "_comment": "model_devi_skip: the first x frames of the recorded frames",
        "model_devi_f_trust_lo": 0.075,
        "model_devi_f_trust_hi": 0.10,
        "_comment": "modify according to the error distribution of system",
        "model_devi_e_trust_lo": 1e10,
        "model_devi_e_trust_hi": 1e10,
        "model_devi_clean_traj": false,
        "model_devi_jobs": [
        {"sys_idx": [0,1],"temps": [300,400],"press": [1.0],"trj_freq": 30,"nsteps": 300,"ensemble": "nvt","_idx": "00"},
        {"sys_idx": [0,1],"temps": [300,400],"press": [0.98,1.0,1.02],"trj_freq": 100,"nsteps": 300,"ensemble": "npt","_idx": "01"}
        ],
        "_comment": "sys_idx should correspond to sys_configs in the beginning",
        "_comment": "add the _idx step by step",
        "_comment": "modify nsteps and sys_idx based on model deviation accuracy",
        ......
        }
        • 标记(计算单点能,此处以VASP为例)
        "_comment": "02.fp",
        "fp_style": "vasp",
        "shuffle_poscar": false,
        "fp_task_max": 1000,
        "fp_task_min": 8,
        "fp_pp_path": "./",
        "fp_pp_files": ["POTCAR_Ga","POTCAR_N"],
        "fp_incar": "INCAR"

        INCAR文件例子

        #给计算体系起名字,可以随便写
        SYSTEM=example

        #此标记确定将写入文件 OUTCAR(“详细标记”)的量。
        NWRITE = 2
        #继续作业:“以恒定的能量切断重新启动”。轨道是从WAVECAR文件中读取的(在并行版本中的使用受到限制)。如果缺少 WAVECAR 文件,或者如果 WAVECAR 文件包含不适当的波段数和/或 k 点,则标志 ISTART 将恢复为 ISTART=0(见上文)。
        ISTART=0
        #从 CHGCAR 文件中读取电荷密度,并使用原子电荷密度的线性组合从旧位置(在 CHGCAR 上)推断到新位置。
        ICHARG=0
        #平面波截断能,默认:ENCUT = largest ENMAX on the POTCAR file
        ENCUT=600
        #使用更有效的存储器来保存电荷密度的对称性(与 ISYM=1 相比)。这减少了内存需求,特别是对于并行版本。
        ISYM=2
        #电子最优化的算法,即决定求解能量本征值的算法。默认:ALGO=Normal,即使用blocked Davidson迭代法,#电子迭代计算波函数时使用的算法,Normal->IALGO=38 , Very_Fast->IALGO=48 , Fast->初相使用38,之后使用48
        ALGO=Normal
        #控制计算精度的参数,在一般计算中,默认选择PREC=Normal或者Medium,但如果需要提高计算精度时,如声子计算,建议设置PREC=Accurate
        PREC=Accurate
        #建议在做高精度计算时,设置LREAL=.FALSE.,否则在超过20个原子系统中可设置LREAL=Auto
        LREAL=Auto
        #Electronic steps
        #NELM 设置电子 SC(自洽)步骤的最大数量。
        NELM=60
        #NELMIN 指定电子自洽步骤的最小数量。
        NELMIN=8
        #控制自洽优化优化收敛的能量标准,默认值:1E-4 eV
        EDIFF=1E-6

        #Ionic steps
        NSW=0
        #ISIF确定是否计算应力张量,以及允许哪些主自由度在弛豫和分子动力学运行中发生变化。
        ISIF=0
        #离子位置优化算法,如果NSW=0/1,则默认值为1,否则为0,可赋予值-1,0,1,2,3,5
        IBRION=-1

        DOS related values:
        #SIGMA的取值和ISMEAR息息相关,也就是和ISMEAR这个参数同时出现,设定
        #建议:金属 ISMEAR=1或者2;SIGMA=0.2左右。绝缘体或半导体ISMEAR=0;SIGMA=0.05左右。分子计算:ISMEAR=0;SIGMA=0.01。计算态密度时使用ISMEAR=-5,同时不设置SIGMA
        ISMEAR=0;SIGMA=0.05
        #确定是否输入波函数
        LWAVE=.FALSE.
        #确定是否输入电荷密度
        LCHARG=.FALSE.
        #ADDGRID 确定是否使用额外的支持网格来评估增强费用。
        ADDGRID=.TRUE.
        #将NPAR值设为你计算节点核数的平方根
        NPAR=2
        KSPACING=0.300000
        KGAMMA=.FALSE.



        针对E.T.Lab的machine.json示例


        {
        "train": [
        {
        "machine": {
        "batch": "pbs",
        "work_path": "./dp"
        },
        "resources": {
        "numb_node": 7,
        "task_per_node": 1,
        "with_mpi": true,
        "numb_gpu": 0,
        "partition": "gpu"
        },
        "command": "dp",
        "group_size": 1
        }
        ],
        "model_devi": [
        {
        "machine": {
        "batch": "pbs",
        "work_path": "./lmp"
        },
        "resources": {
        "numb_node": 7,
        "task_per_node":1,
        "with_mpi": true,
        "numb_gpu": 0,
        "partition": "gpu"
        },
        "command": "lmp",
        "group_size": 250
        }
        ],
        "fp": [
        {
        "machine": {
        "batch": "pbs",
        "work_path": "./fp"
        },
        "resources": {
        "task_per_node": 24,
        "with_mpi": true,
        "partition": "fast",
        "numb_node": 8
        },
        "command": "vasp610",
        "group_size": 250
        }
        ]
        }

        为了使用上述machine.json文件,需修改dpgen源码,以达到通过"numb_node"控制提交任务的节点,来使用gpu节点(007,008)来加速训练。操作如下,首先找到~/.local/lib/python3.9/site-packages/dpgen/dispatcher目录下的文件PBS.py文件,找到


        def sub_script_head(self, res):


        section,通过修改该部分中类似的位置


           if res['numb_gpu'] == 0:
        ret += '#PBS -l nodes=node00%d:ppn=%d\n' % (res['numb_node'], res['task_per_node'])
        else :
        ret += '#PBS -l nodes=node00%d:ppn=%d:gpus=%d\n' % (res['numb_node'], res['task_per_node'], res['numb_gpu'])


        来达到指定节点的目的,在


        ret += '#PBS -l walltime=%s\n' % (res['time_limit'])


        前加入#号,取消任务的时间限制,在


           def sub_script_cmd(self,
        cmd,
        arg,
        res) :

        section,将该部分中类似的位置修改为


           if res['with_mpi']:
        ret = 'mpirun -machinefile $PBS_NODEFILE -n %d %s %s' % (
        res['task_per_node'], cmd, arg)


        即可通过task_per_node指定调用的cpu核数。以此使用上述的machine.json文件。


        由于参数过多,上述输入文件相关参数具体内容可查看deepmodeling/dpgen: The deep potential generator (github.com)


        准备好输入文件后,可用


        dpgen run param.json machine.json


        运行dpgen主程序。使用


        nohup dpgen run param.json machine.json 1>log 2>&1 &


        命令可使进程在后台运行,同时将运行的过程信息和报错信息输出在log文件中。使用


        ps -aux|grep 用户名/deepmd


        可检索在后台运行的dpgen进程。

        初始训练集的生成

        初始训练集可使用dpgen init功能生成,其主要输入文件类似于run主程序,例子:

         

        {
        "stages" : [1,2,3,4],
        "cell_type": "hcp",
        "latt": 5.482,
        "from_poscar": true,
        "from_poscar_path": "./POSCAR",
        "super_cell": [2, 2, 1],
        "elements": ["Ga","N"],
        "potcars": ["./POTCAR_Ga","./POTCAR_N"],
        "relax_incar": "./INCAR.rlx",
        "md_incar" : "./INCAR.md",
        "scale": [0.980,1.00,1.020],
        "skip_relax": true,
        "pert_numb": 10,
        "md_nstep" : 10,
        "pert_box": 0.02,
        "pert_atom": 0.01,
        "coll_ndata": 2000,
        "type_map" : [ "Ga","N"],
        "_comment": "that's all"
        }

        各参数的主要内容见deepmodeling/dpgen: The deep potential generator (github.com)

        训练集收集

        DP-GEN代码迭代生成的训练集是分散储存的。可以用DP-GEN自带的collect函数进行数据收集。首先可以使用dpgen collect -h 查看使用说明。常用用法是

         

        dpgen collect JOB_DIR OUTPUT_DIR -p param.json

         

        JOB_DIR就是DP-GEN的输出目录,包含有iter.0000*一系列的目录。OUTPUT_DIR就是收集的数据准备放到哪。param.json就是运行DP-GEN跑的param文件。例如:

         

        dpgen collect ./ ./collect -p param-ruo2.json

        以上命令会把当前文件夹的DP-GEN数据收集好放入collect目录里。

         

        init.000 init.001 sys.000 sys.001

         

        init.*是初始训练集,sys.*是后来DP-GEN生成的训练集,按照param的sys分类。

      State Key Laboratory of Advanced Design and Manufacturing Technology for Vehicle, College of Mechanical and Vehicle Engineering, Hunan University, Changsha 410082, P. R. China 

      湖南大学 机械与运载工程学院 整车先进设计制造技术全国重点实验室

        ETLABtutorial
        Website
        https://static-assets.sxlcdn.com/images/fb_images/default-sxl.jpg
        Cookie的使用
        我们使用cookies来确保流畅的浏览体验。若继续,我们认为你接受使用cookies。
        了解更多