Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
DeePMD-Kit实际上手操作|VASP篇
vasp
DeePMD-kit
vaspDeePMD-kit
baikid
发布于 2023-09-21
推荐镜像 :ABACUS:3.3.2-user-guide
推荐机型 :c2_m4_cpu
赞 6
8
10
DeePMD-Kit实际上手操作|VASP篇
1.VASP数据集的准备
2.Deep-Kit输入文件的准备
3.模型结果的分析

DeePMD-Kit实际上手操作|VASP篇

代码
文本

本文使用dpdata对vasp生成的第一性原理数据(结构弛豫)进行格式转化,并使用DeePMD-Kit对其势函数进行拟合。

代码
文本

学习基础:VASP基本知识,DeePMD-Kit基本知识

代码
文本

软件使用:VASP(6.3.0) DeepMD-Kit v2.2.4

代码
文本

特别感谢DeepMD-Kit每一位开发者的贡献

代码
文本

1.VASP数据集的准备

代码
文本

本文采用Cu和石墨烯的异质结结构作为初始的结构,将其作为输入的POSCAR文件。众所周知,我们可以利用Material Studio的refine latticebulid layers功能搭建异质结,但是明显这样做是比较花费时间的。运行的是vaspkit的804功能为我们提供了一个快速构建异质结的方法。关于804功能的介绍在 http://vaspkit.cn/index.php/8.html 中已经阐述的十分详细了,本文不做赘述,接下来使用其中一个构建好的异质结做为演示例子。

代码
文本

INCAR文件的展示,和一般的结构优化不同,请注意需要打开范德华相互作用,以保证体系的真实性。

代码
文本
[ ]
SYSTEM = Cu-gra
ENCUT = 400
ISTART = 0; ICHARG = 2
LREAL = AUTO
ALGO = Fast
ISMEAR = 1
SIGMA = 0.1

IVDW=10
VDW_RADIUS = 10.0
NSW = 1000
GGA = PE
ISPIN = 1
LPLANE = .TRUE.
NPAR = 4
POTIM = 0.2
IBRION = 2
ISIF = 2
EDIFF = 1E-5
EDIFFG = -1E-2
PREC = Normal
ISYM = 0
LWAVE = .FALSE.
LCHARG = .FALSE.
代码
文本

随后提交任务,可以用grep功能获得体系能量。

代码
文本
[ ]
$ grep entropy OUTCAR
代码
文本

2.Deep-Kit输入文件的准备

代码
文本

计算完毕后,我们需要提取OUTCAR文件中的力,以及能量等信息提取出来,并转为DEEP-Kit可以识别的形式,这里可以使用dpdata和简单的python语句,就可以完成这个工作,非常的方便。

代码
文本
[ ]
import dpdata
import numpy as np
import math
import sys
import os

data = dpdata.LabeledSystem('OUTCAR', fmt = 'vasp/outcar')
data_number = len(data)
print('# the data contains %d frames' % data_number)
index_validation = np.random.choice(data_number,size=math.ceil(data_number*0.1),replace=False) #这里选择了0.1,可以根据数据集的大小来改变这个参数
index_training = list(set(range(data_number))-set(index_validation))
data_training = data.sub_system(index_training)
data_validation = data.sub_system(index_validation)
data_training.to_deepmd_npy('training_data')
data_validation.to_deepmd_npy('validation_data')
print('# the training data contains %d frames' % len(data_training))
print('# the validation data contains %d frames' % len(data_validation))
代码
文本

上面的代码不仅完成了对于数据的转化,同时也完成了对训练集和验证集的划分,本文所用的代码示例使用的是随机选取数据集总量的百分之十作为验证集,其他作为训练集。它会在当前目录下建立好training_data和validation_data两个文件夹。

代码
文本

这样Deep-Kit的初始数据集我们就构建好了,下面我们要给出它的输入文件input.json,这里建议最好将此文件放入一个新的文件夹中,这样Deep-Kit的输出文件都会出现在这个文件夹里。

代码
文本
[ ]
{
"model":{
"type_map": ["Cu","C"],
"data_stat_nbatch": 10,
"descriptor": {
"type": "se_a",
"rcut_smth": 0.5,
"rcut": 6.00,
"sel": [60,60],
"neuron": [32,64,128],
"axis_neuron": 16,
"resnet_dt": false,
"seed": 1,
"_comment": " that's all"
},
"fitting_net": {
"neuron": [240,240,240],
"resnet_dt": false,
"seed": 1,
"_comment": " that's all"
},
"_comment": " that's all"
},
"learning_rate" :{
"type": "exp",
"decay_steps": 5000,
"start_lr": 0.001,
"stop_lr": 3.51e-8,
"_comment": "that's all"
},

"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,
"_comment": "that's all"
},

