Skip to content

Commit a465fab

Browse files
authored
Merge branch 'master' into 0225-lmdb-dataloader
2 parents 81ee6c6 + b2c8511 commit a465fab

95 files changed

Lines changed: 5951 additions & 459 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build_wheel.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,12 @@ jobs:
138138

139139
- name: Extract metadata (tags, labels) for Docker
140140
id: meta
141-
uses: docker/metadata-action@v5
141+
uses: docker/metadata-action@v6
142142
with:
143143
images: ghcr.io/deepmodeling/deepmd-kit
144144

145145
- name: Build and push Docker image
146-
uses: docker/build-push-action@v6
146+
uses: docker/build-push-action@v7
147147
with:
148148
context: source/install/docker
149149
push: ${{ github.repository_owner == 'deepmodeling' && github.event_name == 'push' && github.actor != 'dependabot[bot]' }}

.github/workflows/test_cuda.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
- run: |
4848
export PYTORCH_ROOT=$(python -c 'import torch;print(torch.__path__[0])')
4949
export TENSORFLOW_ROOT=$(python -c 'import importlib.util,pathlib;print(pathlib.Path(importlib.util.find_spec("tensorflow").origin).parent)')
50-
pip install --find-links "https://www.paddlepaddle.org.cn/packages/nightly/cu126/paddlepaddle-gpu/" --index-url https://pypi.org/simple "paddlepaddle-gpu==3.3.0.dev20251204"
50+
pip install --find-links "https://www.paddlepaddle.org.cn/packages/nightly/cu126/paddlepaddle-gpu/" --index-url https://pypi.org/simple --trusted-host www.paddlepaddle.org.cn --trusted-host paddlepaddle.org.cn "paddlepaddle-gpu==3.4.0.dev20260310"
5151
source/install/uv_with_retry.sh pip install --system -v -e .[gpu,test,lmp,cu12,torch,jax] mpi4py --reinstall-package deepmd-kit
5252
# See https://github.com/jax-ml/jax/issues/29042
5353
source/install/uv_with_retry.sh pip install --system -U 'nvidia-cublas-cu12>=12.9.0.13'

.github/workflows/test_python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
export TENSORFLOW_ROOT=$(python -c 'import importlib.util,pathlib;print(pathlib.Path(importlib.util.find_spec("tensorflow").origin).parent)')
3333
export PYTORCH_ROOT=$(python -c 'import torch;print(torch.__path__[0])')
3434
source/install/uv_with_retry.sh pip install --system -e .[test,jax] mpi4py --group pin_jax
35-
source/install/uv_with_retry.sh pip install --system --find-links "https://www.paddlepaddle.org.cn/packages/nightly/cpu/paddlepaddle/" --index-url https://pypi.org/simple paddlepaddle==3.3.0.dev20251204
35+
source/install/uv_with_retry.sh pip install --system --find-links "https://www.paddlepaddle.org.cn/packages/nightly/cpu/paddlepaddle/" --index-url https://pypi.org/simple --trusted-host www.paddlepaddle.org.cn --trusted-host paddlepaddle.org.cn paddlepaddle==3.4.0.dev20260310
3636
env:
3737
# Please note that uv has some issues with finding
3838
# existing TensorFlow package. Currently, it uses

.pre-commit-config.yaml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ repos:
3030
exclude: ^source/3rdparty
3131
- repo: https://github.com/astral-sh/ruff-pre-commit
3232
# Ruff version.
33-
rev: v0.15.4
33+
rev: v0.15.6
3434
hooks:
3535
- id: ruff
3636
args: ["--fix"]
@@ -39,14 +39,6 @@ repos:
3939
- id: ruff-format
4040
exclude: ^source/3rdparty
4141
types_or: [python, pyi, jupyter]
42-
- repo: https://github.com/pycqa/flake8
43-
# flake8 cannot autofix
44-
rev: "7.3.0"
45-
hooks:
46-
- id: flake8
47-
additional_dependencies:
48-
- torchfix==0.7.0
49-
- flake8-pyproject==1.2.3
5042
# numpydoc
5143
- repo: https://github.com/Carreau/velin
5244
rev: 0.0.12
@@ -70,7 +62,7 @@ repos:
7062
- mdformat-gfm-alerts==2.0.0
7163
# C++
7264
- repo: https://github.com/pre-commit/mirrors-clang-format
73-
rev: v22.1.0
65+
rev: v22.1.1
7466
hooks:
7567
- id: clang-format
7668
exclude: ^(source/3rdparty|source/lib/src/gpu/cudart/.+\.inc|.+\.ipynb$|source/tests/infer/.+\.json$)

