CDVAE

CDVAEは結晶材料を対象とした拡散モデルベースの変分オートエンコーダである。既存の結晶構造から学習し、新規の周期構造の生成や、潜在空間での目標物性に向けた最適化を行う。ベンチマーク用データセット(Perov-5、Carbon-24、MP-20)および結晶生成・物性条件付けのための学習/評価スクリプトが提供されている。

MatDaCs ツールレビュー: CDVAE

概要

CDVAEは、結晶構造を対象とする拡散モデルベースの変分オートエンコーダである。材料の生成・再構成・物性条件付き設計を狙い、Perov-5、Carbon-24、MP-20などの整理されたデータセットと、学習/評価ユーティリティを提供する。本レビューでは、Perov-5データセットに対してローカルで簡易ベースラインを作り、データパイプラインの確認と参照モデルの確立を行った。

CDVAEとは

CDVAEは周期構造の潜在表現を学習し、拡散過程を用いて格子および分率座標を扱いながら現実的な結晶構造を生成する。Hydra設定によりデータ前処理、モデル構造、学習スケジュールが分離され、データセット側も標準ベンチマークのtrain/val/test分割が整備されている。

主な機能

  • 結晶生成モデル: 拡散モデル+VAEの構成で周期構造生成を目的に設計されている。
  • 物性条件付け: 逆設計に向け、物性予測ヘッドを追加できる。
  • ベンチマークデータセット: Perov-5(ペロブスカイト)、Carbon-24(炭素同素体)、MP-20(一般無機結晶)。
  • 設定駆動の学習: Hydraによりデータ/モデル/トレーナ設定を分離し再現性を高める。
  • 評価スクリプト: 再構成、生成品質、物性最適化の指標や可視化を用意する。

インストール

CDVAEはconda環境ファイル(env.ymlenv.cpu.yml)を提供しており、CUDA/PyTorch/Lightningなどのバージョンを固定している。基本形は以下である。

conda env create -f env.yml

本環境では、macOS arm64向けに必要となるPyG関連のネイティブ拡張(torch-sparsetorch-clustertorch-spline-conv)がconda上で利用できず、またこの環境ではpip取得もDNS制約で困難であった。そのため、公式デモの学習完走はできなかったが、公式Perov-5データセットを用いた軽量ベースラインにより、データアクセスの妥当性確認と比較基準を用意した。

ローカル例(Perov-5 ベースライン)

目的: Perov-5の公式分割(train.csvval.csvtest.csv)に対し、元素分率のみを特徴量とする組成ベースのベースラインを作る。これはデータファイルの検証と、後でCDVAE本体を走らせる際の下限値として有用である。

最小実装

import pandas as pd
import numpy as np
from pymatgen.core import Composition
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, r2_score

train_df = pd.read_csv(".../perov_5/train.csv")
val_df = pd.read_csv(".../perov_5/val.csv")

elements = sorted({el for f in train_df["formula"]
                   for el in Composition(f).as_dict().keys()})

def featurize_formula(series):
    rows = []
    for f in series.astype(str).tolist():
        comp = Composition(f).get_el_amt_dict()
        total = sum(comp.values())
        rows.append([comp.get(el, 0.0) / total for el in elements])
    return np.array(rows, dtype=float)

X_train = featurize_formula(train_df["formula"])
X_val = featurize_formula(val_df["formula"])

y_train = train_df["heat_ref"].values
y_val = val_df["heat_ref"].values

model = RandomForestRegressor(n_estimators=300, random_state=42, n_jobs=-1)
model.fit(X_train, y_train)
val_pred = model.predict(X_val)

mae = mean_absolute_error(y_val, val_pred)
r2 = r2_score(y_val, val_pred)

結果

  • 対象: heat_ref
  • Train/Val/Test件数: 11,356 / 3,787 / 3,785
  • 特徴量: 56元素分率
  • Validation: MAE = 0.543, R² = -0.162
  • Test: MAE = 0.547, R² = -0.182

R²が負であることは、このベースラインが意図的に弱い(組成のみで構造情報なし)ことを示しており、CDVAE本体を走らせる前の下限値として使いやすい。

公式デモの実行試行(Perov-5)

目的: Perov-5で公式の学習エントリポイントを、短い3エポック設定で実行する。

使用したコマンド:

PYTHONPATH=/Users/lihengyu/Desktop/Research_Project/On-campus 2025-2/CDVAE/cdvae \
PROJECT_ROOT=/Users/lihengyu/Desktop/Research_Project/On-campus 2025-2/CDVAE/cdvae \
HYDRA_JOBS=/Users/lihengyu/Desktop/Research_Project/On-campus 2025-2/CDVAE/outputs \
WABDB_DIR=/Users/lihengyu/Desktop/Research_Project/On-campus 2025-2/CDVAE/wandb \
conda run -n cdvae python /Users/lihengyu/Desktop/Research_Project/On-campus 2025-2/CDVAE/cdvae/cdvae/run.py \
  data=perov expname=perov_demo hydra.job.chdir=false \
  train.pl_trainer.gpus=0 train.pl_trainer.max_epochs=3

観察された挙動:

  • datamoduleがPerov-5の前処理(11,356構造)を開始し、CPUで約24秒で完了した。
  • macOS arm64のtorchgeometric 2.6.1でtorch_geometric.nn.actsが提供されず、またconda上でPyG拡張が利用できないためモデル生成で失敗した。

エラー概要:

ModuleNotFoundError: No module named 'torch_geometric.nn.acts'

所感

  • 公式環境は固定バージョン(例: pytorch=1.8.1pymatgen=2020.12.31)に依存しており、現行チャネルでは解決できない点がある。
  • 検証機はApple Silicon(arm64)であり、MPSが利用できないため、依存関係が揃っても学習はCPU実行となる。
  • Perov-5のCSVは利用可能であり、ベースライン作成や、PyGスタックが整った環境でのCDVAE実行にそのまま使える。

まとめ

CDVAEは結晶生成の参照実装として、データセット、設定、評価ツールが揃った構成であり、MatDaCsの執筆に有用である。本環境(macOS arm64)ではPyGネイティブ拡張の不足により公式デモを完走できなかったが、Perov-5ベースラインによりデータアクセスの妥当性と性能下限を示せた。Linux/x86_64(あるいはRosetta下のmacOS x86_64)で同コマンドを実行すれば、公式デモの完走が期待できる。

参考