Bohrium
robot
新建

空间站广场

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

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
DeePMD-kit 的 Python 接口使用教程
DP-GEN
DeePMD-kit
Tutorial
LiCl
dpdata
DP-GENDeePMD-kitTutorialLiCldpdata
Wenshuo Liang
发布于 2023-09-19
推荐镜像 :DeePMD-kit:2.2.1-cuda11.6-notebook
推荐机型 :c2_m4_cpu
赞 2
6
licl(v1)

DeePMD-kit 的 Python 接口使用教程

代码
文本

©️ Copyright 2023 @ Authors
作者:梁文硕 📨
日期:2023-09-19
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:点击上方的 开始连接 按钮,选择 deepmd-kit:2.2.1-cuda11.6-notebook 镜像及 c2_m4_cpu 节点配置,稍等片刻即可运行。

代码
文本

介绍

在这个Notebook中,我们将演示如何使用DeePMD-kit 的 Python 接口进行构型的能量、力和应力的预测,以及model_devi计算。同时,我们也会强调一些需要特别注意的点,如在多次模型推断或计算模型偏差时如何避免内存溢出。我们将使用/bohr/licl-jfju/v1数据集,这个数据集包含有关LiCl(氯化锂)体系的4个DP(Deep Potential)模型文件和两个LAMMPS分子动力学模拟轨迹。

1.数据集文件介绍

/bohr/licl-jfju/v1数据集的文件夹结构如下:

