再現性と決定性

GPU 上の MLIP 推論はデフォルトではビット単位で再現可能ではありません。並列リダクション(アトミック加算、scatter 演算)はハードウェアのスケジューリングに依存した順序で累積されるため、同一入力による 2 回の実行でも浮動小数点の ULP レベルで差異が生じます。pdb2reaction の場合、このドリフトの実際の大きさは座標で ~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_ の shim を有効化し、GPU 実行がビット単位で再現可能になるようにします。

pdb2reaction opt -i input.pdb -q 0 --deterministic
pdb2reaction all -i r.pdb p.pdb -q -1 --tsopt True --deterministic
  • これはプロセス全体に作用しますall で設定すると内部のすべてのステージに伝播するため、ステージごとに渡す必要はありません。

  • これはより低速です。決定的な scatter/reduce カーネルはデフォルトのものよりスループットが低くなります。厳密な再現性が必要な場合にのみ使用してください。

  • これは明示的に失敗します。現在の PyTorch ビルドが実行中の演算に対して決定的なカーネルを提供できない場合、再現不可能な出力を警告なく生成するのではなく、コマンドが例外を送出します。

  • 環境変数 PDB2REACTION_STRICT_DETERMINISTIC=1 は、CI や直接の Python API(create_calculator)に対する同等のエントリポイントです。

バックエンド別の検証済み挙動

バックエンド

--deterministic

uma

エネルギーおよび原子間力がビット単位で同一

orb

エネルギーおよび原子間力がビット単位で同一

mace

エネルギーおよび原子間力がビット単位で同一

aimnet2

非対応 — 拒否されます(下記参照)

精度と再現性

--precision fp64 での実行はデフォルトのドリフトを低減します(フルの all パイプラインで差異が生じる軌跡ファイルの数をおおむね半減させます)が、GPU 実行をビット単位で同一にすることはありません。リダクション順序に起因する非決定性は精度とは独立しているためです。ビット単位の厳密性が得られるのは --deterministic のみです。

--precision fp64 と(内部的で常時有効な)fp64 Hessian は独立した設定項目です。--precision fp64 を渡すと、追加で Hessian も fp64 に強制されるため、optimizer の線形代数がモデルより低い精度で警告なく実行されることはありません。

GPU クラスによる精度の選択

--precision は MLIP 推論の浮動小数点精度(fp32 | fp64、大文字小文字を区別しない。デフォルトは fp32 でスクリーニング速度の基準)を選択します。バックエンド非依存であり、CLI は値を各バックエンド固有のキー(UMA precision、ORB precision、MACE default_dtype)に振り分けます。aimnet2 では fp32 は no-op で、fp64 はモデル入力が上流で float32 にキャストされるため拒否されます。どちらの値を選ぶかは GPU クラスによって決まります。

GPU クラス

推奨

理由

HPC データセンター(H100 / H200 / A100)

--precision fp64

実用的な品質で数値ノイズの少ない TS 最適化と Hessian が得られ、これらのカードでは fp64 のスループットコストが小さい。

コンシューマー(RTX 50xx / 40xx)

--precision fp32(デフォルト)

ここでは fp64 が大幅に遅く、実用性と速度を考慮して fp32 がデフォルト。fp32 は fp64 より数値精度は落ちるが、コンシューマー GPU(RTX 5090 など)でのスクリーニング用途には実用十分で、--deterministic を併用すれば再現性も確保できる。なお、厳密性が必要な場合や不安定な PES では fp64 で改善する可能性がある。

OMol で学習された UMA バックエンドでは fp64 が TS 最適化と Hessian に無視できない影響を与えるため、スクリーニングだけでなく最終結果・本番計算の数値には fp64 を使用してください。ビット単位で同一の再実行が必要な場合は --deterministic と併用します。

AIMNet2 はこれらの機能には対応していません:

  • --precision fp64 — AIMNet2 のモデル入力は上流で float32 にキャストされるため、「fp64」実行は実際には fp64 になりません。

  • --deterministic — AIMNet2 はカスタム CUDA カーネルを通じて原子間力を計算しますが、これは torch.use_deterministic_algorithms の制御外にあるため、原子間力はビット単位で再現可能ではありません(エネルギーは再現可能です)。PyTorch の決定的モードはこのカスタム演算を検出も制御もしないため、この制限は明示的に報告されます。

ビット単位で再現可能な実行には umaorb、または mace を使用してください。