Skip to content

fix(pd): sync Paddle backend with PT — full charge_spin end-to-end support#8

Open
HydrogenSulfate with Copilot wants to merge 7 commits into
masterfrom
copilot/add-default-chg-spin-parameter
Open

fix(pd): sync Paddle backend with PT — full charge_spin end-to-end support#8
HydrogenSulfate with Copilot wants to merge 7 commits into
masterfrom
copilot/add-default-chg-spin-parameter

Conversation

Copilot AI commented May 27, 2026

Copy link
Copy Markdown

Summary

PR deepmodeling#5431 decoupled charge_spin from fparam in the dpmodel DPA3 descriptor, adding default_chg_spin and related methods. However, the Paddle backend was not updated in sync, causing:

TypeError: DescrptDPA3.__init__() got an unexpected keyword argument 'default_chg_spin'

This PR syncs all affected Paddle backend descriptors and the training pipeline with the PT/dpmodel interface, enabling end-to-end charge_spin support from charge_spin.npy data loading through to model forward.

Changes

dpa3.py (full charge_spin support)

  • __init__: Added default_chg_spin: list[float] | None = None parameter with validation (must have exactly 2 values) and self.default_chg_spin storage.
  • New methods: Added get_dim_chg_spin(), has_default_chg_spin(), and get_default_chg_spin() to match the dpmodel interface. get_default_chg_spin() returns a paddle.Tensor (matching PT backend).
  • serialize: Added "default_chg_spin": self.default_chg_spin to the serialized dict.
  • forward: Renamed fparam parameter to charge_spin and updated all internal references accordingly.

dpa1.py, dpa2.py, se_a.py, se_t_tebd.py (interface alignment)

  • Added stub methods get_dim_chg_spin() (returns 0), has_default_chg_spin() (returns False), and get_default_chg_spin() (returns None) to DescrptDPA1, DescrptDPA2, DescrptSeA, and DescrptSeTTebd, matching the PT backend interface.
  • Added charge_spin: paddle.Tensor | None = None parameter to the forward method of these descriptors for API consistency with the PT backend.

dp_atomic_model.py (separate charge_spin parameter)

  • Added charge_spin as an independent parameter to forward_atomic (no longer derived from fparam), matching the PT backend design where charge_spin and fparam are separate params.
  • Added default fallback logic: when add_chg_spin_ebd is True and charge_spin is None, falls back to descriptor.get_default_chg_spin().
  • Added helper methods: has_chg_spin_ebd(), get_dim_chg_spin(), has_default_chg_spin(), get_default_chg_spin().

base_atomic_model.py (charge_spin propagation + interface methods)

  • Added charge_spin parameter to forward_common_atomic() and forward(), propagated down to forward_atomic.
  • Added base class methods: has_chg_spin_ebd() (returns False), get_dim_chg_spin() (returns 0), has_default_chg_spin() (returns False), get_default_chg_spin() (returns None), matching the PT base class.

make_model.py (charge_spin propagation + interface methods)

  • Added charge_spin parameter to forward_common(), forward_common_lower(), and the default forward() method.
  • Added proxy methods: has_chg_spin_ebd(), get_dim_chg_spin(), has_default_chg_spin(), get_default_chg_spin() delegating to atomic_model.

ener_model.py (charge_spin propagation)

  • Added charge_spin parameter to forward() and forward_lower().

training.py (training data pipeline)

  • Added "charge_spin" to input_keys so it is treated as model input (not label).
  • Added skip logic for find_charge_spin == 0.0 (matching PT behavior when charge_spin data is not found).
  • Added charge_spin DataRequirementItem in get_additional_data_requirement() with ndof=2, atomic=False, and default fallback support via has_default_chg_spin().

wrapper.py (training wrapper)

  • Added charge_spin: paddle.Tensor | None = None parameter to forward() and included it in input_dict passed to the model.

