国内で有名なNNPといえば有料のMatlantisがありますが、実はそれを超えるベンチマークスコアを示す無料のNNPモデルが存在しています。私自身が試したところ、密度汎関数理論(DFT)の計算結果と非常に良好な一致を示しました。そこで本記事では、その使用方法を共有します。
Matbench Discoveryベンチマークセットとは?
ベンチマーク計算とは、異なる手法やモデルの性能を客観的に比較・評価するため、共通の問題セットを用いて行う計算のことです。比較対象のモデルがそれぞれ異なる問題を解いてしまうと、公平な評価はできません。そのため、全てのモデルが同じ問題を解き、その性能を客観的に比較可能とするベンチマークセットが重要になります。
例えば、画像認識分野では以下のようなセットが有名です。
- MNIST: 手書き数字の分類問題
- CIFAR-10 / CIFAR-100:飛行機や犬など多種の画像分類問題
NNPモデルの性能評価にも、Matbench Discoveryというベンチマークセットが開発されています。
このベンチマークセットはMaterials Projectのデータを使用しています。Materials Projectに登録されている結晶構造の計算データを訓練セット、元素を一部置換した結晶構造の計算データをテストセットとして使用しています。計算はPBE汎関数を用いたDFT計算です。
ベンチマークでは、多くの評価指標を提供していますが、モデルの精度を評価するうえで最も重要なものは以下の3つです。
- F1: 系が凸包の頂点(熱力学的安定)か否かを分類する際のF1スコア (高いほど良い)
- RMSD: 凸包エネルギーの二乗平均平方根誤差 (低いほど良い)
- $\kappa_\mathrm{SRME}$: フォノンモードの熱伝導への寄与に対する相対誤差平均 (低いほど良い)
ベンチマークスコアの比較
MatlantisのNNPモデルの中でベンチマークスコアが公表されている最新のものであるPFP v5.0.0と、Matlantisのベンチマークで掲載されている比較対象のNNPモデルの中で最良のスコアを示しているMACEモデルと、Meta社のAI開発グループFAIRで開発された2025年3月21日時点のMatbench DiscoveryのSOTAモデルであるeSEN-30M-OAMと、同グループが当該モデルの一つ前に発表したeqV2-m-omat-salex-mpのベンチマークスコアを以下の表で比較します。
モデル名 | F1 | RMSD | κ(SRME) |
---|---|---|---|
PFP v5.0.0 | 0.76 | 0.07 | -- |
MACE | 0.674 | 0.10 | -- |
eSEN-30M-OAM | 0.925 | 0.0096 | 0.170 |
eqV2-m-omat-salex-mp | 0.917 | 0.0138 | 1.771 |
物質のエネルギー的安定性に関する指標であるF1とRMSEについて、FAIRグループの開発したNNPモデルは他の2つよりも有意に優れていることがわかります。また、FAIRグループのモデルを比較すると、SOTAであるeSEN-30M-OAMは以前のeqV2-m-omat-salex-mpと較べて全ての指標で改善しており、とりわけ熱伝導率評価の改善が顕著であることがわかります。
ただし、Matlantisのベンチマークセットでは、AcからPuの元素を含む化合物が除外されており、かつ、参照したDFT計算条件が異なることから補正が適用されている点に注意が必要です。また、Matlantisの最新のNNPモデルはPFP v7.0.0であり、これはベンチマークスコアが公開されているPFP v5.0.0のおよそ半年後の2024年9月17日に公開されたものです。
タダで使えるNNPモデルの導入と使い方
現在のMatbench Discoveryで最高性能を示しているNNPモデル(eSEN-30M-OAM)は2025年3月22日の時点でまだ公開されていないため、当該モデルを開発したMeta社のFAIRが開発した一つ前のモデルであるeqV2-m-omat-salex-mpの導入と使い方について説明します。
Pythonライブラリのインストール
FAIRの開発したNNPモデルはAtomic Simulation Envirionment (ASE)のエネルギー・力場算定エンジンとして使用することができます。ASEはPythonからDFTやMD計算を実行するためのライブラリの中で人気があり、それゆえに機能が充実しており、必要な情報を探しやすい特徴があります。ASEからFAIRのNNPモデルを読み込むのにFAIR-Chemライブラリを使用します。計算に必要なライブラリはpipを使用してインストールできます。
pip install fairchem-core torch_geometric torch_scatter torch_sparse
NNPモデルのダウンロード
eqV2-m-omat-salex-mpはAI関連のモデルやデータセットを集積したWEBプラットフォームであるHugging Faceからダウンロードすることができます。まずはこちらからアカウント登録し、ログイン後、こちらにアクセスし、表中のリンクeqV2_86M_omat_mp_salex.ptをクリックすると、NNPモデルのデータファイルeqV2_86M_omat_mp_salex.ptのダウンロードがはじまります。
デモ1: グラファイトとダイアモンドの相対エネルギー
NNPを使用し、グラファイトとダイアモンドのエネルギー差を計算します。PBE汎関数を使用したDFT計算によるエネルギー差はE(Diamond) - E(Graphite) = 0.1176 eV/atom
でした。ここで、DFT計算にはGPAWを使用しており、k-meshは8x8x8、ecutは500 eVであり、それぞれエネルギー差が1 meV/atom以内で収束していることを確認しました。この収束確認と計算スクリプトについては補遺1を参照してください。
グラファイトとダイアモンドのエネルギー差をNNPモデルで計算するPythonスクリプトは以下の通りです。OCPCalculatorでダウンロードしたeqV2_86M_omat_mp_salex.ptを読み込んでいますが、当該ファイルはPythonを実行するディレクトリに置かれている必要があります。別の場所に置く場合にはcheckpoint_path
を絶対パスで指定してください。PyTorchがGPUを利用できるように設定されていれば、cpu=False
とすることでGPUを使用することができます。エネルギーの計算ではget_potential_energy()
をセル中の原子数len(graphite/diamond)
で除算することによりeV/atomに変換しています。
#!/usr/bin/env python3
from ase.build import bulk
from ase.lattice.hexagonal import Graphite
from fairchem.core import OCPCalculator
# eqV2_86M_omat_mp_salex
calc = OCPCalculator(checkpoint_path="eqV2_86M_omat_mp_salex.pt", cpu=True)
# グラファイトのエネルギーを計算
graphite = Graphite(symbol="C", latticeconstant={"a": 2.461, "c": 6.708})
graphite.set_calculator(calc)
graphite_energy = graphite.get_potential_energy() / len(graphite)
print("energy:", graphite_energy, "eV/atom")
# ダイヤモンドのエネルギーを計算
diamond = bulk("C", "diamond", a=3.567)
diamond.set_calculator(calc)
diamond_energy = diamond.get_potential_energy() / len(diamond)
print("energy:", diamond_energy, "eV/atom")
# エネルギー差を計算
print("E(Diamond) - E(Graphite):", diamond_energy - graphite_energy, "eV/atom")
当該スクリプトを実行すると、NNPモデルによるエネルギー差の評価がE(Diamond) - E(Graphite): 0.1298 eV/atom
と得られます。DFTから得られた値は0.1176 eV/atomでしたが、NNPモデルはDFTの評価を10 meV/atom強の誤差という高い精度で再現しています。
デモ2: 混晶(置換型固溶体)配置の相対エネルギー
実験では、各サイトの占有率が明らかであっても、実際の原子配置を特定することが難しいという問題にしばしば直面します。このような問題に対して、NNPを用いた計算的アプローチは非常に有効です。なぜなら、数千にも及ぶ膨大な数の配置に対するエネルギー計算が必要になることがあるからです。このような問題へのNNPの適用例については、次の記事(準備中)で具体的に説明します。
補遺1: DFT計算のスクリプトとパラメータ決定のための収束確認
DFTの計算スクリプトは以下の通りです。実行にはGPAWライブラリのインストールが必要ですが、環境によってインストール方法が異なること、本記事はNNPに焦点を置いたものであるため、こちらについては割愛します。
#!/usr/bin/env python3
from ase.build import bulk
from ase.lattice.hexagonal import Graphite
from gpaw import GPAW
from gpaw.wavefunctions.pw import PW
# PBE-DFT
calc = GPAW(xc="PBE", kpts=(8, 8, 8), mode=PW(700))
# グラファイトのエネルギーを計算
graphite = Graphite(symbol="C", latticeconstant={"a": 2.461, "c": 6.708})
graphite.set_calculator(calc)
graphite_energy = graphite.get_potential_energy() / len(graphite)
print("energy:", graphite_energy, "eV/atom")
# ダイヤモンドのエネルギーを計算
diamond = bulk("C", "diamond", a=3.567)
diamond.set_calculator(calc)
diamond_energy = diamond.get_potential_energy() / len(diamond)
print("energy:", diamond_energy, "eV/atom")
# エネルギー差を計算
print("E(Diamond) - E(Graphite):", diamond_energy - graphite_energy, "eV/atom")
エネルギーカットオフに対するエネルギー差の収束確認は以下の通りです。ecut = 500 eVでエネルギー差がおよそ1 meV/atom以内で収束していることが見てとられます。
ecut=340, kmesh=8x8x8
E(Diamond) - E(Graphite): 0.13548491784611372 eV/atom
ecut=500, kmesh=8x8x8
E(Diamond) - E(Graphite): 0.11716107988064195 eV/atom
ecut=700, kmesh=8x8x8
E(Diamond) - E(Graphite): 0.11762882645190587 eV/atom
kメッシュに対するエネルギー差の収束確認は以下の通りです。kmesh = 8x8x8でエネルギー差がおよそ1 meV/atom以内で収束していることが見てとられます。
ecut=500, kmesh=6x6x6
E(Diamond) - E(Graphite): 0.12143113004151118 eV/atom
ecut=500, kmesh=8x8x8
E(Diamond) - E(Graphite): 0.11716107988064195 eV/atom
ecut=500, kmesh=10x10x10
E(Diamond) - E(Graphite): 0.11701497650712867 eV/atom
参考文献
- Matlantis: https://matlantis.com/
- Matbench Discovery: https://matbench-discovery.materialsproject.org/
- Materials Project: https://next-gen.materialsproject.org/
- PFP v5.0.0モデルとベンチマーク: https://matlantis.com/news/pfp-validation-for-public-v5-0-0
- Meta-FAIR: https://ai.meta.com/research/
- eSEN-30M-OAMモデル: https://matbench-discovery.materialsproject.org/models/eSEN-30m-oam
- eqV2-m-omat-salex-mpモデル: https://matbench-discovery.materialsproject.org/models/eqV2-m-omat-salex-mp
- PFP v7.0.0モデル: https://matlantis.com/news/pfp-v7-release
- FAIR-Chem: https://github.com/FAIR-Chem/fairchem
- Hugging Face: https://huggingface.co/