DeePMD Training

SkillAI & models

Train DeePMD-kit machine learning potentials. Covers DPA-3 (recommended), se_e2_a (legacy), and fine-tuning from pretrained models.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the DeePMD Training skill

What this skill tells your AI

The instructions your AI receives, as published by hello-qm/catgo-lrg in server/catgo/workflow/skills/deepmd/train/SKILL.md and read by ahel’s review.

When to Use

  • User wants to train a machine learning interatomic potential
  • User has DFT data (energies, forces, stresses) and wants a DP model
  • User wants to fine-tune a pretrained DPA-3 model

Prerequisites

  1. Training data in DeePMD format (use data/dpdata/SKILL.md to convert from VASP/QE)
  2. GPU node available on HPC
  3. deepmd-kit installed (dp --version)

Data Directory Structure

data/
├── train/
│   ├── set.000/
│   │   ├── coord.npy       # Atomic coordinates (natoms*3,)
│   │   ├── energy.npy      # Total energy (1,)
│   │   ├── force.npy       # Forces (natoms*3,)
│   │   ├── box.npy         # Cell vectors (9,)
│   │   └── virial.npy      # Stress tensor (optional, 9,)
│   └── type.raw            # Atom type indices
└── valid/
    └── set.000/
        └── ...

Workflow Steps

1. Create workflow

catgo_workflow_engine(action="create", params={"name": "DeePMD DPA-3 training"})

2. Add training task

catgo_workflow_engine(action="add_task", params={
  "workflow_id": "wf_xxx",
  "task_type": "shell",
  "name": "dp_train",
  "command": "dp train input.json 2>&1 | tee train.log",
  "input_files": {
    "input.json": "<training config>"
  },
  "system_name": "dp_model"
})

3. Add freeze step (convert to production model)

catgo_workflow_engine(action="add_task", params={
  "workflow_id": "wf_xxx",
  "task_type": "shell",
  "name": "dp_freeze",
  "command": "dp freeze -o frozen_model.pb",
  "depends_on": ["dp_train"],
  "system_name": "dp_model"
})

DPA-3 Training Config (Recommended)

{
  "model": {
    "type_map": ["Ti", "O"],
    "descriptor": {
      "type": "dpa3",
      "rcut": 6.0,
      "rcut_smth": 0.5,
      "sel": "auto",
      "neuron": [25, 50, 100],
      "n_interaction": 3,
      "n_head": 4
    },
    "fitting_net": {
      "type": "ener",
      "neuron": [240, 240, 240]
    }
  },
  "training": {
    "training_data": {
      "systems": ["./data/train"],
      "batch_size": "auto"
    },
    "validation_data": {
      "systems": ["./data/valid"],
      "batch_size": "auto"
    },
    "numb_steps": 1000000,
    "disp_freq": 1000,
    "save_freq": 10000
  },
  "learning_rate": {
    "type": "exp",
    "start_lr": 1e-3,
    "stop_lr": 1e-8,
    "decay_steps": 5000
  },
  "loss": {
    "type": "ener",
    "start_pref_e": 0.02,
    "limit_pref_e": 1.0,
    "start_pref_f": 1000,
    "limit_pref_f": 1.0,
    "start_pref_v": 0.0,
    "limit_pref_v": 0.0
  }
}

se_e2_a Training Config (Legacy)

Replace the descriptor block:

"descriptor": {
  "type": "se_e2_a",
  "rcut": 6.0,
  "rcut_smth": 0.5,
  "sel": [46, 92],
  "neuron": [25, 50, 100],
  "axis_neuron": 16
}

sel must list the max neighbor count per element type. Use dp neighbor-stat to determine.

Fine-Tuning from Pretrained Model

# Download pretrained model (e.g., from AIS Square)
# Then fine-tune:
dp train input.json --finetune pretrained.pb 2>&1 | tee finetune.log

Reduce numb_steps to 100000-200000 and start_lr to 1e-4 for fine-tuning.

Parameter Guidance

ParameterTypical valueNotes
rcut6.0-9.0 AInteraction cutoff; larger = more accurate but slower
selauto or [N1, N2]Max neighbors per type; use dp neighbor-stat
numb_steps500K-2MMore data needs more steps
start_lr1e-3Learning rate; reduce for fine-tuning
batch_sizeautoLet DeePMD choose based on system size
start_pref_f1000Force weight starts high, decays to limit_pref_f

Common Pitfalls

  1. Insufficient training data — need at least 1000-5000 frames for a reliable model. More diverse configs = better.
  2. sel too small — if max neighbors exceeds sel, training crashes. Always run dp neighbor-stat first.
  3. Overfitting — monitor validation loss. If train loss drops but valid loss plateaus, stop training or add more data.
  4. Missing virial — if training data has no stress tensor, set start_pref_v = 0, limit_pref_v = 0.
  5. Mixed element setstype_map must be consistent across all training systems and inference.
  6. Forgetting to freeze — the checkpoint directory is not the production model. Run dp freeze to create a portable .pb file.

Signals

GitHub stars
196
Forks
23
Last commit
Sep 2026

ahel recommends instead

Advanced
Catalog kind
skill
Gateway key
deepmd-train-hello-qm
Source
github.com/hello-qm/catgo-lrg