MLIP Backends¶
mlmm-toolkit は、あらゆる ML/MM ワークフローステージ(opt、scan、tsopt、freq、irc、path-search,…)を単一の MLMMCore ONIOM 結合オブジェクトを通じて実行します。MLMMCore は ML 領域を、private な _create_ml_backend ファクトリ経由でバックエンドごとのアダプタ(_UMABackend / _OrbBackend / _MACEBackend / _AIMNet2Backend)にディスパッチします。このページでは、バックエンドの選択方法、バックエンドごとの kwargs、新しいバックエンドの追加方法を説明します。
公開インターフェース¶
from mlmm.backends.mlmm_calc import MLMMCore, MLMMASECalculator, mlmm
# Primary entry: ML/MM ONIOM core. Takes parm7 + layered PDB + model-PDB and
# returns energy / forces / (partial) Hessian on the full system.
core = MLMMCore(
input_pdb="layered.pdb",
real_parm7="real.parm7",
model_pdb="model.pdb",
backend="uma", # one of: "uma", "orb", "mace", "aimnet2"
model_charge=0, model_mult=1,
uma_model="uma-s-1p2",
uma_precision="fp32", # or "fp64" (full-precision base inference)
)
# ASE adapter (DMF and other ASE-based stages)
ase_calc = MLMMASECalculator(core)
# pysisyphus Calculator adapter (opt / tsopt / freq / irc / path-search stages)
pysis_calc = mlmm(
input_pdb="layered.pdb",
real_parm7="real.parm7",
model_pdb="model.pdb",
backend="uma",
model_charge=0, model_mult=1,
)
内部的には、MLMMCore.__init__ が _create_ml_backend(backend, ...)(mlmm/backends/mlmm_calc.py 内の
private なファクトリ)を呼び出して適切なアダプタをインスタンス化します。このファクトリは未知のバックエンドに対して
ValueError を送出します。mlmm には 'auto' フォールバックはありません。ワークフローコードが CLI で解決されたバックエンド名を渡します。
ファイルマップ¶
file |
role |
|---|---|
|
|
|
|
バックエンド別の特性¶
backend |
install |
model identifier |
precision option |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
専用環境: |
|
|
|
|
|
n/a |
UMA fp64¶
OMol で訓練された UMA をデフォルトの fp32 から fp64 に切り替えると、TSopt + Hessian に 無視できない影響を与える場合があります。次のように有効化します:
mlmm tsopt -i ts.pdb --parm real.parm7 -q 0 -m 1 --precision fp64
mlmm freq -i opt.pdb --parm real.parm7 -q 0 -m 1 --precision fp64
mlmm irc -i ts.pdb --parm real.parm7 -q 0 -m 1 --precision fp64
統一された --precision フラグは、mlmm/backends/__init__.py の apply_precision_to_calc_cfg
によって各バックエンドのネイティブ kwarg(UMA は uma_precision、ORB は orb_precision、MACE は
mace_dtype)へルーティングされます。
--precision を指定しない場合、デフォルト値はバックエンドごとに決まります。
backend |
デフォルト |
理由 |
|---|---|---|
|
fp32 |
上流 fairchem のベースライン。 |
|
fp64 |
backend default。 |
|
fp64 |
MACE は上流で |
|
fp32 |
精度の切り替えを持たない。 |
対応する両精度について、対象 backend/model/system で energy、force、 frequency、runtime、memory を比較してください。精度の選択にかかわらず frequency と IRC による独立検証が必要です。
統一された --backend-model NAME フラグも同様に、選択中の --backend のモデル変種を
上書きし、apply_backend_model_to_calc_cfg によってバックエンドのモデル kwarg
(uma_model / orb_model / mace_model / aimnet2_model)へルーティングされます。
未指定ならバックエンドデフォルトのモデルを使用します。
または YAML 設定経由(バックエンドごとの kwarg 名):
calc:
uma_precision: fp64
InferenceSettings API のために fairchem-core ≥ 2.0 が必要です。
カスタムバックエンド — 独自の ASE Calculator を使う (--calc-file)¶
組み込みの MLIP バックエンドに加えて、ML 領域を実行時に --calc-file で指定した
任意の ASE Calculator で駆動できます(mlmm_toolkit
本体の変更は不要)。これにより ML/MM ONIOM の ML 側を GFN-xTB(tblite / xtb-python
経由)、DFTB+、ORCA、Psi4 など ASE 互換の任意エンジンと結合できます。境界は標準の
ASE Calculator インターフェース(エネルギー eV、力 eV/Å)で、既存の _ASEMLBackend
アダプタがラップします。
ASE Calculator を返す get_calculator ファクトリを持つ Python ファイルを用意します:
# my_calc.py(最小の例)
from ase.calculators.emt import EMT
def get_calculator(charge=0, spin=1, device="auto", **kwargs):
return EMT()
EMT() を使いたいエンジンに差し替えてください — 例えば GFN-xTB なら
tblite.ase.TBLite(...)、DFTB+ の ASE calculator、ase.calculators.orca.ORCA(...)
など。このファイルを各stageまたはallに渡すと、custom ML backendが選択され
--backendを上書きします:
mlmm sp -i complex.pdb --parm system.parm7 --calc-file my_calc.py -q 0 -m 1
mlmm opt -i complex.pdb --parm system.parm7 --calc-file my_calc.py
mlmm freq -i complex.pdb --parm system.parm7 --calc-file my_calc.py
mlmm all -i R.pdb P.pdb --parm system.parm7 --calc-file my_calc.py -q 0 -m 1
補足:
ファクトリには、シグネチャが受け取る場合(または
**kwargsを宣言している場合)にcharge・spin(多重度。mult/multiplicityでも渡されます)・deviceが 渡されるため、全電荷が必要なエンジン(xTB など)も設定できます。ファクトリ名を 変える場合は--calc-file-func-name NAME、モジュール直下の Calculator インスタンスも 受け付けます。カスタム calculator が駆動するのは ML 領域のみで、MM 側は通常どおり
hessian_ff/ OpenMM バックエンドを使い、ONIOM カップリングも変わりません。 Hessian は有限差分経路を使うため、freqやtsopt --opt-mode hessも任意エンジンで 動作します。凍結原子も通常どおり尊重されます。allおよび単独subcommand(sp・opt・tsopt・freq・irc・scan/scan2d/scan3d・path-opt・path-search)で利用できます。allは同じfactoryを calculatorを使う子stageへ転送します。独自の--backend名を持つ恒久的なbackendに する場合は、以下のレシピを参照してください。
バックエンド追加レシピ(5 ステップ)¶
--backend xyz として公開する新しいバックエンド XYZModel を追加するには:
バックエンドアダプタを作成 —
mlmm/backends/mlmm_calc.py(あるいは大きくなる場合はmlmm/backends/xyz.pyのような新規ファイル)に、_MLBackend(ABC)を継承する_XYZBackend(_MLBackend)を実装します。ASE 経路が必要な場合は並行して_XYZASEBackendも実装します。 factory は共通 adapter 引数model_charge、model_mult、ml_deviceと、uma_model/uma_precisionやmace_model/mace_dtypeのような model/backend 固有引数を渡します。Hessian assembly precision は backend adapter ではなくMLMMCoreが所有します。_MLBackendに準拠 — 抽象メソッドeval(atoms, need_grad=True) -> (E_eV, F_eV, opaque)(エネルギーは eV、力は eV/Å、加えてバックエンド固有の opaque オブジェクト)、hessian_analytical(opaque, n_atoms, *, dtype) -> torch.Tensor(Hessian を eV/Ų で返す)、およびsupports_analytical_hessianとdeviceプロパティを実装します。_MLBackendを継承すると、 汎用の有限差分hessian_fd(...)(バックエンドが解析的 Hessian を持たない場合に使用)を そのまま利用できます。_create_ml_backendに登録 —mlmm/backends/mlmm_calc.pyのファクトリを拡張して、backend == "xyz"を_XYZBackend(...)にディスパッチします。MLMMCoreが転送できるよう、新しいバックエンドの kwargs を_create_ml_backend(...)の シグネチャに追加します。統一された
--precisionフラグを配線(任意) — バックエンドが精度の設定項目を公開する場合は、mlmm/backends/__init__.pyの_PRECISION_DISPATCH内の"fp32"と"fp64"の両方に"xyz": (kw_name, kw_value)エントリを追加し、 ユーザー向けの--precision fp32|fp64CLI フラグが正しくルーティングされるようにします。ドキュメント化 + smoke — このページの file map / バックエンドごとのテーブルにエントリを追加し、 model identifier + インストールコマンドを記載し、新しいバックエンドが end-to-end で 動作確認されるよう
tests/smoke/run.shにxyz行を追加します。
VRAM 不変条件(ML/MM 固有)¶
ML/MM stage では、選択した ML backend と Hessian intermediate が GPU
memory を使用します。topology 処理と解析 MM force field は CPU 側で、
standalone DFT は別 stage です。mlmm/backends/mlmm_calc.py の方向ごとの
FD-Hessian loop は同時 displacement 評価数を制限します。この loop を変更する
場合は GPU smoke suite を再実行し、peak VRAM を確認してください。stage 間では
calculator を解放します。
ONIOM 結合と生の MLIP¶
mlmm/backends/mlmm_calc.py の MLIP アダプタは、ML 領域のみを評価します。
減算的 ONIOM エネルギー式(# CHEMISTRY-RULE:1)、リンク原子 Hessian の
B 行列射影(# CHEMISTRY-RULE:2)、3 層 5 パスの partial Hessian
組み立て(# CHEMISTRY-RULE:8)は、同じファイル内に存在します。新しい MLIP を追加する
バックエンドの作成者は ONIOM 結合を知る必要はありません。ML 領域のエネルギー / 力 / Hessian を
正しい単位で返す Calculator を公開するだけで十分です。
関連項目¶
Python API —
MLMMCore/MLMMASECalculator/mlmm(pysisyphus Calculator)の public surface。Architecture — 6 層ディレクトリマップ + 依存方向。
CONTRIBUTING — Recipe 3.2「Add an MLIP backend」(完全なゲートサイクル参照付き)。