dadadaxi commited on
Commit
3de85f5
·
verified ·
1 Parent(s): 48d1aac

Upload folder using huggingface_hub

Browse files
README.md ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: gpl-3.0
3
+ tasks:
4
+ - materials-simulation
5
+ - energy-prediction
6
+ - force-prediction
7
+ - virial-prediction
8
+ - training
9
+ frameworks:
10
+ - pytorch
11
+ language:
12
+ - en
13
+ tags:
14
+ - OneScience
15
+ - NEP
16
+ - MatPL
17
+ - machine-learning-potential
18
+ - molecular-simulation
19
+ - materials-computing
20
+ - training
21
+ datasets:
22
+ - OneScience-Sugon/MatPL
23
+ ---
24
+
25
+ <p align="center">
26
+ <strong>
27
+ <span style="font-size: 30px;">NEP</span>
28
+ </strong>
29
+ </p>
30
+
31
+ # Model Introduction
32
+
33
+ NEP (Neural Evolution Potential) is a MatPL-based neural-network potential training example that learns material interaction information, including energies, forces, and virials, from atomic-structure data.
34
+
35
+ # Model Description
36
+
37
+ NEP is built on the MatPL framework and trained with data from atomic systems such as Cu and LiSiC. It supports interatomic-potential training and molecular dynamics simulations for materials systems.
38
+
39
+ # Use Cases
40
+
41
+ | Use case | Description |
42
+ | :---: | :--- |
43
+ | NEP training for Cu systems | Train a Cu potential with `demo/nep_Cu/Cu_nep_train.json` |
44
+ | NEP training for LiSiC systems | Train a LiSiC potential with `demo/nep_LiSiC/LiSiC_nep_train.json` |
45
+ | SLURM job submission | See `demo/nep_Cu/submit.sh` for cluster training |
46
+ | Custom data migration | Convert your data to a MatPL-supported format such as `pwmat/movement`, then replace the training path |
47
+
48
+ # Usage
49
+
50
+ ## 1. Using OneCode
51
+
52
+ Try intelligent, one-click AI4S programming in the OneCode online environment:
53
+
54
+ [Try intelligent, one-click AI4S programming](https://web-2069360198568017922-iaaj.ksai.scnet.cn:58043/home)
55
+
56
+ ## 2. Manual Installation and Usage
57
+
58
+ **Hardware requirements**
59
+
60
+ - A DCU or GPU is recommended for training.
61
+ - A CPU can be used for import checks and small-configuration connectivity tests, but full training will be slow.
62
+ - DCU users must install DTK in advance. DTK 25.04.2 or later, or the OneScience-recommended version matching the current cluster, is recommended.
63
+
64
+ ### Download the Model Package
65
+
66
+ ```bash
67
+ hf download --model OneScience-Sugon/NEP --local-dir ./nep
68
+ cd nep
69
+ ```
70
+
71
+ ### Install the Runtime Environment
72
+
73
+ **DCU environment**
74
+
75
+ ```bash
76
+ # Activate DTK and conda first
77
+ conda create -n onescience311 python=3.11 -y
78
+ conda activate onescience311
79
+ # uv installation is also supported
80
+ pip install onescience[matchem-dcu] -i http://mirrors.onescience.ai:3141/pypi/simple/ --trusted-host mirrors.onescience.ai
81
+ ```
82
+
83
+ **GPU environment**
84
+
85
+ ```bash
86
+ # Activate conda first
87
+ conda create -n onescience311 python=3.11 -y libstdcxx-ng=12 libgcc-ng=12 gcc_linux-64=12 gxx_linux-64=12
88
+ conda activate onescience311
89
+ # uv installation is also supported
90
+ pip install onescience[matchem-gpu] -i http://mirrors.onescience.ai:3141/pypi/simple/ --trusted-host mirrors.onescience.ai
91
+ ```
92
+
93
+ ### Install MatPL
94
+
95
+ ```bash
96
+ # The test_pip environment is used by default. To use another conda environment:
97
+ # export MATCHEM_CONDA_NAME=your_env
98
+ bash matpl_install.sh
99
+ ```
100
+
101
+ ### Training Data
102
+
103
+ Training data is not bundled with this repository. Using the MatPL dataset as an example, download it from Hugging Face to `data/` in the repository root:
104
+
105
+ ```bash
106
+ hf download --dataset OneScience-Sugon/MatPL --local-dir ./data
107
+ ```
108
+
109
+ After downloading, the data is located at `data/MatPL/`.
110
+
111
+ ### Training
112
+
113
+ Single GPU:
114
+
115
+ ```bash
116
+ cd demo/nep_Cu
117
+ MatPL train Cu_nep_train.json
118
+ ```
119
+
120
+ SLURM:
121
+
122
+ ```bash
123
+ cd demo/nep_Cu
124
+ bash submit.sh
125
+ ```
126
+
127
+ ### Trained Weights
128
+
129
+ This repository does not currently include trained weights. You can obtain them by following the training procedure above.
130
+
131
+ # Official OneScience Resources
132
+
133
+ | Platform | OneScience Main Repository | Skills Repository |
134
+ | --- | --- | --- |
135
+ | Gitee | https://gitee.com/onescience-ai/onescience | https://gitee.com/onescience-ai/oneskills |
136
+ | GitHub | https://github.com/onescience-ai/OneScience | https://github.com/onescience-ai/oneskills |
137
+
138
+ # Citation and License
139
+
140
+ - The NEP example code comes from the OneScience repository. This repository retains source attribution and has been organized for automated execution in the OneScience Hugging Face environment.
141
+ - If you use NEP or MatPL training results in research, please cite the relevant OneScience projects, MatPL/NEP methods, and the datasets used.
demo/nep_AuAg/dcu_1/AuAg_nep_train.json ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ "Ag",
5
+ "Au"
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 4.0
14
+ ],
15
+ "n_max": [
16
+ 16,
17
+ 12
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 8
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 60,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 8,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": true,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0,
54
+ "block_size": 5120,
55
+ "kalman_lambda": 0.98,
56
+ "kalman_nue": 0.9987,
57
+ "pre_fac_force": 2.0,
58
+ "pre_fac_etot": 1.0,
59
+ "pre_fac_virial": 1.0,
60
+ "max_norm": 0.5,
61
+ "norm_type": 2,
62
+ "t_0": 1,
63
+ "t_mult": 2,
64
+ "verbose": true,
65
+ "_clip_value": 1.0
66
+ },
67
+ "format": "pwmlff/npy",
68
+ "train_data": [
69
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au22",
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au38",
71
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au6",
72
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au21",
73
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au37",
74
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au5",
75
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag12"
76
+ ],
77
+ "valid_data": [
78
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag12"
79
+ ]
80
+ }
demo/nep_AuAg/dcu_1/std_input.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 47,
5
+ 79
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 4.0
14
+ ],
15
+ "n_max": [
16
+ 16,
17
+ 12
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 8
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 60,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 8,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": true,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0,
54
+ "max_norm": 0.5,
55
+ "norm_type": 2,
56
+ "t_0": 1,
57
+ "t_mult": 2
58
+ },
59
+ "format": "pwmlff/npy",
60
+ "train_data": [
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au22",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au38",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag10Au6",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au21",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au37",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag11Au5",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag12"
68
+ ],
69
+ "valid_data": [
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/pwdata/Ag12"
71
+ ]
72
+ }
demo/nep_AuAg/dcu_1/submit.sh ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_AuAg_train
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=1
6
+ #SBATCH --gres=dcu:1
7
+ #SBATCH --cpus-per-task=16
8
+ #SBATCH --time=2:00:00
9
+ #SBATCH --output=slurm_%j.out
10
+ #SBATCH --error=slurm_%j.err
11
+
12
+ if [[ -n "${SCRIPT_DIR}" ]]; then
13
+ :
14
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
15
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
16
+ else
17
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
18
+ exit 1
19
+ fi
20
+ echo $SCRIPT_DIR
21
+
22
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
23
+ source "$SCRIPT_DIR/matchem_env.sh"
24
+
25
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
26
+ # 校验MatPL根路径
27
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
28
+ echo "=============================================="
29
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
30
+ echo "当前值:${MATPL_SRC_DIR}"
31
+ echo "请设置为真实有效的MatPL源码目录,示例:"
32
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
33
+ echo "=============================================="
34
+ exit 1
35
+ fi
36
+
37
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
38
+ source "$MATPL_SRC_DIR/env.sh"
39
+ fi
40
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
41
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
42
+
43
+
44
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
45
+ INPUT_JSON="AuAg_nep_train.json"
46
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
47
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
48
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
49
+
50
+ MatPL train "$EXPANDED_JSON"
demo/nep_AuAg/dcu_16/AuAg_nep_train_16card.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": ["Ag", "Au"],
4
+ "seed": 2023,
5
+ "recover_train": true,
6
+ "model": {
7
+ "descriptor": {
8
+ "cutoff": [6.0, 4.0],
9
+ "n_max": [16, 12],
10
+ "basis_size": [12, 8],
11
+ "l_max": [4, 2, 1]
12
+ },
13
+ "fitting_net": {
14
+ "network_size": [100, 1]
15
+ }
16
+ },
17
+ "optimizer": {
18
+ "optimizer": "ADAM",
19
+ "epochs": 30,
20
+ "batch_size": 128,
21
+ "print_freq": 10,
22
+ "learning_rate": 0.001,
23
+ "stop_lr": 3.51e-08,
24
+ "stop_step": 1000000,
25
+ "decay_step": 5000,
26
+ "train_energy": true,
27
+ "train_force": true,
28
+ "train_virial": true,
29
+ "start_pre_fac_force": 1000,
30
+ "start_pre_fac_etot": 0.02,
31
+ "start_pre_fac_virial": 50.0,
32
+ "end_pre_fac_force": 1.0,
33
+ "end_pre_fac_etot": 1.0,
34
+ "end_pre_fac_virial": 1.0,
35
+ "block_size": 5120,
36
+ "kalman_lambda": 0.98,
37
+ "kalman_nue": 0.9987,
38
+ "pre_fac_force": 2.0,
39
+ "pre_fac_etot": 1.0,
40
+ "pre_fac_virial": 1.0,
41
+ "max_norm": 0.5,
42
+ "norm_type": 2,
43
+ "t_0": 1,
44
+ "t_mult": 2,
45
+ "verbose": true,
46
+ "_clip_value": 1.0
47
+ },
48
+ "format": "extxyz",
49
+ "train_data": ["/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/AuAg-5762.xyz"],
50
+ "valid_data": ["/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/AuAg-5762.xyz"]
51
+ }
demo/nep_AuAg/dcu_16/submit_16card.sh ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_AuAg_16card
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=2
5
+ #SBATCH --ntasks-per-node=8
6
+ #SBATCH --gres=dcu:8
7
+ #SBATCH --cpus-per-task=4
8
+ #SBATCH --mem=256G
9
+ #SBATCH --time=2:00:00
10
+ #SBATCH --output=slurm_16card_%j.out
11
+ #SBATCH --error=slurm_16card_%j.err
12
+
13
+ if [[ -n "${SCRIPT_DIR}" ]]; then
14
+ :
15
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
16
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
17
+ else
18
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
19
+ exit 1
20
+ fi
21
+ echo $SCRIPT_DIR
22
+
23
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
24
+ source "$SCRIPT_DIR/matchem_env.sh"
25
+
26
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
27
+ # 校验MatPL根路径
28
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
29
+ echo "=============================================="
30
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
31
+ echo "当前值:${MATPL_SRC_DIR}"
32
+ echo "请设置为真实有效的MatPL源码目录,示例:"
33
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
34
+ echo "=============================================="
35
+ exit 1
36
+ fi
37
+
38
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
39
+ source "$MATPL_SRC_DIR/env.sh"
40
+ fi
41
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
42
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
43
+
44
+ # 多节点通信设置
45
+ MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
46
+ function get_free_port() {
47
+ python -c 'import socket; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.bind(("", 0)); print(s.getsockname()[1]); s.close()'
48
+ }
49
+ MASTER_PORT=$(get_free_port)
50
+ export MASTER_ADDR=$MASTER_ADDR
51
+ export MASTER_PORT=$MASTER_PORT
52
+
53
+ # 16 卡训练(2 节点 × 8 DCU)
54
+
55
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
56
+ INPUT_JSON="AuAg_nep_train_16card.json"
57
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
58
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
59
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
60
+
61
+ srun MatPL train "$EXPANDED_JSON"
demo/nep_AuAg/dcu_8/AuAg_nep_train_8card.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": ["Ag", "Au"],
4
+ "seed": 2023,
5
+ "recover_train": true,
6
+ "model": {
7
+ "descriptor": {
8
+ "cutoff": [6.0, 4.0],
9
+ "n_max": [16, 12],
10
+ "basis_size": [12, 8],
11
+ "l_max": [4, 2, 1]
12
+ },
13
+ "fitting_net": {
14
+ "network_size": [100, 1]
15
+ }
16
+ },
17
+ "optimizer": {
18
+ "optimizer": "ADAM",
19
+ "epochs": 30,
20
+ "batch_size": 64,
21
+ "print_freq": 10,
22
+ "learning_rate": 0.001,
23
+ "stop_lr": 3.51e-08,
24
+ "stop_step": 1000000,
25
+ "decay_step": 5000,
26
+ "train_energy": true,
27
+ "train_force": true,
28
+ "train_virial": true,
29
+ "start_pre_fac_force": 1000,
30
+ "start_pre_fac_etot": 0.02,
31
+ "start_pre_fac_virial": 50.0,
32
+ "end_pre_fac_force": 1.0,
33
+ "end_pre_fac_etot": 1.0,
34
+ "end_pre_fac_virial": 1.0,
35
+ "block_size": 5120,
36
+ "kalman_lambda": 0.98,
37
+ "kalman_nue": 0.9987,
38
+ "pre_fac_force": 2.0,
39
+ "pre_fac_etot": 1.0,
40
+ "pre_fac_virial": 1.0,
41
+ "max_norm": 0.5,
42
+ "norm_type": 2,
43
+ "t_0": 1,
44
+ "t_mult": 2,
45
+ "verbose": true,
46
+ "_clip_value": 1.0
47
+ },
48
+ "format": "extxyz",
49
+ "train_data": ["/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/AuAg-5762.xyz"],
50
+ "valid_data": ["/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/AuAg/AuAg-5762.xyz"]
51
+ }
demo/nep_AuAg/dcu_8/submit_8card.sh ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_AuAg_8card
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=8
6
+ #SBATCH --gres=dcu:8
7
+ #SBATCH --cpus-per-task=4
8
+ #SBATCH --mem=256G
9
+ #SBATCH --time=2:00:00
10
+ #SBATCH --output=slurm_8card_%j.out
11
+ #SBATCH --error=slurm_8card_%j.err
12
+
13
+ if [[ -n "${SCRIPT_DIR}" ]]; then
14
+ :
15
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
16
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
17
+ else
18
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
19
+ exit 1
20
+ fi
21
+ echo $SCRIPT_DIR
22
+
23
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
24
+ source "$SCRIPT_DIR/matchem_env.sh"
25
+
26
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
27
+ # 校验MatPL根路径
28
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
29
+ echo "=============================================="
30
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
31
+ echo "当前值:${MATPL_SRC_DIR}"
32
+ echo "请设置为真实有效的MatPL源码目录,示例:"
33
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
34
+ echo "=============================================="
35
+ exit 1
36
+ fi
37
+
38
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
39
+ source "$MATPL_SRC_DIR/env.sh"
40
+ fi
41
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
42
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
43
+
44
+ # 8 卡训练
45
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
46
+ INPUT_JSON="AuAg_nep_train_8card.json"
47
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
48
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
49
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
50
+
51
+ MatPL train "$EXPANDED_JSON"
demo/nep_Cu/Cu_nep_train.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 29
5
+ ],
6
+ "seed": 2023,
7
+ "recover_train": true,
8
+ "model": {
9
+ "descriptor": {
10
+ "cutoff": [
11
+ 6.0,
12
+ 6.0
13
+ ],
14
+ "n_max": [
15
+ 4,
16
+ 4
17
+ ],
18
+ "basis_size": [
19
+ 12,
20
+ 12
21
+ ],
22
+ "l_max": [
23
+ 4,
24
+ 2,
25
+ 1
26
+ ]
27
+ },
28
+ "fitting_net": {
29
+ "network_size": [
30
+ 40,
31
+ 1
32
+ ]
33
+ }
34
+ },
35
+ "optimizer": {
36
+ "optimizer": "ADAM",
37
+ "epochs": 30,
38
+ "batch_size": 1,
39
+ "print_freq": 10,
40
+ "learning_rate": 0.001,
41
+ "stop_lr": 3.51e-08,
42
+ "stop_step": 1000000,
43
+ "decay_step": 5000,
44
+ "train_energy": true,
45
+ "train_force": true,
46
+ "train_virial": false,
47
+ "start_pre_fac_force": 1000,
48
+ "start_pre_fac_etot": 0.02,
49
+ "start_pre_fac_virial": 50.0,
50
+ "end_pre_fac_force": 1.0,
51
+ "end_pre_fac_etot": 1.0,
52
+ "end_pre_fac_virial": 1.0
53
+ },
54
+ "format": "pwmat/movement",
55
+ "train_data": [
56
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/0_300_MOVEMENT",
57
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/1_500_MOVEMENT"
58
+ ],
59
+ "valid_data": [
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/valid_movement"
61
+ ]
62
+ }
demo/nep_Cu/std_input.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 29
5
+ ],
6
+ "seed": 2023,
7
+ "recover_train": true,
8
+ "model": {
9
+ "descriptor": {
10
+ "cutoff": [
11
+ 6.0,
12
+ 6.0
13
+ ],
14
+ "n_max": [
15
+ 4,
16
+ 4
17
+ ],
18
+ "basis_size": [
19
+ 12,
20
+ 12
21
+ ],
22
+ "l_max": [
23
+ 4,
24
+ 2,
25
+ 1
26
+ ]
27
+ },
28
+ "fitting_net": {
29
+ "network_size": [
30
+ 40,
31
+ 1
32
+ ]
33
+ }
34
+ },
35
+ "optimizer": {
36
+ "optimizer": "ADAM",
37
+ "epochs": 30,
38
+ "batch_size": 1,
39
+ "print_freq": 10,
40
+ "learning_rate": 0.001,
41
+ "stop_lr": 3.51e-08,
42
+ "stop_step": 1000000,
43
+ "decay_step": 5000,
44
+ "train_energy": true,
45
+ "train_force": true,
46
+ "train_virial": false,
47
+ "start_pre_fac_force": 1000,
48
+ "start_pre_fac_etot": 0.02,
49
+ "start_pre_fac_virial": 50.0,
50
+ "end_pre_fac_force": 1.0,
51
+ "end_pre_fac_etot": 1.0,
52
+ "end_pre_fac_virial": 1.0
53
+ },
54
+ "format": "pwmat/movement",
55
+ "train_data": [
56
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/0_300_MOVEMENT",
57
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/1_500_MOVEMENT"
58
+ ],
59
+ "valid_data": [
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/Cu/pwdata/valid_movement"
61
+ ]
62
+ }
demo/nep_Cu/submit.sh ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_Cu_train
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=1
6
+ #SBATCH --gres=dcu:1
7
+ #SBATCH --cpus-per-task=16
8
+ #SBATCH --time=2:00:00
9
+ #SBATCH --output=slurm_%j.out
10
+ #SBATCH --error=slurm_%j.err
11
+
12
+ if [[ -n "${SCRIPT_DIR}" ]]; then
13
+ :
14
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
15
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
16
+ else
17
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
18
+ exit 1
19
+ fi
20
+ echo $SCRIPT_DIR
21
+
22
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
23
+ source "$SCRIPT_DIR/matchem_env.sh"
24
+
25
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
26
+ # 校验MatPL根路径
27
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
28
+ echo "=============================================="
29
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
30
+ echo "当前值:${MATPL_SRC_DIR}"
31
+ echo "请设置为真实有效的MatPL源码目录,示例:"
32
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
33
+ echo "=============================================="
34
+ exit 1
35
+ fi
36
+
37
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
38
+ source "$MATPL_SRC_DIR/env.sh"
39
+ fi
40
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
41
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
42
+
43
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
44
+ INPUT_JSON="Cu_nep_train.json"
45
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
46
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
47
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
48
+
49
+ MatPL train "$EXPANDED_JSON"
demo/nep_HfO2/dcu_1/HfO2_nep_test.json ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 8,
5
+ 72
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 6.0
14
+ ],
15
+ "n_max": [
16
+ 4,
17
+ 4
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 12
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 40,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 1,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": false,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0
54
+ },
55
+ "format": "pwmlff/npy",
56
+ "model_load_file": "./model_record/nep_model.ckpt",
57
+ "test_data": [
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_012_50",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_016_50",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_020_20",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_024_20",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_001_50",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_005_50",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_009_50",
68
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_013_50",
69
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_017_50",
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_021_20",
71
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_025_20",
72
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_002_50",
73
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_006_50",
74
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_010_50",
75
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_014_50",
76
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_018_50",
77
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_022_20",
78
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_026_20",
79
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_003_50",
80
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_007_50",
81
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_011_50",
82
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_015_30",
83
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_019_50",
84
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_023_20",
85
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_027_20"
86
+ ]
87
+ }
demo/nep_HfO2/dcu_1/HfO2_nep_train.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 8,
5
+ 72
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 6.0
14
+ ],
15
+ "n_max": [
16
+ 4,
17
+ 4
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 12
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 40,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 1,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": false,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0
54
+ },
55
+ "format": "pwmlff/npy",
56
+ "train_data": [
57
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_002_50/",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_006_50/",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_010_50/",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_012_50/",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_014_50/",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_016_50/",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_018_50/",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_020_20/",
68
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_022_20/",
69
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_024_20/",
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_026_20/",
71
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_001_50/",
72
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_003_50/",
73
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_005_50/",
74
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_007_50/",
75
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_009_50/",
76
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_011_50/",
77
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_013_50/",
78
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_015_30/",
79
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_017_50/",
80
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_019_50/",
81
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_021_20/",
82
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_023_20/",
83
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_025_20/",
84
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_027_20/"
85
+ ],
86
+ "valid_data": [
87
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
88
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
89
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/"
90
+ ]
91
+ }
demo/nep_HfO2/dcu_1/submit.sh ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_HfO2_train
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=1
6
+ #SBATCH --gres=dcu:1
7
+ #SBATCH --cpus-per-task=16
8
+ #SBATCH --time=2:00:00
9
+ #SBATCH --output=slurm_%j.out
10
+ #SBATCH --error=slurm_%j.err
11
+
12
+ if [[ -n "${SCRIPT_DIR}" ]]; then
13
+ :
14
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
15
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
16
+ else
17
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
18
+ exit 1
19
+ fi
20
+ echo $SCRIPT_DIR
21
+
22
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
23
+ source "$SCRIPT_DIR/matchem_env.sh"
24
+
25
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
26
+ # 校验MatPL根路径
27
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
28
+ echo "=============================================="
29
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
30
+ echo "当前值:${MATPL_SRC_DIR}"
31
+ echo "请设置为真实有效的MatPL源码目录,示例:"
32
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
33
+ echo "=============================================="
34
+ exit 1
35
+ fi
36
+
37
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
38
+ source "$MATPL_SRC_DIR/env.sh"
39
+ fi
40
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
41
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
42
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
43
+ INPUT_JSON="HfO2_nep_train.json"
44
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
45
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
46
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
47
+
48
+ MatPL train "$EXPANDED_JSON"
demo/nep_HfO2/dcu_16/HfO2_nep_train_16card.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 8,
5
+ 72
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 6.0
14
+ ],
15
+ "n_max": [
16
+ 4,
17
+ 4
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 12
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 40,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 16,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": false,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0
54
+ },
55
+ "format": "pwmlff/npy",
56
+ "train_data": [
57
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_002_50/",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_006_50/",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_010_50/",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_012_50/",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_014_50/",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_016_50/",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_018_50/",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_020_20/",
68
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_022_20/",
69
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_024_20/",
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_026_20/",
71
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_001_50/",
72
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_003_50/",
73
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_005_50/",
74
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_007_50/",
75
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_009_50/",
76
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_011_50/",
77
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_013_50/",
78
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_015_30/",
79
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_017_50/",
80
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_019_50/",
81
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_021_20/",
82
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_023_20/",
83
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_025_20/",
84
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_027_20/"
85
+ ],
86
+ "valid_data": [
87
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
88
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
89
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/"
90
+ ]
91
+ }
demo/nep_HfO2/dcu_16/submit_16card.sh ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_HfO2_16card
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=2
5
+ #SBATCH --ntasks-per-node=8
6
+ #SBATCH --gres=dcu:8
7
+ #SBATCH --cpus-per-task=4
8
+ #SBATCH --mem=256G
9
+ #SBATCH --time=2:00:00
10
+ #SBATCH --output=slurm_16card_%j.out
11
+ #SBATCH --error=slurm_16card_%j.err
12
+
13
+ if [[ -n "${SCRIPT_DIR}" ]]; then
14
+ :
15
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
16
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
17
+ else
18
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
19
+ exit 1
20
+ fi
21
+ echo $SCRIPT_DIR
22
+
23
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
24
+ source "$SCRIPT_DIR/matchem_env.sh"
25
+
26
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
27
+ # 校验MatPL根路径
28
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
29
+ echo "=============================================="
30
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
31
+ echo "当前值:${MATPL_SRC_DIR}"
32
+ echo "请设置为真实有效的MatPL源码目录,示例:"
33
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
34
+ echo "=============================================="
35
+ exit 1
36
+ fi
37
+
38
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
39
+ source "$MATPL_SRC_DIR/env.sh"
40
+ fi
41
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
42
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
43
+
44
+ # 多节点通信设置
45
+ MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1)
46
+ function get_free_port() {
47
+ python -c 'import socket; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.bind(("", 0)); print(s.getsockname()[1]); s.close()'
48
+ }
49
+ MASTER_PORT=$(get_free_port)
50
+ export MASTER_ADDR=$MASTER_ADDR
51
+ export MASTER_PORT=$MASTER_PORT
52
+
53
+ # 16 卡训练(2 节点 × 8 DCU)
54
+
55
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
56
+ INPUT_JSON="HfO2_nep_train_16card.json"
57
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
58
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
59
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
60
+
61
+ srun MatPL train "$EXPANDED_JSON"
demo/nep_HfO2/dcu_8/HfO2_nep_train_8card.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 8,
5
+ 72
6
+ ],
7
+ "seed": 2023,
8
+ "recover_train": true,
9
+ "model": {
10
+ "descriptor": {
11
+ "cutoff": [
12
+ 6.0,
13
+ 6.0
14
+ ],
15
+ "n_max": [
16
+ 4,
17
+ 4
18
+ ],
19
+ "basis_size": [
20
+ 12,
21
+ 12
22
+ ],
23
+ "l_max": [
24
+ 4,
25
+ 2,
26
+ 1
27
+ ]
28
+ },
29
+ "fitting_net": {
30
+ "network_size": [
31
+ 40,
32
+ 1
33
+ ]
34
+ }
35
+ },
36
+ "optimizer": {
37
+ "optimizer": "ADAM",
38
+ "epochs": 30,
39
+ "batch_size": 8,
40
+ "print_freq": 10,
41
+ "learning_rate": 0.001,
42
+ "stop_lr": 3.51e-08,
43
+ "stop_step": 1000000,
44
+ "decay_step": 5000,
45
+ "train_energy": true,
46
+ "train_force": true,
47
+ "train_virial": false,
48
+ "start_pre_fac_force": 1000,
49
+ "start_pre_fac_etot": 0.02,
50
+ "start_pre_fac_virial": 50.0,
51
+ "end_pre_fac_force": 1.0,
52
+ "end_pre_fac_etot": 1.0,
53
+ "end_pre_fac_virial": 1.0
54
+ },
55
+ "format": "pwmlff/npy",
56
+ "train_data": [
57
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_002_50/",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_006_50/",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_010_50/",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_012_50/",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_014_50/",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_016_50/",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_018_50/",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_020_20/",
68
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_022_20/",
69
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_024_20/",
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_026_20/",
71
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_001_50/",
72
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_003_50/",
73
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_005_50/",
74
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_007_50/",
75
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_009_50/",
76
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_011_50/",
77
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_013_50/",
78
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_015_30/",
79
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_017_50/",
80
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_019_50/",
81
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_021_20/",
82
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_023_20/",
83
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_025_20/",
84
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_027_20/"
85
+ ],
86
+ "valid_data": [
87
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_000_50/",
88
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_004_50/",
89
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/HfO2/pwdata/init_008_50/"
90
+ ]
91
+ }
demo/nep_HfO2/dcu_8/submit_8card.sh ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_HfO2_8card
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=8
6
+ #SBATCH --gres=dcu:8
7
+ #SBATCH --cpus-per-task=4
8
+ #SBATCH --mem=400G
9
+ #SBATCH --time=2:00:00
10
+ #SBATCH --output=slurm_8card_%j.out
11
+ #SBATCH --error=slurm_8card_%j.err
12
+
13
+ if [[ -n "${SCRIPT_DIR}" ]]; then
14
+ :
15
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
16
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
17
+ else
18
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
19
+ exit 1
20
+ fi
21
+ echo $SCRIPT_DIR
22
+
23
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
24
+ source "$SCRIPT_DIR/matchem_env.sh"
25
+
26
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
27
+ # 校验MatPL根路径
28
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
29
+ echo "=============================================="
30
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
31
+ echo "当前值:${MATPL_SRC_DIR}"
32
+ echo "请设置为真实有效的MatPL源码目录,示例:"
33
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
34
+ echo "=============================================="
35
+ exit 1
36
+ fi
37
+
38
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
39
+ source "$MATPL_SRC_DIR/env.sh"
40
+ fi
41
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
42
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
43
+
44
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
45
+ INPUT_JSON="HfO2_nep_train_8card.json"
46
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
47
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
48
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
49
+
50
+ MatPL train "$EXPANDED_JSON"
demo/nep_LiSiC/LiSiC_nep_train.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 3,
5
+ 14,
6
+ 6
7
+ ],
8
+ "seed": 2023,
9
+ "recover_train": true,
10
+ "model": {
11
+ "descriptor": {
12
+ "cutoff": [
13
+ 6.0,
14
+ 6.0
15
+ ],
16
+ "n_max": [
17
+ 4,
18
+ 4
19
+ ],
20
+ "basis_size": [
21
+ 12,
22
+ 12
23
+ ],
24
+ "l_max": [
25
+ 4,
26
+ 2,
27
+ 1
28
+ ]
29
+ },
30
+ "fitting_net": {
31
+ "network_size": [
32
+ 40,
33
+ 1
34
+ ]
35
+ }
36
+ },
37
+ "optimizer": {
38
+ "optimizer": "ADAM",
39
+ "epochs": 30,
40
+ "batch_size": 1,
41
+ "print_freq": 10,
42
+ "learning_rate": 0.001,
43
+ "stop_lr": 3.51e-08,
44
+ "stop_step": 1000000,
45
+ "decay_step": 5000,
46
+ "train_energy": true,
47
+ "train_force": true,
48
+ "train_virial": false,
49
+ "start_pre_fac_force": 1000,
50
+ "start_pre_fac_etot": 0.02,
51
+ "start_pre_fac_virial": 50.0,
52
+ "end_pre_fac_force": 1.0,
53
+ "end_pre_fac_etot": 1.0,
54
+ "end_pre_fac_virial": 1.0
55
+ },
56
+ "format": "pwmlff/npy",
57
+ "train_data": [
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C2",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C448",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C448Li75",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C64Si32",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li1Si24",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li3Si8",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li8",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li88Si20",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Si1",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Si217"
68
+ ],
69
+ "valid_data": [
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C2"
71
+ ]
72
+ }
demo/nep_LiSiC/std_input.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_type": "NEP",
3
+ "atom_type": [
4
+ 3,
5
+ 14,
6
+ 6
7
+ ],
8
+ "seed": 2023,
9
+ "recover_train": true,
10
+ "model": {
11
+ "descriptor": {
12
+ "cutoff": [
13
+ 6.0,
14
+ 6.0
15
+ ],
16
+ "n_max": [
17
+ 4,
18
+ 4
19
+ ],
20
+ "basis_size": [
21
+ 12,
22
+ 12
23
+ ],
24
+ "l_max": [
25
+ 4,
26
+ 2,
27
+ 1
28
+ ]
29
+ },
30
+ "fitting_net": {
31
+ "network_size": [
32
+ 40,
33
+ 1
34
+ ]
35
+ }
36
+ },
37
+ "optimizer": {
38
+ "optimizer": "ADAM",
39
+ "epochs": 30,
40
+ "batch_size": 1,
41
+ "print_freq": 10,
42
+ "learning_rate": 0.001,
43
+ "stop_lr": 3.51e-08,
44
+ "stop_step": 1000000,
45
+ "decay_step": 5000,
46
+ "train_energy": true,
47
+ "train_force": true,
48
+ "train_virial": false,
49
+ "start_pre_fac_force": 1000,
50
+ "start_pre_fac_etot": 0.02,
51
+ "start_pre_fac_virial": 50.0,
52
+ "end_pre_fac_force": 1.0,
53
+ "end_pre_fac_etot": 1.0,
54
+ "end_pre_fac_virial": 1.0
55
+ },
56
+ "format": "pwmlff/npy",
57
+ "train_data": [
58
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C2",
59
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C448",
60
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C448Li75",
61
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C64Si32",
62
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li1Si24",
63
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li3Si8",
64
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li8",
65
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Li88Si20",
66
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Si1",
67
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/Si217"
68
+ ],
69
+ "valid_data": [
70
+ "/public/share/sugonhpcapp01/onestore/onedatasets/matchem/matpl/LiSiC/pwdata/C2"
71
+ ]
72
+ }
demo/nep_LiSiC/submit.sh ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=nep_LiSiC_train
3
+ #SBATCH --partition=hx1hdexclu12
4
+ #SBATCH --nodes=1
5
+ #SBATCH --ntasks-per-node=1
6
+ #SBATCH --gres=dcu:1
7
+ #SBATCH --cpus-per-task=16
8
+ #SBATCH --time=2:00:00
9
+ #SBATCH --output=slurm_%j.out
10
+ #SBATCH --error=slurm_%j.err
11
+
12
+ if [[ -n "${SCRIPT_DIR}" ]]; then
13
+ :
14
+ elif [[ -n "${SLURM_SUBMIT_DIR}" ]]; then
15
+ SCRIPT_DIR="${SLURM_SUBMIT_DIR}"
16
+ else
17
+ echo "ERROR: 未检测到外部 SCRIPT_DIR 变量,也不在 Slurm 任务环境(SLURM_SUBMIT_DIR 为空)"
18
+ exit 1
19
+ fi
20
+ echo $SCRIPT_DIR
21
+
22
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
23
+ source "$SCRIPT_DIR/matchem_env.sh"
24
+
25
+ # MatPL 运行时环境(不侵入 matchem_env.sh,各算例自行维护)
26
+ # 校验MatPL根路径
27
+ if [[ -z "${MATPL_SRC_DIR}" || "${MATPL_SRC_DIR}" == "/path/to/matpl_dcu" || ! -d "${MATPL_SRC_DIR}" ]]; then
28
+ echo "=============================================="
29
+ echo "ERROR: MATPL_SRC_DIR 路径配置错误!"
30
+ echo "当前值:${MATPL_SRC_DIR}"
31
+ echo "请设置为真实有效的MatPL源码目录,示例:"
32
+ echo "export MATPL_SRC_DIR=/public/home/xxx/real_matpl_path"
33
+ echo "=============================================="
34
+ exit 1
35
+ fi
36
+
37
+ if [ -f "$MATPL_SRC_DIR/env.sh" ]; then
38
+ source "$MATPL_SRC_DIR/env.sh"
39
+ fi
40
+ echo "MATPL_SRC_DIR = $MATPL_SRC_DIR"
41
+ export LD_LIBRARY_PATH="$MATPL_SRC_DIR/src/op/build/lib:${LD_LIBRARY_PATH:-}"
42
+
43
+ # 单卡训练
44
+
45
+ # 输入 JSON 使用环境变量,运行前展开为临时文件
46
+ INPUT_JSON="LiSiC_nep_train.json"
47
+ EXPANDED_JSON=".${INPUT_JSON%.json}_expanded_$$.json"
48
+ trap 'rm -f "$EXPANDED_JSON"' EXIT
49
+ python3 -c "import os; open('$EXPANDED_JSON','w').write(os.path.expandvars(open('$INPUT_JSON').read()))"
50
+
51
+ MatPL train "$EXPANDED_JSON"
matchem_env.sh ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ==========================================
3
+ # MatChem 统一环境配置脚本
4
+ # 用途:加载模块、激活 conda、导出各组件路径
5
+ # 用法:source matchem_env.sh
6
+ # 注意:默认激活 conda 环境 test_pip;若使用其他环境名,请执行:
7
+ # MATCHEM_CONDA_NAME=your_env source matchem_env.sh
8
+ # ==========================================
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+
12
+ # ---------- 1. 基础环境配置 ----------
13
+ export MATCHEM_CONDA_NAME="${MATCHEM_CONDA_NAME:-test_pip}"
14
+
15
+ # ---------- 2. OneScience 运行时环境变量 ----------
16
+ export ONESCIENCE_DATASETS_DIR="/public/share/sugonhpcapp01/onestore/onedatasets"
17
+ export ONESCIENCE_MODELS_DIR="/public/share/sugonhpcapp01/onestore/onemodels"
18
+ export device="gpu" # 根据实际平台改为 gpu 或 dcu
19
+ export LD_LIBRARY_PATH="${CONDA_PREFIX:-}/lib:${LD_LIBRARY_PATH:-}"
20
+
21
+ # ---------- 3. 外部软件路径(使用 dp_install.sh / matpl_install.sh / lmp_install.sh 时会自动更新) ----------
22
+ # DeepMD-kit 源码目录
23
+ export DEEPMD_SRC_DIR="${SCRIPT_DIR}/deepmd-kit"
24
+
25
+ # MatPL 源码目录
26
+ export MATPL_SRC_DIR="${SCRIPT_DIR}/matpl_dcu"
27
+
28
+ # LAMMPS 安装目录
29
+ export LAMMPS_INSTALL_DIR="${SCRIPT_DIR}/lammps_dcu"
30
+
31
+ # DeepMD C++ 接口目录
32
+ export DP_CPP_DIR="${SCRIPT_DIR}/dp_cpp_dcu"
33
+
34
+ # ---------- 4. 加载集群模块与 conda ----------
35
+ set +u
36
+ source ~/.bashrc
37
+ set -u
38
+ module load sghpcdas/25.6 # DTK / PyTorch 等 SDK
39
+ module load sghpc-mpi-gcc/26.3 # MPI 与 GCC 编译器
40
+
41
+ conda activate "$MATCHEM_CONDA_NAME"
42
+
43
+ # ---------- 6. LAMMPS 运行时环境 ----------
44
+ export LD_LIBRARY_PATH=${LAMMPS_INSTALL_DIR}/lib64:${LD_LIBRARY_PATH:-}
45
+ export LD_LIBRARY_PATH=${LAMMPS_INSTALL_DIR}/lib_override:${LD_LIBRARY_PATH:-}
46
+ export LAMMPS_PLUGIN_PATH=${DP_CPP_DIR}/lib
47
+
48
+ echo "✅ MatChem 环境已激活: ${MATCHEM_CONDA_NAME}"
matpl_install.sh ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # -----------------------------------------------------------------------------
3
+ # MatPL DCU 一键安装脚本
4
+ # 流程:源码拉取 → 编译安装 → 安装验证
5
+ # 用法:bash matpl_install.sh
6
+ # MATPL_SRC_DIR=/path/to/src bash matpl_install.sh # 指定源码路径
7
+ # -----------------------------------------------------------------------------
8
+
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ cd "$SCRIPT_DIR"
11
+
12
+ # 1. 环境准备
13
+ echo ">>> Step 1: 加载环境"
14
+ source "$SCRIPT_DIR/../matchem_env.sh"
15
+
16
+ # 1.5 确保 gflags/glog 运行库存在(torch cmake 的运行时依赖,pip 环境通常缺失)
17
+ echo ">>> Step 1.5: 检查 gflags/glog 运行库"
18
+ MISSING_PKGS=""
19
+ ls "$CONDA_PREFIX"/lib/libgflags.so* >/dev/null 2>&1 || MISSING_PKGS="${MISSING_PKGS} gflags"
20
+ ls "$CONDA_PREFIX"/lib/libglog.so* >/dev/null 2>&1 || MISSING_PKGS="${MISSING_PKGS} glog"
21
+ if [ -n "${MISSING_PKGS}" ]; then
22
+ echo ">>> 安装缺失的运行库:${MISSING_PKGS}(conda-forge)"
23
+ conda install -y -c conda-forge ${MISSING_PKGS}
24
+ else
25
+ echo ">>> gflags/glog 已存在,跳过"
26
+ fi
27
+
28
+ # 下载辅助:优先 curl,失败时回退 wget(部分节点 curl 存在 TLS/代理问题)
29
+ download_file() {
30
+ local url="$1" out="$2"
31
+ if command -v curl >/dev/null 2>&1 && curl -fL -o "$out" "$url"; then
32
+ return 0
33
+ fi
34
+ echo "[提示] curl 下载失败,改用 wget: $url"
35
+ if command -v wget >/dev/null 2>&1 && wget -O "$out" "$url"; then
36
+ return 0
37
+ fi
38
+ echo "[错误] 下载失败: $url"
39
+ return 1
40
+ }
41
+
42
+ # 2. 交互式配置源码路径
43
+ MATPL_SRC="${MATPL_SRC_DIR:-${SCRIPT_DIR}/matpl_dcu}"
44
+ if [ -t 0 ]; then
45
+ read -rp "请输入 MatPL 源码路径 [默认: ${MATPL_SRC}]: " input_src
46
+ MATPL_SRC="${input_src:-${MATPL_SRC}}"
47
+ fi
48
+ echo "[提示] 使用 MatPL 源码路径: ${MATPL_SRC}"
49
+
50
+ # 3. 源码准备
51
+ # 说明:
52
+ # - 开发/测试阶段:自动通过 HTTPS + 代理拉取源码
53
+ # - 生产/客户场景:建议提前上传源码到集群,通过 MATPL_SRC_DIR 指定
54
+ if [ ! -d "$MATPL_SRC/.git" ] && [ ! -f "$MATPL_SRC/main.py" ]; then
55
+ echo ">>> Step 3: 拉取 MatPL DCU 源码"
56
+ # 计算节点需通过 HTTP 代理访问外网,配置 git 代理,如代理实效,可向集群管理员重新申请
57
+ git config --global http.proxy "http://scnethpc2601:sWMtqVS@10.16.1.52:3120"
58
+ git clone --depth 1 --branch nep-dcu/2026.3 "https://gitee.com/wang-rui-sugon/matpl_dcu.git" "$MATPL_SRC"
59
+ else
60
+ echo ">>> Step 3: 源码已存在,跳过拉取"
61
+ fi
62
+
63
+ cd "$MATPL_SRC"
64
+
65
+ echo "=========================================="
66
+ echo " MatPL DCU 一键安装脚本"
67
+ echo "=========================================="
68
+ echo "工作目录: $MATPL_SRC"
69
+
70
+ # 3.5 Patch MatPL CMakeLists.txt:避免在登录节点触发 torch 动态库加载
71
+ echo ">>> Step 3.5: Patch MatPL CMakeLists.txt,避免登录节点 import torch"
72
+ OP_CMAKE="$MATPL_SRC/src/op/CMakeLists.txt"
73
+ CHEB_CMAKE="$MATPL_SRC/src/feature/chebyshev/CMakeLists.txt"
74
+
75
+ if [ -f "$OP_CMAKE" ]; then
76
+ sed -i "s|import torch; print(torch.utils.cmake_prefix_path)|import importlib.util, os; spec = importlib.util.find_spec('torch'); p = os.path.dirname(spec.origin) if spec and spec.origin else ''; print((p + '/share/cmake') if p else '')|" "$OP_CMAKE"
77
+ sed -i "s|import torch; print(torch.__path__\[0\])|import importlib.util, os; spec = importlib.util.find_spec('torch'); print(os.path.dirname(spec.origin) if spec and spec.origin else '')|" "$OP_CMAKE"
78
+ sed -i "s|import torch; print(torch.version.hip is not None)|print(True)|" "$OP_CMAKE"
79
+ echo ">>> 已 patch $OP_CMAKE"
80
+ fi
81
+
82
+ if [ -f "$CHEB_CMAKE" ]; then
83
+ sed -i "s|import torch; print(torch.utils.cmake_prefix_path)|import importlib.util, os; spec = importlib.util.find_spec('torch'); p = os.path.dirname(spec.origin) if spec and spec.origin else ''; print((p + '/share/cmake') if p else '')|" "$CHEB_CMAKE"
84
+ echo ">>> 已 patch $CHEB_CMAKE"
85
+ fi
86
+
87
+ # 4. 修复 torch cmake 中硬编码的 /opt/dtk 路径
88
+ TORCH_CMAKE="$CONDA_PREFIX/lib/python3.11/site-packages/torch/share/cmake/Caffe2/Caffe2Targets.cmake"
89
+ if [ -f "$TORCH_CMAKE" ]; then
90
+ if grep -q "/opt/dtk" "$TORCH_CMAKE"; then
91
+ echo ">>> Step 4: 修复 torch cmake 硬编码路径"
92
+ sed -i "s|/opt/dtk|$ROCM_PATH|g" "$TORCH_CMAKE"
93
+ else
94
+ echo ">>> Step 4: torch cmake 路径已正确,跳过修复"
95
+ fi
96
+ else
97
+ echo "警告: 未找到 torch Caffe2Targets.cmake,跳过修复"
98
+ fi
99
+
100
+ # 5. 确保安装兼容版 glog(0.7+ API 不兼容)
101
+ echo ">>> Step 5: 确保 glog 0.6 已安装"
102
+ if [ -f "$CONDA_PREFIX/lib/libglog.so.1" ]; then
103
+ echo "glog 0.6+ 已存在,跳过安装"
104
+ else
105
+ echo "从源码编译 glog 0.6 ..."
106
+ GLOG_BUILD_DIR=$(mktemp -d)
107
+ cd "$GLOG_BUILD_DIR"
108
+ download_file "https://github.com/google/glog/archive/refs/tags/v0.6.0.tar.gz" v0.6.0.tar.gz || exit 1
109
+ tar -xzf v0.6.0.tar.gz
110
+ cd glog-0.6.0
111
+ cmake -S . -B build \
112
+ -DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" \
113
+ -DBUILD_SHARED_LIBS=ON \
114
+ -DWITH_GTEST=OFF
115
+ cmake --build build -j$(nproc)
116
+ cmake --install build
117
+ cd "$MATPL_SRC"
118
+ rm -rf "$GLOG_BUILD_DIR"
119
+ fi
120
+
121
+ # 6. 导出编译所需环境变量
122
+ echo ">>> Step 6: 导出编译环境变量"
123
+ export ROCM_PATH="$ROCM_PATH"
124
+ export CUDA_TOOLKIT_ROOT_DIR="${ROCM_PATH}/cuda/cuda-12"
125
+ export PATH="${ROCM_PATH}/cuda/cuda-12/bin:$PATH"
126
+ export CMAKE_PREFIX_PATH="${ROCM_PATH}/lib/cmake:${ROCM_PATH}/dcc/comgr/lib64/cmake/amd_comgr:${CMAKE_PREFIX_PATH:-}"
127
+ export LIBRARY_PATH="${ROCM_PATH}/cuda/cuda-12/targets/x86_64-linux/lib:${ROCM_PATH}/dcc/lib/clang/17.0.0/lib/linux:${LIBRARY_PATH:-}"
128
+ export CPLUS_INCLUDE_PATH="$CONDA_PREFIX/include:${CPLUS_INCLUDE_PATH:-}"
129
+
130
+ # 修复 GCC 版本:强制使用 sghpc-mpi-gcc/26.3 提供的 GCC 12.4.0
131
+ export CC=/public/software/sghpc_sdk.bak/Linux_x86_64/26.3/compilers/gcc-12.4.0/bin/gcc
132
+ export CXX=/public/software/sghpc_sdk.bak/Linux_x86_64/26.3/compilers/gcc-12.4.0/bin/g++
133
+
134
+ # 7. 清理历史编译产物并重新编译
135
+ echo ">>> Step 7: 开始编译 MatPL"
136
+ cd src
137
+ rm -rf feature/nep_find_neigh/build feature/NEP_GPU/build op/build
138
+
139
+ # 登录节点内存有限,限制并行编译数以避免 OOM
140
+ NPROC=$(nproc)
141
+ if [ "$NPROC" -gt 2 ]; then
142
+ NPROC=2
143
+ fi
144
+ echo ">>> 限制并行编译数为 ${NPROC}(避免节点 OOM)"
145
+ bash build.sh -j${NPROC}
146
+
147
+ # 8. 生成 env.sh
148
+ cd "$MATPL_SRC"
149
+ cat > env.sh <<EOF
150
+ # Load for MatPL
151
+ export PYTHONPATH=$MATPL_SRC:\${PYTHONPATH:-}
152
+ export PATH=$MATPL_SRC/src/bin:\${PATH:-}
153
+ EOF
154
+
155
+ # 9. 验证
156
+ echo ">>> Step 9: 验证安装"
157
+ source env.sh
158
+ python -c "import matpl; print('MatPL import OK')" 2>/dev/null || \
159
+ python -c "import sys; sys.path.insert(0, '$MATPL_SRC'); import matpl; print('MatPL import OK')" 2>/dev/null || \
160
+ echo "注意: MatPL Python 包导入验证跳过(不影响 C++ 算子使用)"
161
+
162
+ # 10. 将配置写回 matchem_env.sh
163
+ MATCHEM_ENV_FILE="${SCRIPT_DIR}/../matchem_env.sh"
164
+ if [ -f "${MATCHEM_ENV_FILE}" ]; then
165
+ echo "[提示] 更新 ${MATCHEM_ENV_FILE} ..."
166
+ sed -i "s|^export MATPL_SRC_DIR=.*|export MATPL_SRC_DIR=${MATPL_SRC}|" "${MATCHEM_ENV_FILE}"
167
+ else
168
+ echo "[警告] 未找到 ${MATCHEM_ENV_FILE},跳过写入配置。"
169
+ fi
170
+
171
+ echo ""
172
+ echo "=========================================="
173
+ echo " MatPL DCU 安装完成!"
174
+ echo "=========================================="
175
+ echo "源码路径: $MATPL_SRC"
176
+ echo "环境文件: $MATPL_SRC/env.sh"
177
+ echo ""
178
+ echo "每次使用前请执行:"
179
+ echo " source $SCRIPT_DIR/../matchem_env.sh"