deepmd/backend/pretrained.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# SPDX-License-Identifier: LGPL-3.0-or-later
2+
from collections.abc import (
3+
Callable,
4+
)
5+
from typing import (
6+
TYPE_CHECKING,
7+
ClassVar,
8+
)
9+
10+
from deepmd.backend.backend import (
11+
Backend,
12+
)
13+
from deepmd.pretrained.registry import (
14+
available_model_names,
15+
)
16+
17+
if TYPE_CHECKING:
18+
from argparse import (
19+
Namespace,
20+
)
21+
22+
from deepmd.infer.deep_eval import (
23+
DeepEvalBackend,
24+
)
25+
from deepmd.utils.neighbor_stat import (
26+
NeighborStat,
27+
)
28+
29+
30+
@Backend.register("pretrained")
31+
class PretrainedBackend(Backend):
32+
"""Internal virtual backend for pretrained model-name alias dispatch.
33+
34+
This backend is not intended to be selected explicitly by users as a real
35+
compute backend (such as TensorFlow/PyTorch/Paddle/JAX). It only bridges
36+
built-in pretrained model names into the regular deep-eval loading path.
37+
38+
For convenience, all built-in pretrained model names are registered as
39+
suffix-like aliases, so users can pass model names directly, e.g.
40+
``DeepPot("DPA-3.2-5M")``.
41+
"""
42+
43+
name = "Pretrained"
44+
features: ClassVar[Backend.Feature] = Backend.Feature.DEEP_EVAL
45+
suffixes: ClassVar[list[str]] = [
46+
*[model_name.lower() for model_name in available_model_names()],
47+
]
48+
49+
def is_available(self) -> bool:
50+
return True
51+
52+
@property
53+
def entry_point_hook(self) -> Callable[["Namespace"], None]:
54+
raise NotImplementedError("Unsupported backend: pretrained")
55+
56+
@property
57+
def deep_eval(self) -> type["DeepEvalBackend"]:
58+
from deepmd.pretrained.deep_eval import (
59+
PretrainedDeepEvalBackend,
60+
)
61+
62+
return PretrainedDeepEvalBackend
63+
64+
@property
65+
def neighbor_stat(self) -> type["NeighborStat"]:
66+
raise NotImplementedError("Unsupported backend: pretrained")
67+
68+
@property
69+
def serialize_hook(self) -> Callable[[str], dict]:
70+
raise NotImplementedError("Unsupported backend: pretrained")
71+
72+
@property
73+
def deserialize_hook(self) -> Callable[[str, dict], None]:
74+
raise NotImplementedError("Unsupported backend: pretrained")

