Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
c8de6a6
feat(show): add serialization-tree via DeepEval.serialize
njzjz-bot Mar 16, 2026
b695aaa
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Mar 16, 2026
1694360
refactor(deepeval): implement backend serialize via model.serialize
njzjz-bot Mar 16, 2026
7675388
fix(show): align backend serialize output contracts
njzjz-bot Apr 7, 2026
a8a80f4
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 7, 2026
c18814c
refactor(show): decouple serialization tree from deep eval wrapper
njzjz-bot Apr 8, 2026
5678d78
refactor(deepeval): serialize model tree only
njzjz-bot Apr 8, 2026
8b48f46
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 8, 2026
5e97073
test(io): cover deep eval serialization in consistent io
njzjz-bot Apr 8, 2026
8bf3176
fix(review): handle paddle static serialize and io assert
njzjz-bot Apr 8, 2026
6cf9dbf
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 8, 2026
53f6f12
fix(ci): handle savedmodel and torchscript serialize
njzjz-bot Apr 8, 2026
a2431e8
fix(ci): guard pt serialize fallback shape
njzjz-bot Apr 8, 2026
39aab42
fix(test): pt_expt serialize fallback returns model tree with @class key
njzjz-bot Apr 8, 2026
67f4d1e
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 8, 2026
024a058
fix(ci): revert pt deep eval mixed pte serialization path
njzjz-bot Apr 8, 2026
b951333
fix(ci): restore backend-specific serialize fallbacks
njzjz-bot Apr 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions deepmd/entrypoints/show.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,14 @@ def show(
observed_types = model.get_observed_types()
log.info(f"Number of observed types: {observed_types['type_num']} ")
log.info(f"Observed types: {observed_types['observed_type']} ")

if "serialization-tree" in ATTRIBUTES:
from deepmd.dpmodel.utils.serialization import (
Node,
)

data = model.serialize()
if "model" not in data:
raise RuntimeError("Serialized model data does not contain key 'model'.")
root = Node.deserialize(data["model"])
log.info("Model serialization tree:\n" + str(root))
40 changes: 40 additions & 0 deletions deepmd/infer/deep_eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@
neighbor_list: Optional["ase.neighborlist.NewPrimitiveNeighborList"] = None,
**kwargs: Any,
) -> None:
self.model_file = model_file
self.deep_eval = DeepEvalBackend(
model_file,
self.output_def,
Expand All @@ -420,6 +421,45 @@
def output_def(self) -> ModelOutputDef:
"""Returns the output variable definitions."""

def serialize(self) -> dict[str, Any]:
"""Serialize the model file to a dictionary (backend-unified).

This is a convenience wrapper around backend-specific serialization
hooks, intended for unified model inspection / display.

Returns
-------
dict
Serialized model data (must include key ``"model"``).

Raises
------
NotImplementedError
If the detected backend does not support IO serialization.
"""
backend_cls = Backend.detect_backend_by_model(self.model_file)

# internal alias backend: resolve to a verified local file first
if getattr(backend_cls, "name", "").lower() == "pretrained":
from deepmd.pretrained.deep_eval import (
parse_pretrained_alias,
)
Comment thread Fixed
from deepmd.pretrained.download import (
resolve_model_path,
)

model_name = parse_pretrained_alias(self.model_file)
resolved = str(resolve_model_path(model_name))
backend_cls = Backend.detect_backend_by_model(resolved)
return backend_cls().serialize_hook(resolved)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

if not (backend_cls.features & Backend.Feature.IO):
raise NotImplementedError(
f"Backend '{backend_cls.name}' does not support serialization."
)

return backend_cls().serialize_hook(self.model_file)

def get_rcut(self) -> float:
"""Get the cutoff radius of this model."""
return self.deep_eval.get_rcut()
Expand Down
1 change: 1 addition & 0 deletions deepmd/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,7 @@ def main_parser() -> argparse.ArgumentParser:
"fitting-net",
"size",
"observed-type",
"serialization-tree",
],
nargs="+",
)
Expand Down
Loading