"_comment": " traing controls",
"training": {
"training_data":{
"systems": ["../training_data"],
"batch_size": "auto",
"_comment": "that's all"
},
"validation_data":{
"systems": ["../validation_data"],
"batch_size": "auto",
"numb_btch": 1,
"_comment": "that's all"
},
"numb_steps": 1000000,
"seed": 1,
"_comment": " display and restart",
"_comment": " frequencies counted in batch",
"disp_file": "lcurve.out",
"disp_freq": 100,
"save_freq": 1000,
"disp_training":true,
"time_training":true,
"_comment": "that's all"
},

"_comment": "that's all"
}
代码
文本

本文给出的是Cu-石墨烯体系的例子,如果你想修改成自己的体系,最简单的方法是将"type_map":["Cu","C"]修改成对应体系的元素,并将training_data和validation_data两个文件夹的路径进行修改,当若你变换了元素种类的数量,记得将"sel": [60,60],也改成相应的维数,当然你可以选择'auto'作为sel的参数,但个人不建议这样做,因为后面你想增加数据集继续训练的时候会由维数不同产生报错。

代码
文本

随后写好提交脚本就可以提交了!我们可以看到计算的细节,以及最后计算的结果。

代码
文本
[ ]
$ dp train input.json 1>> train.log 2>> train.err
代码
文本
[ ]
DEEPMD INFO batch 999100 training time 12.31 s, testing time 0.11 s, total wall time 12.73 s
DEEPMD INFO batch 999200 training time 12.29 s, testing time 0.10 s, total wall time 12.44 s
DEEPMD INFO batch 999300 training time 12.36 s, testing time 0.11 s, total wall time 12.51 s
DEEPMD INFO batch 999400 training time 12.33 s, testing time 0.11 s, total wall time 12.48 s
DEEPMD INFO batch 999500 training time 12.33 s, testing time 0.11 s, total wall time 12.49 s
DEEPMD INFO batch 999600 training time 12.29 s, testing time 0.11 s, total wall time 12.45 s
DEEPMD INFO batch 999700 training time 12.30 s, testing time 0.10 s, total wall time 12.45 s
DEEPMD INFO batch 999800 training time 12.33 s, testing time 0.10 s, total wall time 12.48 s
DEEPMD INFO batch 999900 training time 12.27 s, testing time 0.10 s, total wall time 12.42 s
DEEPMD INFO batch 1000000 training time 12.31 s, testing time 0.11 s, total wall time 12.47 s
DEEPMD INFO saved checkpoint model.ckpt
DEEPMD INFO average training time: 0.1236 s/batch (exclude first 100 batches)
DEEPMD INFO finished training
DEEPMD INFO wall time: 125427.523 s
代码
文本

3.模型结果的分析

代码
文本

在第 10000000 步结束时,模型保存在 TensorFlow 的检查点文件 model.ckpt中。同时,训练和测试错误显示在文件lcurve.out中。

代码
文本
[ ]
998000 2.11e-01 2.78e-01 2.90e-03 1.14e-02 2.04e-01 2.37e-01 3.7e-08
998100 2.73e-01 6.01e-01 1.52e-02 4.22e-02 1.98e-01 3.12e-01 3.7e-08
998200 6.74e-01 4.34e-01 5.21e-02 3.04e-02 2.37e-01 2.27e-01 3.7e-08
998300 2.23e-01 1.85e+00 3.00e-04 1.51e-01 2.19e-01 3.09e-01 3.7e-08
998400 3.02e-01 3.04e-01 1.40e-02 1.50e-02 2.45e-01 2.40e-01 3.7e-08
998500 3.09e-01 2.35e-01 1.11e-02 6.16e-04 2.74e-01 2.31e-01 3.7e-08
998600 2.12e-01 5.61e-01 9.79e-03 3.82e-02 1.72e-01 3.12e-01 3.7e-08
998700 4.66e-01 5.62e-01 3.47e-02 3.84e-02 2.01e-01 3.12e-01 3.7e-08
998800 1.64e-01 3.03e-01 7.51e-03 1.88e-02 1.34e-01 1.98e-01 3.7e-08
998900 3.02e-01 2.75e-01 1.49e-02 1.55e-02 2.37e-01 1.98e-01 3.7e-08
999000 5.81e-01 1.98e-01 4.37e-02 9.19e-04 2.38e-01 1.95e-01 3.7e-08
999100 4.50e-01 5.75e-01 3.20e-02 4.31e-02 2.26e-01 2.38e-01 3.7e-08
999200 1.03e+00 4.62e-01 7.78e-02 2.51e-02 4.14e-01 3.42e-01 3.7e-08
999300 3.97e-01 3.02e-01 2.77e-02 1.47e-02 2.11e-01 2.39e-01 3.7e-08
999400 2.91e-01 3.24e-01 1.45e-02 1.78e-02 2.28e-01 2.38e-01 3.7e-08
999500 2.90e-01 1.69e+00 1.85e-02 1.38e-01 1.82e-01 2.60e-01 3.7e-08
999600 2.13e-01 5.44e-01 5.13e-03 3.65e-02 2.00e-01 3.14e-01 3.7e-08
999700 3.38e-01 2.35e-01 1.94e-02 2.19e-04 2.39e-01 2.30e-01 3.7e-08
999800 2.24e-01 1.69e+00 1.09e-02 1.38e-01 1.78e-01 2.69e-01 3.7e-08
999900 2.09e-01 4.32e-01 3.29e-03 3.05e-02 2.02e-01 2.22e-01 3.7e-08
1000000 1.83e-01 5.36e-01 7.89e-03 3.57e-02 1.53e-01 3.12e-01 3.5e-08
代码
文本

