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、新しいバックエンドの追加方法を説明します。
Public surface¶
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-1p1",
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 map¶
file |
role |
|---|---|
|
|
|
|
|
MM→ML 環境効果のための xTB 点電荷埋め込み補正( |
Per-backend characteristics¶
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)へルーティングされます。
統一された --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 が必要です。
Custom backend — bring your own 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(...)
など。このファイルを単一ステージのサブコマンドに渡すと、custom ML バックエンドが
選択され --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
補足:
ファクトリには、シグネチャが受け取る場合(または
**kwargsを宣言している場合)にcharge・spin(多重度。mult/multiplicityでも渡されます)・deviceが 渡されるため、全電荷が必要なエンジン(xTB など)も設定できます。ファクトリ名を 変える場合は--calc-factory NAME、モジュール直下の Calculator インスタンスも 受け付けます。カスタム calculator が駆動するのは ML 領域のみで、MM 側は通常どおり
hessian_ff/ OpenMM バックエンドを使い、ONIOM カップリングも変わりません。 Hessian は有限差分経路を使うため、freqやtsopt --opt-mode hessも任意エンジンで 動作します。凍結原子も通常どおり尊重されます。単一ステージのサブコマンド(
sp・opt・tsopt・freq・irc・scan/scan2d/scan3d・path-opt・path-search)で利用できます。独自の--backend名を持つ恒久的なバックエンドにする場合は、以下のレシピを参照してください。
Add-a-backend recipe (5 steps)¶
--backend xyz として公開する新しいバックエンド XYZModel を追加するには:
バックエンドアダプタを作成 —
mlmm/backends/mlmm_calc.py(あるいは大きくなる場合はmlmm/backends/xyz.pyのような新規ファイル)に、_MLBackend(ABC)を継承する_XYZBackend(_MLBackend)を実装します。ASE 経路が必要な場合は並行して_XYZASEBackendも実装します。 どちらも共通 kwargs(charge / spin / device / freeze_atoms / hessian_calc_mode / return_partial_hessian / hessian_double / print_timing / model)と、バックエンド固有の kwargs(precision、default_dtypeなど)を受け取る必要があります。_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 invariant (ML/MM-specific)¶
ML/MM ONIOM ジョブでは、ML バックエンドが PySCF(DFT 補正)、
parmed(parm7)、MM 力場配列と同一デバイス上に共存します。mlmm/backends/mlmm_calc.py 内の
方向ごとの FD-Hessian ループは、この合計メモリ使用量に収まるよう設計されています。GPU smoke ゲート全体
(tests/smoke/run.sh)の再実行とピーク VRAM の監視を行わない限り、方向ごとのループを
バッチ化テンソルにリファクタリングしないでください。さもないと全タンパク質 ML/MM の all ジョブが OOM します。ステージランナーは
ステージ間で del calc を行い、all ワークフローはステージ境界で gc.collect() を実行します。
これは public contract の一部であり、ワークフローのリファクタリング時に
削除してはなりません。
ONIOM coupling vs raw 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 を公開するだけで十分です。
See Also¶
Python API —
MLMMCore/MLMMASECalculator/mlmm(pysisyphus Calculator)の public surface。Architecture — 6 層ディレクトリマップ + 依存方向。
CONTRIBUTING — Recipe 3.2「Add an MLIP backend」(完全なゲートサイクル参照付き)。