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轨迹文件中自动读取多个构型的信息。
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库来自动读取和处理多个构型,使整个流程更加高效和灵活。
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函数来计算模型偏差。
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)错误。为了避免这一问题,应当在循环外部预先加载所需的模型,并在循环中重复利用它。
我们可以将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)的计算。
- 如何避免在多次模型推断或计算模型偏差时出现内存溢出。
感谢您的阅读!如有任何意见或建议,欢迎评论。
参考链接:
- dpdata Github仓库:deepmodeling/dpdata,
- DeePMD-kit Github仓库:deepmodeling/deepmd-kit,
- DP-GEN Github仓库:deepmodeling/dpgen,
- LiCl熔盐体系DP模型训练和应用 Bohrium notebook:从 DFT 到 MD|超详细「深度势能」材料计算上手指南。