再現性と決定論性¶
GPU 上での MLIP 推論は、デフォルトではビット単位で再現できません。並列リダクション(atomic add、scatter 操作)はハードウェアのスケジューリングに依存する順序で累積されるため、同一の入力による 2 回の実行は浮動小数点の ULP レベルで差異が生じます。mlmm では、このドリフトの実用上の大きさは座標で ~1e-7 Å、エネルギーで 1e-7 a.u. 未満であり、化学的に意味のある閾値をはるかに下回ります。結果は科学的には再現可能ですが、ビット単位では同一になりません。
ビット単位で同一の出力が必要な場合(例: ゴールデンファイル回帰テスト、監査のための厳密な再実行)は、--deterministic フラグを使用してください。
--deterministic¶
--deterministic はすべての計算系サブコマンド(opt、tsopt、freq、irc、scan、scan2d、scan3d、path-opt、path-search、all、sp)で受け付けられます。これは torch.use_deterministic_algorithms と index_reduce_ シムを有効化し、GPU 実行(ONIOM 計算における ML 領域の high-level 推論)をビット単位で再現可能にします。
mlmm opt -i complex.pdb --parm enzyme.parm7 -q 0 --deterministic
mlmm all -i r_complex.pdb p_complex.pdb -c PRE -q -1 --deterministic
これはプロセス全体に適用されます。
allに指定すると内部の全ステージへ伝播するため、ステージごとに指定する必要はありません。これはより低速です。決定論的な scatter/reduce カーネルは、デフォルトのものよりスループットが低くなります。厳密な再現性が必要な場合にのみ使用してください。
これは明示的にエラーを出します。現在の PyTorch ビルドが実行中の操作に対して決定論的カーネルを提供できない場合、コマンドは警告なく非再現的な出力を生成するのではなく、例外を送出します。
環境変数
MLMM_STRICT_DETERMINISTIC=1は、CI や直接の Python API に対する同等のエントリポイントです。
バックエンドごとの検証済み挙動¶
ML バックエンド |
|
|---|---|
|
エネルギー および 力がビット単位で同一 |
|
エネルギー および 力がビット単位で同一 |
|
エネルギー および 力がビット単位で同一 |
|
未対応 — 拒否されます(後述) |
MM の low-level 層(解析的な hessian_ff 力場)は CPU 上で決定論的です。--deterministic が対処する非決定論性は、GPU 上の ML 領域推論によるものです。
精度と再現性¶
--precision fp64 での実行はデフォルトのドリフトを低減しますが、GPU 実行をビット単位で同一にはしません。リダクション順序による非決定論性は精度に依存しないためです。ビット単位の厳密性が得られるのは --deterministic のみです。
--precision fp64 と(内部的に常時有効な)fp64 Hessian(H_double)は独立した設定項目です。--precision fp64 を渡すと、Hessianも追加で fp64 に強制され、オプティマイザの線形代数がモデルより低い精度で警告なく実行されることがないようにします。
GPU クラスごとにどちらの精度を選ぶか — HPC データセンター GPU(H100 / H200 / A100)では決定論的な計算向けの低ノイズな結果のため fp64、fp64 が著しく遅いコンシューマーカードではデフォルトの fp32 — については デバイス設定 & HPC セットアップ → GPU クラスごとの精度 を参照してください。
AIMNet2 の制限¶
AIMNet2 はこれらの機能には対応していません:
--precision fp64— AIMNet2 のモデル入力は上流で float32 にキャストされるため、「fp64」実行は実際には fp64 になりません。--deterministic— AIMNet2 はカスタム CUDA カーネルを通じて力を計算しますが、これはtorch.use_deterministic_algorithmsの制御外にあるため、その力はビット単位で再現できません(エネルギーは再現可能です)。PyTorch の決定論モードはこのカスタム演算を検出も制御もできないため、この制限は明示的に報告されます。
ビット単位で再現可能な実行には uma、orb、mace を使用してください。