/bohr/licl-jfju/v1/
|-- model
|   |-- graph.000.pb
|   |-- graph.001.pb
|   |-- graph.002.pb
|   `-- graph.003.pb
`-- trj
    |-- trj1.dump
    `-- trj2.dump
  • model 文件夹:这个文件夹包含四个DP-GEN迭代过程中生成的模型文件,分别是 graph.000.pb,graph.001.pb,graph.002.pb和 graph.003.pb。这些模型文件储存了DeepMD模型的权重和结构,用于后续的能量、力和应力的推断。

  • trj 文件夹:这个文件夹包含两个LAMMPS轨迹文件,分别是trj1.dump和 trj2.dump。两个轨迹文件分别记录了10和100个分子动力学模拟中构型的原子坐标、原子类型以及晶胞参数等信息。

代码
文本

2. 代码演示

2.1 模型推断

在分子动力学模拟中,准确和高效地预测能量、力和应力是至关重要的,因为这些物理量直接影响模拟的稳定性和结果,从而决定了系统的动力学和热力学性质。

下面的代码示例将演示如何使用DP模型进行能量和力的预测。我们首先使用deepmd.infer.DeepPot类来加载模型,并通过graph.eval方法来进行能量、力和应力的预测。我们还演示了如何使用dpdata库来从LAMMPS轨迹文件中自动读取多个构型的信息。

代码
文本
[7]
# 首先,我们需要导入依赖包
import numpy as np
from deepmd.infer import DeepPot as DP

# 然后,加载DP模型graph.000.pb
graph = DP("/bohr/licl-jfju/v1/model/graph.000.pb")

# 接下来,定义坐标、晶胞参数和原子类型
coord = np.array([[5.18232, 3.09802, 4.85248],
[1.51455, 5.26638, 0.07705],
[2.60337, 7.15614, 5.04614],
[4.30342, 6.76392, 2.48657],
[5.73623, 7.06587, 6.03596],
[0.41726, 5.04314, 3.45302],
[5.21993, 3.17573, 1.00117],
[2.10612, 0.90263, 0.573 ],
[0.10919, 0.87773, 2.99672],
[3.88968, 5.81775, 0.07778],
[4.51035, 2.00906, 6.73319],
[5.65144, 5.71127, 4.20436],
[5.08822, 1.50277, 3.25817],
[0.54829, 6.94934, 6.4263 ],
[1.8105, 7.06083, 2.96073],
[0.17122, 3.42954, 1.26911]]).reshape(1,16,3)

cell = np.array([[7.227, 0.000, 0.000],
[0.000, 7.227, 0.000],
[0.000, 0.000, 7.227]]).reshape(1,3,3)
atype = [0] * 8 + [1] * 8

# 最后,进行模型推断。在这里,e 是预测的能量,f 是预测的力,v 是预测的应力。
e, f, v = graph.eval(coord, cell, atype)

# 打印预测结果
print("Predicted Energy:\n", e)
print("Predicted Forces:\n", f)
print("Predicted Virial Stress:\n", v)
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
Predicted Energy:
 [[-4855.95905001]]
Predicted Forces:
 [[[-0.04741529  0.13845542 -0.49140141]
  [ 0.09509628 -0.94495069  1.06568146]
  [ 0.03815736  0.23224834 -0.41624615]
  [-0.19293528  0.12487836  0.04304597]
  [-1.12051947  0.3084265  -0.21439227]
  [ 0.27024114  0.46482163 -0.88505543]
  [ 0.43425162  0.46296866  1.53319969]
  [-0.31652348  0.16304652  1.09671621]
  [ 0.45583334  0.65764901 -0.17254604]
  [-0.22407714  0.09631328 -0.07469879]
  [-1.00286772 -1.10660631 -0.99237256]
  [-0.80446554 -1.6448555   0.19221738]
  [-3.18878033  1.67607964  0.20080677]
  [ 1.47424757  0.55270822  0.05869333]
  [ 3.18936505 -2.59118555 -0.39017373]
  [ 0.94039191  1.41000246 -0.55347445]]]
Predicted Virial Stress:
 [[ 9.57896373 -4.59908692  1.07514433 -4.59908692 -0.40066489  0.82750241
   1.07514433  0.82750241 -1.80887825]]
代码
文本

在上面的代码示例中,我们演示了如何用DP模型来预测单一构型的能量、力和应力。这里,我们是手动写入坐标、晶胞参数和原子类型的,这在处理多个构型时可能不太方便。为了解决这个问题,我们可以使用dpdata库来自动读取和处理多个构型,使整个流程更加高效和灵活。

代码
文本
[8]
import dpdata
import numpy as np
from deepmd.infer import DeepPot as DP

# 使用dpdata从LAMMPS轨迹文件读取系统信息
sys=dpdata.System('/bohr/licl-jfju/v1/trj/trj1.dump',fmt='lammps/dump')
coords = sys['coords']
cells = sys['cells']
atype = sys['atom_types']
#print(coords.shape)

dp = DP("/bohr/licl-jfju/v1/model/graph.000.pb")
e, f, v = dp.eval(coords, cells, atype)

print("Predicted Energy:\n",e)
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
Predicted Energy:
 [[-4855.95905001]
 [-4864.40616435]
 [-4862.77768574]
 [-4863.0729255 ]
 [-4864.16011599]
 [-4863.00683056]
 [-4863.57828733]
 [-4863.2101348 ]
 [-4863.30366932]
 [-4862.99969306]
 [-4863.96879001]]
代码
文本

在本示例中,我们使用dpdata从LAMMPS轨迹文件读取系统信息。值得注意的是,dpdata还支持其他多种数据格式,例如第一性原理计算软件ABACUS的输出等。要了解dpdata支持的所有数据格式和更多功能,您可以访问其GitHub仓库:deepmodeling/dpdata

2.2 计算模型偏差

模型偏差(model_devi)用于量化不同DP模型预测之间的一致性,对于评估模型的精度和指导构型选择具有重要价值。通常,在DP-GEN的每一轮迭代结束后,都会产生多个DP模型。这些模型基于相同的训练数据,但由于初始化和优化的随机性,它们的预测结果可能会有所不同。计算模型偏差可以帮助我们

  • 评估一组模型中是否有显著的预测差异。在DP-GEN的某次迭代过程中,如果一组DP模型中存在精度较低的模型,将会导致该轮迭代中accurate类构型的比例急剧下降。
  • 指导后续的数据收集。在DPGEN迭代过程中,就是通过分析模型偏差,在一定的模型偏差范围内选择构型,以更为有效地优化模型性能和提高预测准确度。

在下面的示例中,我们将演示如何使用deepmd.infer.calc_model_devi函数来计算模型偏差。

代码
文本
[9]
from deepmd.infer import calc_model_devi

sys=dpdata.System('/bohr/licl-jfju/v1/trj/trj1.dump',fmt='lammps/dump')
coords = sys['coords']
cells = sys['cells']
atype = sys['atom_types']

graphs = [DP(f"/bohr/licl-jfju/v1/model/graph.{i:03d}.pb") for i in range(4)]

model_devi =calc_model_devi(coords, cells, atype, graphs)
print(model_devi)
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
WARNING:deepmd.utils.batch_size:You can use the environment variable DP_INFER_BATCH_SIZE tocontrol the inference batch size (nframes * natoms). The default value is 1024.
[[0.00000000e+00 5.83870346e-02 4.72772301e-03 2.55479912e-02
  5.61184781e-01 1.29198357e-02 9.52143885e-02]
 [1.00000000e+00 2.52195138e-03 2.62210183e-04 1.33594244e-03
  4.59402908e-03 1.58778112e-03 2.97669665e-03]
 [2.00000000e+00 2.23172314e-03 4.48743450e-04 1.07974278e-03
  6.34187037e-03 2.44130651e-03 4.16467998e-03]
 [3.00000000e+00 2.69659875e-03 5.80482699e-04 1.56190255e-03
  7.40372211e-03 2.35737345e-03 4.58280151e-03]
 [4.00000000e+00 2.42488910e-03 5.59474951e-04 1.38725218e-03
  3.95355199e-03 2.43627339e-03 3.25177894e-03]
 [5.00000000e+00 4.71654156e-03 7.27696789e-04 2.22644576e-03
  1.02439355e-02 1.58471121e-03 5.32560151e-03]
 [6.00000000e+00 1.83721877e-03 2.56884188e-04 9.94701542e-04
  4.74199795e-03 2.27074879e-03 3.45914798e-03]
 [7.00000000e+00 2.35647923e-03 5.27659125e-04 1.35056984e-03
  7.76646575e-03 2.64380206e-03 4.34153963e-03]
 [8.00000000e+00 2.70741834e-03 2.26610231e-04 1.17732779e-03
  6.04190241e-03 1.79982193e-03 4.11699159e-03]
 [9.00000000e+00 2.41164230e-03 3.23794076e-04 1.43387928e-03
  1.08482873e-02 2.18448733e-03 4.74072169e-03]
 [1.00000000e+01 1.93087257e-03 1.25598107e-04 8.05267858e-04
  5.57186241e-03 2.43387495e-03 3.76640893e-03]]
代码
文本

7个数值分别表示构型序数、应力的最大、最小和平均模型偏差、以及力的最大、最小和平均偏差,这些与DP-GEN/model_devi任务中的生成的model_devi.out文件的列(step、max_devi_v、min_devi_v、avg_devi_v、max_devi_f、min_devi_f、avg_devi_f)是对应的。

2.3 避免在循环中重复加载模型

当进行多次模型推断或计算模型偏差时,加载模型的操作需要特别注意。由于TensorFlow的内存管理特性,如果在循环内部重复加载模型,它将不会适时地释放已分配的内存。这样的做法可能会迅速消耗可用内存,最终导致内存溢出(OOM)错误。为了避免这一问题,应当在循环外部预先加载所需的模型,并在循环中重复利用它。

代码
文本
[10]
import dpdata
import numpy as np
import matplotlib.pyplot as plt
from deepmd.infer import DeepPot as DP

sys = dpdata.System('/bohr/licl-jfju/v1/trj/trj2.dump', fmt='lammps/dump')

graph = DP("/bohr/licl-jfju/v1/model/graph.000.pb")
energies=[]
for i in range(len(sys)):
#graph = DP("/bohr/licl-br2k/v1/model/graph.000.pb")
coord = sys['coords'][i]
cell = sys['cells'][i]
atype = sys['atom_types']
e, f, v = graph.eval(coord.reshape(1,16,3), cell.reshape(1,3,3), atype)
energies.append(e[0])

plt.plot(energies, label='Energy')
plt.xlabel('Number of Structures')
plt.ylabel('Energy (eV)')
plt.show()
代码
文本

我们可以将graph = DP("/bohr/licl-jfju/v1/model/graph.000.pb")这一行移至循环内部,并观察内存的使用情况。

结束语

通过阅读本Notebook,您应该已经对如何使用DeePMD-kit的Python接口进行构型的能量、力和应力预测有了一个深入的理解。同时,您也学习了如何计算模型偏差(model_devi),这是评估多个DP模型准确性的一个重要指标。此外,我们还讨论了一些重要的实践细节,比如如何避免在循环中重复加载模型以预防内存溢出。

以下是您应该从这个Notebook中掌握的关键点:

  • 如何使用DeePMD-kit的Python接口进行能量、力和应力的预测。
  • 如何利用dpdata从支持的文件格式中加载构型数据,以便进行后续的计算。
  • 如何使用DeePMD-kit的Python接口进行模型偏差(model_devi)的计算。
  • 如何避免在多次模型推断或计算模型偏差时出现内存溢出。

感谢您的阅读!如有任何意见或建议,欢迎评论。

参考链接:

代码
文本
DP-GEN
DeePMD-kit
Tutorial
LiCl
dpdata
DP-GENDeePMD-kitTutorialLiCldpdata
已赞2
本文被以下合集收录
机器学习与DFT精华帖
gtang
更新于 2024-09-10
38 篇21 人关注
dpmd-vasp
bohr89dd20
更新于 2024-07-15
4 篇1 人关注
推荐阅读
公开
Python基础
python
python
爱学习的王一博
发布于 2024-02-29
1 赞1 转存文件
公开
charpter6_knn/knn
机器学习
机器学习
xuxh@dp.tech
更新于 2024-08-09