deepmd/dpmodel/atomic_model/dp_atomic_model.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ def __init__(
7474
if hasattr(self.fitting_net, "reinit_exclude"):
7575
self.fitting_net.reinit_exclude(self.atom_exclude_types)
7676
self.type_map = type_map
77+
self.add_chg_spin_ebd: bool = getattr(
78+
self.descriptor, "add_chg_spin_ebd", False
79+
)
7780
super().init_out_stat()
7881

7982
def fitting_output_def(self) -> FittingOutputDef:
@@ -180,11 +183,38 @@ def forward_atomic(
180183
"""
181184
nframes, nloc, nnei = nlist.shape
182185
atype = xp_take_first_n(extended_atype, 1, nloc)
186+
187+
# Handle default fparam if fitting net supports it
188+
if (
189+
hasattr(self.fitting_net, "get_dim_fparam")
190+
and self.fitting_net.get_dim_fparam() > 0
191+
and fparam is None
192+
):
193+
# use default fparam
194+
from deepmd.dpmodel.array_api import (
195+
array_api_compat,
196+
)
197+
198+
default_fparam = self.fitting_net.get_default_fparam()
199+
assert default_fparam is not None
200+
xp = array_api_compat.array_namespace(extended_coord)
201+
default_fparam_array = xp.asarray(
202+
default_fparam,
203+
dtype=extended_coord.dtype,
204+
device=array_api_compat.device(extended_coord),
205+
)
206+
fparam_input_for_des = xp.tile(
207+
xp.reshape(default_fparam_array, (1, -1)), (nframes, 1)
208+
)
209+
else:
210+
fparam_input_for_des = fparam
211+
183212
descriptor, rot_mat, g2, h2, sw = self.descriptor(
184213
extended_coord,
185214
extended_atype,
186215
nlist,
187216
mapping=mapping,
217+
fparam=fparam_input_for_des if self.add_chg_spin_ebd else None,
188218
)
189219
ret = self.fitting_net(
190220
descriptor,

deepmd/dpmodel/descriptor/dpa1.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ def call(
493493
atype_ext: Array,
494494
nlist: Array,
495495
mapping: Array | None = None,
496+
fparam: Array | None = None,
496497
) -> Array:
497498
"""Compute the descriptor.
498499

deepmd/dpmodel/descriptor/dpa2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ def call(
828828
atype_ext: Array,
829829
nlist: Array,
830830
mapping: Array | None = None,
831+
fparam: Array | None = None,
831832
) -> tuple[Array, Array, Array, Array, Array]:
832833
"""Compute the descriptor.
833834

deepmd/dpmodel/descriptor/dpa3.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
)
2121
from deepmd.dpmodel.utils.network import (
2222
NativeLayer,
23+
get_activation_fn,
2324
)
2425
from deepmd.dpmodel.utils.seed import (
2526
child_seed,
@@ -356,6 +357,7 @@ def __init__(
356357
use_tebd_bias: bool = False,
357358
use_loc_mapping: bool = True,
358359
type_map: list[str] | None = None,
360+
add_chg_spin_ebd: bool = False,
359361
) -> None:
360362
super().__init__()
361363

@@ -410,6 +412,7 @@ def init_subclass_params(sub_data: dict | Any, sub_class: type) -> Any:
410412
)
411413

412414
self.use_econf_tebd = use_econf_tebd
415+
self.add_chg_spin_ebd = add_chg_spin_ebd
413416
self.use_tebd_bias = use_tebd_bias
414417
self.use_loc_mapping = use_loc_mapping
415418
self.type_map = type_map
@@ -428,6 +431,38 @@ def init_subclass_params(sub_data: dict | Any, sub_class: type) -> Any:
428431
)
429432
self.concat_output_tebd = concat_output_tebd
430433
self.precision = precision
434+
435+
if self.add_chg_spin_ebd:
436+
self.cs_activation_fn = get_activation_fn(activation_function)
437+
# -100 ~ 100 is a conservative bound
438+
self.chg_embedding = TypeEmbedNet(
439+
ntypes=200,
440+
neuron=[self.tebd_dim],
441+
padding=True,
442+
activation_function="Linear",
443+
precision=precision,
444+
seed=child_seed(seed, 3),
445+
)
446+
# 100 is a conservative upper bound
447+
self.spin_embedding = TypeEmbedNet(
448+
ntypes=100,
449+
neuron=[self.tebd_dim],
450+
padding=True,
451+
activation_function="Linear",
452+
precision=precision,
453+
seed=child_seed(seed, 4),
454+
)
455+
self.mix_cs_mlp = NativeLayer(
456+
2 * self.tebd_dim,
457+
self.tebd_dim,
458+
precision=precision,
459+
seed=child_seed(seed, 5),
460+
)
461+
else:
462+
self.chg_embedding = None
463+
self.spin_embedding = None
464+
self.mix_cs_mlp = None
465+
431466
self.exclude_types = exclude_types
432467
self.env_protection = env_protection
433468
self.trainable = trainable
@@ -579,6 +614,7 @@ def call(
579614
atype_ext: Array,
580615
nlist: Array,
581616
mapping: Array | None = None,
617+
fparam: Array | None = None,
582618
) -> tuple[Array, Array, Array, Array, Array]:
583619
"""Compute the descriptor.
584620
@@ -625,6 +661,27 @@ def call(
625661
xp.take(type_embedding, xp.reshape(atype_ext, (-1,)), axis=0),
626662
(nframes, nall, self.tebd_dim),
627663
)
664+
665+
if self.add_chg_spin_ebd:
666+
assert fparam is not None
667+
assert self.chg_embedding is not None
668+
assert self.spin_embedding is not None
669+
chg_tebd = self.chg_embedding.call()
670+
spin_tebd = self.spin_embedding.call()
671+
charge = xp.astype(fparam[:, 0], xp.int64) + 100
672+
spin = xp.astype(fparam[:, 1], xp.int64)
673+
chg_ebd = xp.reshape(
674+
xp.take(chg_tebd, xp.reshape(charge, (-1,)), axis=0),
675+
(nframes, self.tebd_dim),
676+
)
677+
spin_ebd = xp.reshape(
678+
xp.take(spin_tebd, xp.reshape(spin, (-1,)), axis=0),
679+
(nframes, self.tebd_dim),
680+
)
681+
cs_cat = xp.concat([chg_ebd, spin_ebd], axis=-1)
682+
sys_cs_embd = self.cs_activation_fn(self.mix_cs_mlp.call(cs_cat))
683+
node_ebd_ext = node_ebd_ext + xp.expand_dims(sys_cs_embd, axis=1)
684+
628685
node_ebd_inp = node_ebd_ext[:, :nloc, :]
629686
# repflows
630687
node_ebd, edge_ebd, h2, rot_mat, sw = self.repflows(
@@ -655,9 +712,14 @@ def serialize(self) -> dict:
655712
"use_econf_tebd": self.use_econf_tebd,
656713
"use_tebd_bias": self.use_tebd_bias,
657714
"use_loc_mapping": self.use_loc_mapping,
715+
"add_chg_spin_ebd": self.add_chg_spin_ebd,
658716
"type_map": self.type_map,
659717
"type_embedding": self.type_embedding.serialize(),
660718
}
719+
if self.add_chg_spin_ebd:
720+
data["chg_embedding"] = self.chg_embedding.serialize()
721+
data["spin_embedding"] = self.spin_embedding.serialize()
722+
data["mix_cs_mlp"] = self.mix_cs_mlp.serialize()
661723
repflow_variable = {
662724
"edge_embd": repflows.edge_embd.serialize(),
663725
"angle_embd": repflows.angle_embd.serialize(),
@@ -684,10 +746,18 @@ def deserialize(cls, data: dict) -> "DescrptDPA3":
684746
data.pop("type")
685747
repflow_variable = data.pop("repflow_variable").copy()
686748
type_embedding = data.pop("type_embedding")
749+
chg_embedding = data.pop("chg_embedding", None)
750+
spin_embedding = data.pop("spin_embedding", None)
751+
mix_cs_mlp = data.pop("mix_cs_mlp", None)
687752
data["repflow"] = RepFlowArgs(**data.pop("repflow_args"))
688753
obj = cls(**data)
689754
obj.type_embedding = TypeEmbedNet.deserialize(type_embedding)
690755

756+
if obj.add_chg_spin_ebd and chg_embedding is not None:
757+
obj.chg_embedding = TypeEmbedNet.deserialize(chg_embedding)
758+
obj.spin_embedding = TypeEmbedNet.deserialize(spin_embedding)
759+
obj.mix_cs_mlp = NativeLayer.deserialize(mix_cs_mlp)
760+
691761
# deserialize repflow
692762
statistic_repflows = repflow_variable.pop("@variables")
693763
env_mat = repflow_variable.pop("env_mat")

deepmd/dpmodel/descriptor/hybrid.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def enable_compression(
245245
table_stride_2: float = 0.1,
246246
check_frequency: int = -1,
247247
) -> None:
248-
"""Receive the statisitcs (distance, max_nbor_size and env_mat_range) of the training data.
248+
"""Receive the statistics (distance, max_nbor_size and env_mat_range) of the training data.
249249
250250
Parameters
251251
----------
@@ -275,6 +275,7 @@ def call(
275275
atype_ext: Array,
276276
nlist: Array,
277277
mapping: Array | None = None,
278+
fparam: Array | None = None,
278279
) -> tuple[
279280
Array,
280281
Array | None,

0 commit comments

Comments
 (0)