Skip to content

Commit 62cd093

Browse files
njzjznjzjz-bot
andauthored
docs(backend): document backend support and workflows (deepmodeling#5929)
## Summary - document TensorFlow 2 and PyTorch-Exportable backend selection, training, freezing, compression, formats, and inference routing; - fold the JAX training and Hessian-freeze documentation from deepmodeling#5930 into this PR; - update model and descriptor backend icons after checking the current TF2, PyTorch-Exportable, and JAX registrations; - distinguish JAX non-energy fitting/model availability from its current energy-only training loss support; - document the DP and JAX compression routes requested by deepmodeling#5923. Closes deepmodeling#5919. Closes deepmodeling#5920. Closes deepmodeling#5923. Supersedes deepmodeling#5930. ## Validation - `ruff format .` - `ruff check .` - `uvx pre-commit run mdformat --files ...` for all changed Markdown files - `dp --dp compress --help` - `dp --jax compress --help` - `git diff --check` Coding agent: Codex Codex version: codex-cli 0.144.6 Model: gpt-5.6-sol Reasoning effort: xhigh <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Expanded backend guidance for training, freezing, compression, conversion, and inference, including TensorFlow 2, PyTorch-Exportable, JAX, Paddle, and DP. * Added backend selection commands, workflow examples, multi-task checkpoint selection, and Hessian-enabled JAX freezing. * Documented backend-specific file formats, export artifacts, ABI selection, optional TensorFlow 2 JIT compilation, and feature limitations. * Updated model pages with corrected backend support, spin and graph-native inference guidance, and standardized command syntax. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Jinzhe Zeng <jinzhe.zeng@ustc.edu.cn> Co-authored-by: njzjz-bot <njzjz.bot@gmail.com> Co-authored-by: njzjz-bot <njzjz-bot@users.noreply.github.com>
1 parent adbd6bc commit 62cd093

33 files changed

Lines changed: 534 additions & 127 deletions

doc/backend.md

Lines changed: 89 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22

33
## Supported backends
44

5-
DeePMD-kit supports multiple backends: TensorFlow and PyTorch.
5+
DeePMD-kit supports seven backends: TensorFlow, TensorFlow 2,
6+
PyTorch-TorchScript, PyTorch-Exportable, JAX, Paddle, and the NumPy-based DP
7+
reference backend.
68
To use DeePMD-kit, you must install at least one backend.
79
Each backend does not support all features.
8-
In the documentation, TensorFlow {{ tensorflow_icon }}, PyTorch {{ pytorch_icon }}, and Paddle {{ paddle_icon }} icons are used to mark whether a backend supports a feature.
10+
In the documentation, TensorFlow and TensorFlow 2 share
11+
{{ tensorflow_icon }}, while PyTorch-TorchScript and PyTorch-Exportable share
12+
{{ pytorch_icon }}. JAX {{ jax_icon }}, Paddle {{ paddle_icon }}, and DP
13+
{{ dpmodel_icon }} use separate icons. Support notes spell out the exact backend
14+
variant when the two implementations in a framework family differ.
915

1016
### TensorFlow {{ tensorflow_icon }}
1117

@@ -15,25 +21,91 @@ In the documentation, TensorFlow {{ tensorflow_icon }}, PyTorch {{ pytorch_icon
1521
[TensorFlow](https://tensorflow.org) 2.8 is the first version to support Python 3.10.
1622
DeePMD-kit does not use the TensorFlow v2 API but uses the TensorFlow v1 API (`tf.compat.v1`) in the graph mode.
1723

18-
### PyTorch {{ pytorch_icon }}
24+
### TensorFlow 2 {{ tensorflow_icon }}
25+
26+
- Model filename extension: `.savedmodeltf`
27+
- Checkpoint directory extension: `.tf2`
28+
29+
The TensorFlow 2 backend uses the TensorFlow v2 eager API. Select it with
30+
`dp --tf2` (alias `dp --tensorflow2`). It supports training, including
31+
multi-task training and fine-tuning. Freezing, compression, and testing use a
32+
`.savedmodeltf` export and therefore require graph-traceable model code.
33+
Training stores checkpoints in a directory named after the `save_ckpt` prefix
34+
with `.tf2` appended, such as `model.ckpt.tf2`.
35+
36+
For training, set
37+
{ref}`training.enable_compile <training/enable_compile>` to `true` to enable
38+
XLA compilation of the formatted lower-forward path. Setting
39+
[`DP_JIT`](env.md#envvar-DP_JIT) enables the same model-level default and also
40+
applies it to SavedModel export. Depending on the workload, compilation may
41+
improve or reduce performance.
42+
43+
### PyTorch-TorchScript {{ pytorch_icon }}
1944

2045
- Model filename extension: `.pth`
2146
- Checkpoint filename extension: `.pt`
2247

23-
[PyTorch](https://pytorch.org/) 2.1 or above is required.
24-
While `.pth` and `.pt` are the same in the PyTorch package, they have different meanings in the DeePMD-kit to distinguish the model and the checkpoint.
48+
[PyTorch](https://pytorch.org/) 2.1 or above is required. Select this backend
49+
with `dp --pt`. It uses TorchScript for most frozen models; DPA4/SeZM uses a
50+
separate AOTInductor export path. Because PyTorch has deprecated TorchScript,
51+
DeePMD-kit will deprecate this backend and replace it with PyTorch-Exportable.
52+
53+
While `.pth` and `.pt` are the same in the PyTorch package, they have different
54+
meanings in DeePMD-kit: `.pth` stores a frozen model, while `.pt` stores a
55+
training checkpoint.
56+
57+
### PyTorch-Exportable {{ pytorch_icon }}
58+
59+
- Model filename extensions: `.pte`, `.pt2`
60+
- Checkpoint filename extension: `.pt`
61+
62+
Select this backend with `dp --pt-expt` (alias
63+
`dp --pytorch-exportable`). It uses PyTorch with the backend-independent model
64+
implementation and supports training, including multi-task training and
65+
fine-tuning, freezing, change-bias, and testing. Compression support and export
66+
requirements are documented on the corresponding descriptor pages. Training
67+
can read LMDB datasets, and Python inference can use the optional vesin
68+
neighbor-list implementation.
69+
70+
Freezing exports a `torch.export` model. The dense neighbor-list lower form
71+
normally uses `.pte`, while the graph lower form uses an AOTInductor `.pt2`
72+
package. Use `--lower-kind graph` to request graph-native export for an eligible
73+
model; graph-capable DPA models may select that form automatically. The `.pt`
74+
checkpoint format uses DP-model parameter names ending in `.w` and `.b`, which
75+
allows DeePMD-kit to distinguish it from a PyTorch-TorchScript checkpoint,
76+
whose parameter names end in `.matrix` and `.bias`.
77+
78+
The `.pt2` suffix identifies an AOTInductor package, but not its lower-input
79+
ABI. A DPA4/SeZM model frozen with `dp --pt freeze` normally uses the legacy
80+
`edge_vec` ABI (`lower_input_kind: edge_vec`); its deepspin virtual-atom variant
81+
uses the dense `nlist` ABI instead. A graph model frozen with
82+
`dp --pt-expt freeze --lower-kind graph` uses the NeighborGraph ABI
83+
(`lower_input_kind: graph`). The `dp --pt-expt compress` workflow can instead
84+
export a compressed DPA-1 model through the compact canonical
85+
`dpa1_canonical` ABI (`lower_input_kind: dpa1_canonical`) when the canonical
86+
compression is eligible. All variants are loaded for inference by the
87+
PyTorch-Exportable runtime, which reads this metadata to select the correct
88+
input path. The `--lower-kind` option controls only the PyTorch-Exportable
89+
freeze route; see the [DPA4 export documentation](model/dpa4.md#freeze-to-pt2)
90+
for the separate DPA4/SeZM AOTInductor export route.
2591

2692
### JAX {{ jax_icon }}
2793

28-
- Model filename extension: `.xlo`, `.savedmodel`
29-
- Checkpoint filename extension: `.jax`
94+
- DeepEval model filename extensions: `.hlo`, `.savedmodel`
95+
- Checkpoint and lossless serialization extension: `.jax`
3096

3197
[JAX](https://jax.readthedocs.io/) 0.4.33 or above is required.
32-
Both `.xlo` and `.jax` are customized format extensions defined in DeePMD-kit, since JAX has no convention for file extensions.
98+
Both `.hlo` and `.jax` are customized format extensions defined in DeePMD-kit, since JAX has no convention for file extensions.
3399
`.savedmodel` is the TensorFlow [SavedModel format](https://www.tensorflow.org/guide/saved_model) generated by [JAX2TF](https://www.tensorflow.org/guide/jax2tf), which needs the installation of TensorFlow.
34100
Only the `.savedmodel` format supports C++ inference, which needs the TensorFlow C++ interface.
35101
The model is device-specific, so that the model generated on the GPU device cannot be run on the CPUs.
36102

103+
JAX supports training with `dp --jax train`; training checkpoints use the
104+
`.jax` extension. Freezing can write a DeepEval-compatible `.hlo` or
105+
`.savedmodel` model, or a lossless `.jax` serialization for checkpoint
106+
round-tripping and JAX-MD. The normal `dp test`/`DeepPot` route does not load
107+
`.jax` serializations.
108+
37109
### Paddle {{ paddle_icon }}
38110

39111
- Model filename extensions: `.json` and `.pdiparams`
@@ -64,12 +136,20 @@ NumPy 1.21 or above is required.
64136

65137
### Training
66138

67-
When training and freezing a model, you can use `dp --tf`, `dp --pt` or `dp --pd` in the command line to switch the backend.
139+
When training and freezing a model, use `dp --tf`, `dp --tf2`, `dp --pt`,
140+
`dp --pt-expt`, `dp --jax`, or `dp --pd` in the command line to switch the
141+
backend.
68142

69143
### Inference
70144

71145
When doing inference, DeePMD-kit detects the backend from the model filename.
72146
For example, when the model filename ends with `.pb` (the ProtoBuf file), DeePMD-kit will consider it using the TensorFlow backend.
147+
The same detection covers TensorFlow 2 `.savedmodeltf` models and
148+
PyTorch-Exportable `.pte` and `.pt2` runtime formats. In particular, `.pt2`
149+
selects the PyTorch-Exportable inference loader even when the file was produced
150+
by the DPA4/SeZM `dp --pt freeze` route described above; the archive metadata
151+
then selects its `edge_vec`, dense `nlist`, NeighborGraph, or compact
152+
`dpa1_canonical` ABI.
73153

74154
## Convert model files between backends
75155

doc/development/create-a-model-pt.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Create a model in other backends {{ pytorch_icon }} {{ dpmodel_icon }}
22

33
> [!NOTE]
4-
> **Supported backends**: PyTorch {{ pytorch_icon }}, DP {{ dpmodel_icon }}
4+
> **Supported backends**: PyTorch-TorchScript {{ pytorch_icon }}, DP {{ dpmodel_icon }}
55
>
6-
> In the following context, we use the PyTorch backend as the example, while it also applies to other backends listed above.
6+
> In the following context, we use the PyTorch-TorchScript backend as the example, while it also applies to other backends listed above.
77
88
If you'd like to create a new model that isn't covered by the existing DeePMD-kit library, but reuse DeePMD-kit's other efficient modules such as data processing, trainer, etc, you may want to read this section.
99

@@ -16,9 +16,9 @@ To incorporate your custom model you'll need to:
1616

1717
## Design a new component
1818

19-
With DeePMD-kit v3, we have expanded support to include two additional backends alongside TensorFlow: the PyTorch backend and the framework-independent backend (dpmodel). The PyTorch backend adopts a highly modularized design to provide flexibility and extensibility. It ensures a consistent experience for both training and inference, aligning with the TensorFlow backend.
19+
With DeePMD-kit v3, we have expanded support to include two additional backends alongside TensorFlow: the PyTorch-TorchScript backend and the framework-independent backend (dpmodel). The PyTorch-TorchScript backend adopts a highly modularized design to provide flexibility and extensibility. It ensures a consistent experience for both training and inference, aligning with the TensorFlow backend.
2020

21-
The framework-independent backend is implemented in pure NumPy, serving as a reference backend to ensure consistency in tests. Its design pattern closely parallels that of the PyTorch backend.
21+
The framework-independent backend is implemented in pure NumPy, serving as a reference backend to ensure consistency in tests. Its design pattern closely parallels that of the PyTorch-TorchScript backend.
2222

2323
### New descriptors
2424

@@ -118,7 +118,7 @@ class SomeFittingNet(GeneralFitting):
118118

119119
### New models
120120

121-
The PyTorch backend's model architecture is meticulously structured with multiple layers of abstraction, ensuring a high degree of flexibility. Typically, the process commences with an atomic model responsible for atom-wise property calculations. This atomic model inherits from both the {py:class}`deepmd.pt.model.atomic_model.base_atomic_model.BaseAtomicModel` class and the {py:class}`torch.nn.Module` class.
121+
The PyTorch-TorchScript backend's model architecture is meticulously structured with multiple layers of abstraction, ensuring a high degree of flexibility. Typically, the process commences with an atomic model responsible for atom-wise property calculations. This atomic model inherits from both the {py:class}`deepmd.pt.model.atomic_model.base_atomic_model.BaseAtomicModel` class and the {py:class}`torch.nn.Module` class.
122122

123123
Subsequently, the `AtomicModel` is encapsulated using the `make_model(AtomicModel)` function, which leverages the `deepmd.pt.model.model.make_model.make_model` function. The purpose of the `make_model` wrapper is to facilitate the translation between atomic property predictions and the extended property predictions and differentiation , e.g. the reduction of atomic energy contribution and the autodiff for calculating the forces and virial. The developers usually need to implement an `AtomicModel` not a `Model`.
124124

@@ -217,6 +217,6 @@ When implementing an existing model in a new backend, directly apply the existin
217217

218218
### Consistent tests
219219

220-
When transferring features from another backend to the PyTorch backend, it is essential to include a regression test in `/source/tests/consistent` to validate the consistency of the PyTorch backend with other backends. Presently, the regression tests cover self-consistency and cross-backend consistency between TensorFlow, PyTorch, and DP (NumPy) through the serialization/deserialization technique.
220+
When transferring features from another backend to the PyTorch-TorchScript backend, it is essential to include a regression test in `/source/tests/consistent` to validate the consistency of the PyTorch-TorchScript backend with other backends. Presently, the regression tests cover self-consistency and cross-backend consistency between TensorFlow, PyTorch-TorchScript, and DP (NumPy) through the serialization/deserialization technique.
221221

222-
During the development of new components within the PyTorch backend, it is necessary to provide a DP (NumPy) implementation and incorporate corresponding regression tests. For PyTorch components, developers are also required to include a unit test using `torch.jit`.
222+
During the development of new components within the PyTorch-TorchScript backend, it is necessary to provide a DP (NumPy) implementation and incorporate corresponding regression tests. For PyTorch components, developers are also required to include a unit test using `torch.jit`.

doc/freeze/compress.md

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
# Compress a model {{ tensorflow_icon }} {{ pytorch_icon }}
1+
# Compress a model {{ tensorflow_icon }} {{ pytorch_icon }} {{ jax_icon }} {{ dpmodel_icon }}
22

33
> [!NOTE]
4-
> **Supported backends**: TensorFlow {{ tensorflow_icon }}, PyTorch {{ pytorch_icon }}
4+
> **Backends covered below**: TensorFlow and TensorFlow 2
5+
> {{ tensorflow_icon }}, PyTorch-TorchScript and PyTorch-Exportable
6+
> {{ pytorch_icon }}, JAX {{ jax_icon }}, and DP {{ dpmodel_icon }}.
57
68
## Theory
79

@@ -70,19 +72,68 @@ dp compress -i graph.pb -o graph-compress.pb
7072
```
7173
:::
7274

73-
:::{tab-item} PyTorch {{ pytorch_icon }}
75+
:::{tab-item} TensorFlow 2 {{ tensorflow_icon }}
76+
77+
```bash
78+
dp --tf2 compress -i model.ckpt.tf2 -o model-compress.savedmodeltf
79+
```
80+
81+
TensorFlow 2 compression reads a `.tf2` training checkpoint directory or a
82+
checkpoint prefix and writes a compressed `.savedmodeltf` model. See the
83+
descriptor documentation for model-specific SavedModel export requirements.
84+
:::
85+
86+
:::{tab-item} PyTorch-TorchScript {{ pytorch_icon }}
7487

7588
```bash
7689
dp --pt compress -i model.pth -o model-compress.pth
7790
```
7891
:::
7992

93+
:::{tab-item} PyTorch-Exportable {{ pytorch_icon }}
94+
95+
```bash
96+
dp --pt-expt compress -i dpa1-graph.pt2 -o dpa1-graph-compress.pt2
97+
```
98+
99+
This command produces an executable compressed artifact only for descriptors
100+
that support the PyTorch-Exportable compression path. See the
101+
[DPA-1 model-compression requirements](../model/train-se-atten.md#model-compression)
102+
for the graph-lowered `.pt2` route used in this example.
103+
:::
104+
105+
:::{tab-item} JAX {{ jax_icon }}
106+
107+
```bash
108+
dp --jax compress -i frozen_model.jax -o compressed_model.jax
109+
```
110+
111+
JAX compression accepts `.jax` and `.hlo` inputs. Use `.jax` for the general,
112+
lossless compressed serialization path. Descriptor pages document whether a
113+
compressed model can also be exported to StableHLO `.hlo`.
114+
:::
115+
116+
:::{tab-item} DP {{ dpmodel_icon }}
117+
118+
```bash
119+
dp --dp compress -i model.dp -o model-compress.dp
120+
```
121+
122+
DP compression accepts native `.dp`, `.yaml`, and `.yml` models.
123+
:::
124+
80125
::::
81126

82-
where `-i` gives the original frozen model, `-o` gives the compressed model. Several other command line options can be passed to `dp compress`, which can be checked with
127+
where `-i` gives the original frozen model, `-o` gives the compressed model.
128+
The compression entrypoints resolve the minimum neighbor distance and tabulate
129+
supported descriptor embedding networks. If the model does not contain a
130+
minimum neighbor distance, pass the training script with `-t` or
131+
`--training-script` so it can be computed from the training data.
132+
133+
Several other command line options can be passed to `dp compress`, which can be checked with
83134

84135
```bash
85-
$ dp compress --help
136+
dp compress --help
86137
```
87138

88139
An explanation will be provided
@@ -122,7 +173,7 @@ See the documentation of a specific descriptor to see whether it supports model
122173

123174
## Requirements of installation {{ pytorch_icon }}
124175

125-
When compressing models in the PyTorch backend, the customized OP library for the Python interface must be installed when [freezing the model](../freeze/freeze.md).
176+
When compressing models in the PyTorch-TorchScript backend, the customized OP library for the Python interface must be installed when [freezing the model](../freeze/freeze.md).
126177

127178
The customized OP library for the Python interface is installed by default when building DeePMD-kit from source; see the [installation guide](../install/install-from-source.md) for details.
128179

doc/freeze/freeze.md

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,32 @@ To freeze a model, typically one does
88
:::{tab-item} TensorFlow {{ tensorflow_icon }}
99

1010
```bash
11-
$ dp freeze -o model.pb
11+
dp freeze -o model.pb
1212
```
1313

1414
in the folder where the model is trained. The output model is called `model.pb`.
1515
The idea and part of our code are from [Morgan](https://blog.metaflow.fr/tensorflow-how-to-freeze-a-model-and-serve-it-with-a-python-api-d4f3596b3adc).
1616
:::
1717

18-
:::{tab-item} PyTorch {{ pytorch_icon }}
18+
:::{tab-item} TensorFlow 2 {{ tensorflow_icon }}
1919

2020
```bash
21-
$ dp --pt freeze -o model.pth
21+
dp --tf2 freeze -c model.ckpt -o model.savedmodeltf
22+
```
23+
24+
When `-c` names a checkpoint prefix, the backend also checks the corresponding
25+
path with `.tf2` appended, so the example reads `model.ckpt.tf2` and writes the
26+
TensorFlow SavedModel to `model.savedmodeltf`. If `-c` is omitted, it defaults
27+
to the current directory. For a multi-task checkpoint, select a branch with
28+
`--head CHOSEN_BRANCH`. SavedModel export requires graph-traceable model code;
29+
descriptor-specific export requirements are documented on the corresponding
30+
model pages.
31+
:::
32+
33+
:::{tab-item} PyTorch-TorchScript {{ pytorch_icon }}
34+
35+
```bash
36+
dp --pt freeze -o model.pth
2237
```
2338

2439
in the folder where the model is trained. The output model is called `model.pth`.
@@ -27,16 +42,30 @@ In [multi-task mode](../train/multi-task-training), you need to choose one avail
2742
to specify which model branch you want to freeze:
2843

2944
```bash
30-
$ dp --pt freeze -o model_branch1.pth --head CHOSEN_BRANCH
45+
dp --pt freeze -o model_branch1.pth --head CHOSEN_BRANCH
3146
```
3247

3348
The output model is called `model_branch1.pth`, which is the specifically frozen model with the `CHOSEN_BRANCH` head.
3449
:::
3550

51+
:::{tab-item} PyTorch-Exportable {{ pytorch_icon }}
52+
53+
```bash
54+
dp --pt-expt freeze -c model.ckpt.pt -o model
55+
```
56+
57+
The backend writes `.pte` for the dense neighbor-list lower form and `.pt2` for
58+
the graph lower form. A suffixless output lets DeePMD-kit select the matching
59+
extension. `--lower-kind graph` requires a graph-eligible model. Conversely, a
60+
graph-capable DPA model may override a requested `nlist` lower with the graph
61+
form and emit a warning. In multi-task mode, select a model branch with
62+
`--head CHOSEN_BRANCH`.
63+
:::
64+
3665
:::{tab-item} Paddle {{ paddle_icon }}
3766

3867
```bash
39-
$ dp --pd freeze -o model
68+
dp --pd freeze -o model
4069
```
4170

4271
in the folder where the model is trained. The output model is called `model.json` and `model.pdiparams`.
@@ -45,10 +74,36 @@ In [multi-task mode](../train/multi-task-training.md), you need to choose one av
4574
to specify which model branch you want to freeze:
4675

4776
```bash
48-
$ dp --pd freeze -o model_branch1 --head CHOSEN_BRANCH
77+
dp --pd freeze -o model_branch1 --head CHOSEN_BRANCH
4978
```
5079

5180
The output model is called `model_branch1.json`, which is the specifically frozen model with the `CHOSEN_BRANCH` head.
5281
:::
5382

83+
:::{tab-item} JAX {{ jax_icon }}
84+
85+
```bash
86+
dp --jax freeze -c model.ckpt.jax -o model.hlo
87+
```
88+
89+
The JAX backend can write a StableHLO `.hlo` model, a lossless `.jax`
90+
serialization, or a JAX2TF `.savedmodel` model. The `.hlo` and `.savedmodel`
91+
formats work with the normal `dp test`/`DeepPot` route; `.jax` is intended for
92+
checkpoint round-tripping and JAX-MD and is not a DeepEval model format. The
93+
`.savedmodel` format requires TensorFlow and is the JAX format that supports the
94+
C++ inference interface.
95+
:::
96+
5497
::::
98+
99+
## Freeze a JAX model with Hessian output {{ jax_icon }}
100+
101+
Use `--hessian` to add coordinate-Hessian output to a frozen JAX energy model:
102+
103+
```bash
104+
dp --jax freeze -c model.ckpt.jax -o model-hessian.hlo --hessian
105+
```
106+
107+
The option applies to JAX `.hlo`, `.jax`, and `.savedmodel` outputs. A model
108+
whose serialized definition already enables Hessian mode retains that mode even
109+
when `--hessian` is omitted.

doc/inference/python.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ where `descriptors` is the descriptor matrix of the system. This can also be don
3535

3636
> [!NOTE]
3737
> `eval_descriptor` is the descriptor-only interface supported across backends. In
38-
> the PyTorch backend, [`eval_embedding`](embedding.md) additionally returns the
38+
> the PyTorch-TorchScript backend, [`eval_embedding`](embedding.md) additionally returns the
3939
> descriptor, per-atom feature, and per-structure feature in a single forward pass.
4040
> PyTorch descriptor/embedding APIs accept `dtype="fp32"`, `"fp64"`, or `"native"`;
4141
> `eval_descriptor` defaults to `native`, while `eval_embedding` defaults to

0 commit comments

Comments
 (0)