Unit tests

  • source/tests/pd/model/test_dpa3.py: Updated descriptor calls to use charge_spin= instead of fparam=, and enabled add_chg_spin_ebd=True test cases for the PD backend.
  • source/tests/consistent/descriptor/common.py: Updated eval_pd_descriptor to convert and forward charge_spin to the PD descriptor. Removed unused fparam_pd variable (CodeQL fix).
  • source/tests/consistent/descriptor/test_dpa3.py: Removed the skip_pd override that was bypassing all add_chg_spin_ebd=True test cases for the PD backend.
  • source/tests/consistent/model/test_ener.py: Added PD model to TestEnerChgSpinEbdFparam end-to-end forward consistency test, validating dp vs pd output for all three charge_spin modes.

… charge_spin

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>
@HydrogenSulfate

Copy link
Copy Markdown
Owner

@copilot 你帮我看看dpa2、se_e2_a等pd后端的模型是否也需要进行类似的修改以对齐pt后端?

…t_tebd descriptors

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>

Copilot AI commented May 27, 2026

Copy link
Copy Markdown
Author

@copilot 你帮我看看dpa2、se_e2_a等pd后端的模型是否也需要进行类似的修改以对齐pt后端?

是的,PT 后端已经在这些描述符上添加了相应的接口,PD 后端需要同步。已在 commit fix(pd): add charge_spin stub methods and param to dpa1/dpa2/se_a/se_t_tebd descriptors 中完成以下同步:

DescrptDPA1DescrptDPA2DescrptSeADescrptSeTTebd 四个类:

  1. 添加了 get_dim_chg_spin() -> int(返回 0)、has_default_chg_spin() -> bool(返回 False)、get_default_chg_spin() -> None 三个 stub 方法,与 PT 后端一致;
  2. forward 方法签名中新增了 charge_spin: paddle.Tensor | None = None 参数。

这些描述符本身不支持 charge_spin(故返回 0/False/None),但需要对齐接口以保证跨后端的一致性。

Copilot AI changed the title fix(pd): sync Paddle DPA3 descriptor with dpmodel — add default_chg_spin param fix(pd): sync Paddle descriptors with PT/dpmodel — add charge_spin interface May 27, 2026
@HydrogenSulfate

HydrogenSulfate commented May 27, 2026

Copy link
Copy Markdown
Owner