第 4、5 和 6、7 列分别介绍了能量和力量训练和测试错误。 证明经过 10000000 步训练,能量测试误差小于 1 meV,力测试误差在 312meV/Å左右。

代码
文本

随后可以通过以下命令检查模型的质量,我们可以自由选择n的数量。

代码
文本
[ ]
$ dp test -m graph.pb -s ../validation_data -n 40 -d results
代码
文本

随后我们可以在当前目录下看到results.e.out,results.e_peratom.out,results.f.out,results.v.out,results.v_peratom.out这五个文件,分别代表了DFT的结果和预测的结果。可以将文件放入Origin中轻松可视化。

代码
文本
vasp
DeePMD-kit
vaspDeePMD-kit
已赞6
本文被以下合集收录
机器学习与DFT精华帖
gtang
更新于 2024-09-10
38 篇21 人关注
deep learning
微信用户kO5k
更新于 2024-07-15
4 篇1 人关注
推荐阅读
公开
Bohrium 帮助文档|DeePMD-kit
Bohrium 帮助文档LBG UtilityDeePMD-kit
Bohrium 帮助文档LBG UtilityDeePMD-kit
Bohrium
发布于 2023-10-14
1 赞
公开
玩转电子轨道可视化
ABACUSpython包可视化
ABACUSpython包可视化
jie
发布于 2024-03-04
6 赞4 转存文件
评论
 计算完毕后,我们需要提取OUTCAR文件...

乌日根

11-10 04:16
有多个OUTCAR 文件的时候如何将其合并为同一个训练集

半杯茶叶子

07-08 04:59
import dpdata from dpdata import LabeledSystem, MultiSystems from glob import glob import numpy as np fs = glob("./*/OUTCAR")  #该提取程序同目录下有多个文件夹中含有OUTCAR文件 data = MultiSystems() for f in fs:     try:         ls = LabeledSystem(f)     except:         print(f)     if len(ls) > 0:         data.append(ls) total_frames = data.get_nframes() print('# the data contains %d frames' % total_frames)   #所有OUTCAR文件中总数据帧数 index_training = np.random.choice(total_frames,size=2000,replace=False) #随机选取2000帧作为训练集数据 #提取出训练集 data_training = dpdata.MultiSystems() for idx in index_training:     for system_name in data.systems.keys():         if idx < len(data.systems[system_name]):             data_training.append(data.systems[system_name].sub_system([idx]))             break         else:             idx -= len(data.systems[system_name]) all_indices = np.arange(total_frames)                          index_last = np.setdiff1d(all_indices, index_training) #得到随机抽取的训练集以外的数据编号 #提取剩余数据形成一个新集合 data_last = dpdata.MultiSystems() for idx in index_last:     for system_name in data.systems.keys():         if idx < len(data.systems[system_name]):             data_last.append(data.systems[system_name].sub_system([idx]))             break         else:             idx -= len(data.systems[system_name]) #在剩余数据的集合中提取300个作为测试集 last_frames = data_last.get_nframes() index_validation = np.random.choice(last_frames,size=300,replace=False)  #data_training = data.sub_system(index_training) #使用随机索引数组来创建一个新的子系统 data_validation = dpdata.MultiSystems() for idx in index_validation:     for system_name in data_last.systems.keys():         if idx < len(data_last.systems[system_name]):             data_validation.append(data_last.systems[system_name].sub_system([idx]))             break         else:             idx -= len(data_last.systems[system_name]) #输出训练集和测试集到文件夹 data_training.to_deepmd_npy('training_data') data_validation.to_deepmd_npy('validation_data') training_frames = data_training.get_nframes() validation_frames = data_validation.get_nframes() print('# the training data contains %d frames' % training_frames)  print('# the validation data contains %d frames' % validation_frames)
展开
评论