diff --git a/tutorials/inference/source_zh_cn/hpc_molecular_dynamics_ascend_910.md b/tutorials/inference/source_zh_cn/hpc_molecular_dynamics_ascend_910.md new file mode 100644 index 0000000000000000000000000000000000000000..c854c44538317c4a094145725f7d7486b5827213 --- /dev/null +++ b/tutorials/inference/source_zh_cn/hpc_molecular_dynamics_ascend_910.md @@ -0,0 +1,134 @@ +# 通过MindSpore进行分子动力学模拟 + +`Linux` `Ascend` `模型推理` `高级` + + + +- [通过MindSpore进行分子动力学模拟](#通过MindSpore进行分子动力学模拟) + - [概述](#概述) + - [准备数据集](#准备数据集) + - [加载处理数据集](#加载处理数据集) + - [准备预训练模型](#准备预训练模型) + - [加载数据集进行推理](#加载数据集进行推理) + - [执行推理](#执行推理) + + +   + +## 概述 + +分子动力学是一套分子模拟方法,该方法主要是依靠计算机来模拟分子、原子体系的运动。通过对分子、原子在一定时间内运动状态的模拟,从而以动态观点考察系统随时间演化的行为。通常,分子、原子的轨迹可以通过两种方法计算得到。第一种方法是第一性原理,以薛定谔方程为基础计算原子受力,该方法可以精确计算原子受力,但计算复杂度高,只能用于小体系。另外一种是通过数值求解牛顿运动方程得到,势能和力通常可以由分子间相互作用势能函数、分子力学力场、全始计算给出,该方法计算复杂度低,但精度没有保证。 +MindSpore与DeePMD团队进行合作,通过神经网络来模拟原子受力,该方法通过第一性原理计算得出的数据作为训练数据集,通过神经网络和相关自定义算子来进行拟合,模型训练完毕后。在推理阶段,输入原子的位置、类型等,输出原子的势能(energy)、受力(force)和维力(virial),其兼顾以上两种方法的优点,精度高而且计算复杂度低。 + +本篇教程将主要介绍如何在Ascend 910上,使用MindSpore进行分子动力学模拟的推理。 + +> 你可以在这里找到完整可运行的样例代码: + +```text +├── md + ├── README.md # descriptions about MD + ├── script + │ ├── eval.sh # evaluation script + ├── src + │ ├── descriptor.py # descriptor function + │ ├── virial.py # calculating virial function + │ └── network.py # MD simulation architecture + └── eval.py # evaluation interface +``` + +整体执行流程如下: + +1.准备分子动力学推理的数据集,处理成输入数据集 + +2.定义分子动力学网络,加载预训练模型 + +3.加载数据集进行推理,查看结果 + +实践前,确保已经正确安装MindSpore。如果没有,可以通过[MindSpore安装页面](https://www.mindspore.cn/install)安装MindSpore。 + +## 准备数据集 + +从DeePMD的目录下:`github.com/deepmodeling/deepmd-kit/examples/water/data`获得水分子的数据集,这个数据集是由Quantum Espresso产生的,该软件的输入是由人工设定参数的。 + +数据的目录结构如下: + +```text +└─data + ├─type.raw + ├─set.000 + │ ├──box.npy + │ ├──coord.npy + │ ├──energy.npy + │ └──force.npy + ├─set.001 + ├─set.002 + └─set.003 +``` + +## 加载处理数据集 + +接下来,需要对数据进行预处理,变成推理所需的输入数据。 + +在DeePMD的目录下:`deepmodeling/deepmd-kit/source`: + +- 使用`train/DataSystem.py`进行预处理,得到处理后的原子坐标d_coord和原子类型atype两种数据 +- 使用`train/DataSystem.py`下的`compute_input_stats`来得到数据集的统计指标平均值avg和方差std +- 还需要获取原子的邻居表nlist,一般可以从其他模拟软件例如Lammps获得,也可以使用目录下的`op/descrpt_se_a.cc`来得到d_nlist和nlist +- 将`d_coord`、`d_nlist`, `atype`、`nlist`、`avg`和`std`存为npz文件,方便后面进行推理 + +```python +# get input data +r = np.load(args_opt.dataset_path) +d_coord, d_nlist, avg, std, atype, nlist = r['d_coord'], r['d_nlist'], r['avg'], r['std'], r['atype'], r['nlist'] +``` + +## 准备预训练模型 + +首先构建模型,然后从华为云MindSpore预训练模型仓[下载](https://download.mindspore.cn/model_zoo/research/hpc/molecular_dynamics/)模型参数,保存为ckpt文件,接着定义网络并加载网络的模型参数。 +示例代码如下: + +```python +import mindspore.dtype as mstype +from mindspore import load_checkpoint, load_param_into_net +from src.network import Network +... +# get trained model +net = Network() +param_dict = load_checkpoint(args_opt.checkpoint_path) +load_param_into_net(net, param_dict) +net.to_float(mstype.float32) +``` + +- `load_checkpoint`方法会加载参数文件中的网络参数,`load_param_into_net`将参数加载到模型中。加载后,网络中的参数就是CheckPoint保存的。 + +## 加载数据集进行推理 + +```python +energy, atom_ener, force, virial = \ + net(d_coord_tensor, d_nlist_tensor, frames, avg_tensor, std_tensor, atype_tensor, nlist_tensor) +``` + +## 执行推理 + +```shell +python eval.py --dataset_path [DATASET_PATH] --checkpoint_path [CHECKPOINT_PATH] +``` + +脚本需要传入变量`DATASET_PATH`和`CHECKPOINT_PATH`,其中: + +- `DATASET_PATH`:推理数据集路径。 +- `CHECKPOINT_PATH`:保存的checkpoint路径。 + +目前推理使用的是单卡(默认device 0)进行推理,推理的结果如下: + +```text +energy: -29944.03 +atom_energy: -94.38766 -94.294426 -94.39194 -94.70758 -94.51311 -94.457954 ... +force: 1.649112 -1.0982257 0.46055675 -1.3491507 -0.3382736 -0.97184074 ... +virial: -11.736662 -4.2862144 2.8852935 -4.286209 -10.408775 -5.6738224 ... +``` + +- `energy`:模拟原子体系的总势能。 +- `atom_energy`:每个原子的势能。 +- `force`:原子在3个分量上的受力。 +- `virial`:代表维里。