@copilot 我运行了下会报错:[2026-05-27 11:59:37,583] DEEPMD INFO --------------------------------------------------------------------------------------
[2026-05-27 11:59:37,587] DEEPMD INFO Start to train 1000000 steps.
Traceback (most recent call last):
File "/work/anaconda3/envs/ppsci_py310/bin/dp", line 6, in
sys.exit(main())
File "/work/deepmd-kit/deepmd/main.py", line 1061, in main
deepmd_main(args)
File "/work/deepmd-kit/deepmd/pd/entrypoints/main.py", line 592, in main
train(
File "/work/deepmd-kit/deepmd/pd/entrypoints/main.py", line 356, in train
trainer.run()
File "/work/deepmd-kit/deepmd/pd/train/training.py", line 1037, in run
step(step_id)
File "/work/deepmd-kit/deepmd/pd/train/training.py", line 822, in step
model_pred, loss, more_loss = self.wrapper(
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/train/wrapper.py", line 177, in forward
model_pred, loss, more_loss = self.loss[task_key](
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/loss/ener.py", line 220, in forward
model_pred = model(**input_dict)
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/model/model/ener_model.py", line 77, in forward
model_ret = self.forward_common(
File "/work/deepmd-kit/deepmd/pd/model/model/make_model.py", line 184, in forward_common
model_predict_lower = self.forward_common_lower(
File "/work/deepmd-kit/deepmd/pd/model/model/make_model.py", line 306, in forward_common_lower
atomic_ret = self.atomic_model.forward_common_atomic(
File "/work/deepmd-kit/deepmd/pd/model/atomic_model/base_atomic_model.py", line 275, in forward_common_atomic
ret_dict = self.forward_atomic(
File "/work/deepmd-kit/deepmd/pd/model/atomic_model/dp_atomic_model.py", line 329, in forward_atomic
descriptor, rot_mat, g2, h2, sw = self.descriptor(
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
TypeError: DescrptDPA3.forward() got an unexpected keyword argument 'fparam'

1 similar comment
@HydrogenSulfate

Copy link
Copy Markdown
Owner

@copilot 我运行了下会报错:[2026-05-27 11:59:37,583] DEEPMD INFO --------------------------------------------------------------------------------------
[2026-05-27 11:59:37,587] DEEPMD INFO Start to train 1000000 steps.
Traceback (most recent call last):
File "/work/anaconda3/envs/ppsci_py310/bin/dp", line 6, in
sys.exit(main())
File "/work/deepmd-kit/deepmd/main.py", line 1061, in main
deepmd_main(args)
File "/work/deepmd-kit/deepmd/pd/entrypoints/main.py", line 592, in main
train(
File "/work/deepmd-kit/deepmd/pd/entrypoints/main.py", line 356, in train
trainer.run()
File "/work/deepmd-kit/deepmd/pd/train/training.py", line 1037, in run
step(step_id)
File "/work/deepmd-kit/deepmd/pd/train/training.py", line 822, in step
model_pred, loss, more_loss = self.wrapper(
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/train/wrapper.py", line 177, in forward
model_pred, loss, more_loss = self.loss[task_key](
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/loss/ener.py", line 220, in forward
model_pred = model(**input_dict)
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
File "/work/deepmd-kit/deepmd/pd/model/model/ener_model.py", line 77, in forward
model_ret = self.forward_common(
File "/work/deepmd-kit/deepmd/pd/model/model/make_model.py", line 184, in forward_common
model_predict_lower = self.forward_common_lower(
File "/work/deepmd-kit/deepmd/pd/model/model/make_model.py", line 306, in forward_common_lower
atomic_ret = self.atomic_model.forward_common_atomic(
File "/work/deepmd-kit/deepmd/pd/model/atomic_model/base_atomic_model.py", line 275, in forward_common_atomic
ret_dict = self.forward_atomic(
File "/work/deepmd-kit/deepmd/pd/model/atomic_model/dp_atomic_model.py", line 329, in forward_atomic
descriptor, rot_mat, g2, h2, sw = self.descriptor(
File "/work/anaconda3/envs/ppsci_py310/lib/python3.10/site-packages/paddle/nn/layer/layers.py", line 1950, in call
return self.forward(*inputs, **kwargs)
TypeError: DescrptDPA3.forward() got an unexpected keyword argument 'fparam'

…e_spin keyword

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>

Copilot AI commented May 27, 2026

Copy link
Copy Markdown
Author

@copilot 我运行了下会报错:[2026-05-27 11:59:37,583] DEEPMD INFO --------------------------------------------------------------------------------------
[2026-05-27 11:59:37,587] DEEPMD I...

The training error was caused by a keyword argument mismatch I introduced: I renamed the fparam parameter to charge_spin in the PD DPA3 descriptor's forward method, but forgot to update the caller in dp_atomic_model.py which still passed it as fparam=. This would cause TypeError: forward() got an unexpected keyword argument 'fparam' during the forward pass.

Fixed in commit fix(pd): update dp_atomic_model to call descriptor forward with charge_spin keyword — changed the descriptor call in dp_atomic_model.py from fparam=fparam if self.add_chg_spin_ebd else None to charge_spin=fparam if self.add_chg_spin_ebd else None.

@HydrogenSulfate HydrogenSulfate marked this pull request as ready for review May 27, 2026 09:19
@HydrogenSulfate

Copy link
Copy Markdown
Owner

@copilot 顺便把单元测试也同步修改一下

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>

Copilot AI commented Jun 1, 2026

Copy link
Copy Markdown
Author

@copilot 顺便把单元测试也同步修改一下

Done in commit test(pd): sync unit tests with charge_spin interface changes:

  • source/tests/pd/model/test_dpa3.py: renamed fparamcharge_spin variables, changed descriptor calls to charge_spin=charge_spin (and dpmodel call() to charge_spin=charge_spin_np), and enabled add_chg_spin_ebd=True test cases.
  • source/tests/consistent/descriptor/common.py: updated eval_pd_descriptor to convert and pass charge_spin to the PD descriptor.
  • source/tests/consistent/descriptor/test_dpa3.py: removed the skip_pd override that was skipping all add_chg_spin_ebd=True cases.

@HydrogenSulfate

Copy link
Copy Markdown
Owner

@copilot 按照 deepmodeling#5469 (review) 的建议,修改代码以与 pt 后端的代码对齐

…r PT backend

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>

Copilot AI commented Jun 10, 2026

Copy link
Copy Markdown
Author

@copilot 按照 deepmodeling#5469 (review) 的建议,修改代码以与 pt 后端的代码对齐

Done in commit fix(pd): separate charge_spin from fparam as independent parameter per PT backend.

Changes to align with PT backend (per iProzd's review):

  1. dp_atomic_model.py: Added charge_spin as a separate parameter to forward_atomic (no longer derived from fparam). Added default fallback logic when charge_spin is None but add_chg_spin_ebd is True. Added helper methods: has_chg_spin_ebd(), get_dim_chg_spin(), has_default_chg_spin(), get_default_chg_spin().

  2. base_atomic_model.py: Added charge_spin parameter to forward_common_atomic() and forward(), propagated to forward_atomic.

  3. make_model.py: Added charge_spin parameter to forward_common(), forward_common_lower(), and forward().

  4. ener_model.py: Added charge_spin parameter to forward() and forward_lower().

  5. dpa3.py: Updated get_default_chg_spin() to return paddle.Tensor | None (matching PT).

  6. common.py (test): Removed unused fparam_pd variable (CodeQL fix).

@HydrogenSulfate

Copy link
Copy Markdown
Owner

@copilot 按照 deepmodeling#5469 (review) 的建议,修改代码以与 pt 后端的代码对齐

…hods

Co-authored-by: HydrogenSulfate <23737287+HydrogenSulfate@users.noreply.github.com>

Copilot AI commented Jun 16, 2026

Copy link
Copy Markdown
Author

@copilot 按照 deepmodeling#5469 (review) 的建议,修改代码以与 pt 后端的代码对齐

Done in commit fix(pd): add charge_spin to training pipeline and model interface methods. Changes per iProzd's review:

  1. base_atomic_model.py: Added has_chg_spin_ebd(), get_dim_chg_spin(), has_default_chg_spin(), get_default_chg_spin() methods (matching PT base class).

  2. make_model.py: Added has_chg_spin_ebd(), get_dim_chg_spin(), has_default_chg_spin(), get_default_chg_spin() proxy methods delegating to atomic_model.

  3. training.py:

    • Added "charge_spin" to input_keys so it's treated as model input (not label).
    • Added skip logic for find_charge_spin == 0.0 (matching PT).
    • Added charge_spin DataRequirementItem in get_additional_data_requirement() with ndof=2, atomic=False, default fallback support.
  4. wrapper.py: Added charge_spin parameter to forward() and included it in input_dict.

  5. test_ener.py: Added PD model to TestEnerChgSpinEbdFparam end-to-end consistency test.

This completes the end-to-end charge_spin pipeline from charge_spin.npy data loading → training → model forward for the PD backend.

Copilot AI changed the title fix(pd): sync Paddle descriptors with PT/dpmodel — add charge_spin interface fix(pd): sync Paddle backend with PT — full charge_spin end-to-end support Jun 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants