機械学習ポテンシャル MACE と FBTK による、次世代の計算化学ワークフロー
近年の計算化学において、機械学習ポテンシャル(MLIP、NNP)の台頭は目覚ましく、MACE のような汎用的なモデルの登場により、量子化学計算(DFT)に近い精度で大規模な分子動力学(MD)シミュレーションを行うことが可能になりました。しかし、計算自体が高速化しても、「初期構造の構築」という泥臭い前処理が依然としてボトルネックとなっています。
「FBTK で作り、MACE で解く」というワークフロー
FBTK (Forblaze ToolKit) は、この前処理段階を Rust による高速演算で劇的に短縮します。本記事では、FBTK で「重なりのない、幾何学的に無理のない構造」を爆速で作り、それを MACE による高精度な計算へと繋げる、効率的なワークフローを紹介します。
わずか2行で終わる環境構築
このワークフローの導入は非常にシンプルです。標準的な Python 環境であれば、以下の2行のコマンドだけで準備が完了します。
pip install mace-torch ase
pip install fbtk
特筆すべきは、FBTK が外部ライブラリへの依存関係を一切持たない(皆無である)点です。RadonPy や MACE、PyTorch などが動いている既存の複雑な計算環境に導入しても、依存関係の競合を引き起こして環境を壊す心配がありません。既存の資産を活かしたまま、確実に「単品」で機能を拡張できます。
1. 溶液系の構築:ASE の手動配置 vs FBTK の自動パッキング
例えば、8分子のベンゼン溶液(96原子)を作成する場合、従来の ASE のみを使用する方法では、以下のようにグリッドを手動で計算して配置するコードが必要です。
# ASEのみの例(泥臭い配置計算が必要)
L = 15.0
atoms = Atoms(cell=[L, L, L], pbc=True)
nx, ny, nz = 2, 2, 2
dx, dy, dz = L/nx, L/ny, L/nz
# ここからトリッキーな3重ループと回転・移動の処理が続く...
対して FBTK を使用すれば、目標の密度を指定するだけでパッキングが完了します。
import fbtk
# 1. SMILESから分子を定義
mol = fbtk.Molecule.from_smiles("c1ccccc1", name="Benzene")
# 2. 密度 0.8 g/cm3 で8分子をパッキング
builder = fbtk.Builder(density=0.8)
builder.add_molecule(mol, count=8)
system = builder.build()
# 3. FBTK内蔵のUFF力場で爆速緩和
system.relax()
# 4. ASE形式に変換して MACE へ
atoms = system.to_ase()
FBTK の内蔵緩和(system.relax())は Rust で実装されており、この規模の系であれば 1秒以下で完了します。
2. 複雑な高分子の制御:アタクチック・ポリスチレン
高分子のシミュレーションでは、側鎖の向き(タクティシティ)の制御が重要です。FBTK は、SMILES 記法からポリマーを合成する機能を備えています。
# ポリスチレンのモノマー定義とアタクチック鎖の生成
monomer = fbtk.Molecule.from_smiles("*CC(*)(c1ccccc1)", name="Styrene")
chain = fbtk.Molecule.from_polymer(monomer, degree=20, tacticity="atactic")
# 1.05 g/cm3 の密度でパッキング
builder = fbtk.Builder(density=1.05)
builder.add_molecule(chain, count=3)
system = builder.build()
このように、RDKit などの重い外部ツールに頼らずとも、SMILES 一本で複雑な高分子システムを構築できます。
3. MACE による高精度 MD の実行
FBTK で準備した「重なりのない配置」を ASE Atoms オブジェクトとして受け取り、MACE-OFF23 モデルでシミュレーションを実行します。
from mace.calculators import mace_off
from ase.optimize import BFGS
from ase.md.langevin import Langevin
# MACE計算機をセットアップ
calc = mace_off(model="small", device="cuda")
atoms.calc = calc
# 3. 構造最適化 (MACE) - MD開始前の安定化
print("Relaxing with MACE...")
opt = BFGS(atoms)
opt.run(fmax=0.05, steps=100)
# 4. MDの実行
# ... (後述の完全なスクリプトを参照)
FBTK が「幾何学的に無理のない配置」を事前に用意しているため、MACE での緩和や MD 開始時に原子が激しく衝突して計算が不安定になるリスクを最小限に抑えられます。
実践例:完全な実行スクリプト
以下は、FBTK によるベンゼン溶液の構築から MACE による MD 実行までを一貫して行う、最小構成のスクリプト例です。
import torch
import fbtk
from mace.calculators import mace_off
from ase.optimize import BFGS
from ase.md.langevin import Langevin
from ase.md.velocitydistribution import MaxwellBoltzmannDistribution
from ase.io import Trajectory
from ase.units import fs
# 1. 系の構築 (FBTK)
mol = fbtk.Molecule.from_smiles("c1ccccc1", name="Benzene")
builder = fbtk.Builder(density=0.8)
builder.add_molecule(mol, count=8)
system = builder.build()
system.relax() # UFFによる高速緩和(重なりの除去)
atoms = system.to_ase()
# 2. 計算の設定 (MACE)
device = "cuda" if torch.cuda.is_available() else "cpu"
calc = mace_off(model="small", device=device)
atoms.calc = calc
# 3. 構造最適化 (MACE) - MD開始前の安定化
print("Relaxing with MACE...")
opt = BFGS(atoms)
opt.run(fmax=0.05, steps=100)
# 4. MDの実行
MaxwellBoltzmannDistribution(atoms, temperature_K=300)
dyn = Langevin(atoms, 1.0 * fs, temperature_K=300, friction=0.02)
traj = Trajectory("mace_md.traj", 'w', atoms)
dyn.attach(traj.write, interval=10)
# 進行状況の表示
def print_status():
temp = atoms.get_temperature()
epot = atoms.get_potential_energy()
print(f"Step {dyn.nsteps}: T = {temp:.1f} K, Epot = {epot:.2f} eV")
dyn.attach(print_status, interval=100)
dyn.run(1000)
まとめ
FBTK は、初期構造の構築や大規模な解析といった「準備と後処理」の工数を大幅に削減し、計算化学のワークフロー全体を効率化するためのライブラリです。既存の計算環境を壊すことなく導入でき、最新の機械学習ポテンシャルを用いた MD シミュレーションにおいても幅広く活用できます。
- FBTK 公式ドキュメント: https://fbtk.forblaze-works.com/ja/