こたつむりの備忘録

研究・技術的なことをメモしていきます

HDNNPプログラム作ってます

今までの進捗まとめ

HDNNP

Constructing high‐dimensional neural network potentials: A tutorial review

この論文を元にPythonで独自開発してます
Githubで公開してます

github.com

超ガバガバなのでREADMEもドキュメントもまだ書いてないしライセンスも設定してないし。。
今の所少数の研究室メンバしか使ってませんがもし使いたい人がいたら連絡してください

仕様

Python2.7を使用
以下のパッケージに依存

  • chainer v4
  • chainerMN
  • dill
  • mpi4py
  • matplotlib
  • numpy
  • phonopy
  • quippy
  • scikit-learn
  • scikit-optimize

quippyはPyPIにあるものではないのでpipで入れないように。

github.com

コンパイルが多少難しいので注意

用途

VASPなど第一原理計算プログラムで計算した全エネルギー及び原子間力を元に、それを再現するような原子間ポテンシャルを作成します
作成したポテンシャル(正確に言えば最適化したパラメータ)を用いて、フォノン分散を計算したり、後述のMD計算プログラムLAMMPSで使用してMD計算することも可能です
また、このプログラムを転用してボルン有効電荷(と分極)の予測を行うことも可能です

学習データ

単一の.xyzファイルかつ以下の条件を満たすように用意してください

  • forceを必ず含めること
  • 全エネルギーはcohesive_energy属性として追加すること
  • 同一の構造としてトレーニングデータをまとめるためにconfig_type属性を追加すること

使い方

主に使用するのは実行ファイルhdnnpyで、argparserを使用しているので./hdnnpy -hでオプションなどを確認できます

usage: hdnnpy [-h] {training,param_search,sym_func,test,phonon,optimize} ...

High Dimensional Neural Network Potential

positional arguments:
  {training,param_search,sym_func,test,phonon,optimize}
    training            see `training -h`
    param_search        see `training -h`
    sym_func            see `sf -h`
    test                see `test -h`
    phonon              see `phonon -h`
    optimize            see `optimize -h`

optional arguments:
  -h, --help            show this help message and exit

settings.py.samplephonopy_settings.py.sampleはそれぞれリネームしてpythonスクリプトとして使用してください
それぞれ全体的な設定、フォノン分散計算時の設定を記述します。

$ mv settings.py{.sample,}
$ mv phonopy_settings.py{.sample,}

settings.py

## import 略
# matplotlib全体の設定
mpl.use('Agg')
mpl.rc('font', size=20)

# コマンドライン引数を取得(変更不要)
args = get_parser()

# ファイル・ディレクトリ設定
file = DictAsAttributes(
    xyz_file='GaN/debug_test/GaN.xyz',
    config=['CrystalGa2N2', 'CrystalGa16N16'],
    out_dir='output',
    test_dir='test',
)

# MPI設定(今の所GPUは対応してないので変更不要)
mpi = DictAsAttributes(
    comm=MPI.COMM_WORLD,
    rank=MPI.COMM_WORLD.Get_rank(),
    size=MPI.COMM_WORLD.Get_size(),
    gpu=-1,
    chainer_comm=chainermn.create_communicator('naive', MPI.COMM_WORLD),
)

# 対称関数(Symmetry Functions)のハイパーパラメータ設定
sym_func = DictAsAttributes(
    Rc=[5.0],
    eta=[0.01, 0.1, 1.0],
    Rs=[2.0, 3.2, 3.8],
    lambda_=[-1, 1],
    zeta=[1, 2, 4],
)

# 機械学習のハイパーパラメータ設定
model = DictAsAttributes(
    epoch=1000,
    batch_size=100,
    preproc=None,
    input_size=20,
    init_lr=5.0e-3,
    final_lr=1.0e-6,
    lr_decay=1.0e-6,
    mixing_beta=1.0,
    l1_norm=0.0e-4,
    l2_norm=0.0e-4,
    layer=[
        {'node': 30, 'activation': 'tanh'},
        {'node': 30, 'activation': 'tanh'},
        {'node': 1, 'activation': 'identity'},
    ],
    metrics='validation/main/tot_RMSE',
)

# ハイパーパラメータ探索(ベイズ最適化)に使用するパラメータ設定
skopt = DictAsAttributes(
    kfold=2,
    init_num=5,
    max_num=10,
    space=[
        Real(1.0e-4, 1.0e-2, prior='log-uniform', name='init_lr'),
        Real(1.0e-6, 1.0e-4, prior='log-uniform', name='final_lr'),
        Real(1.0e-6, 1.0e-3, prior='log-uniform', name='lr_decay'),
    ],
    acq_func='LCB',
    callback=[
        SamePointStopper(),
        DeltaYStopper(1.0e-3, n_best=3),
    ],
)

training mode

$ mpirun -np 8 ./hdnnpy training

chainerを使用してトレーニングを実行 終了すると、output/<datetime>/ディレクトリに計算結果result.yamlなどが出力されます
lammps.nnpは後述のLAMMPSで使用するパラメータセットです(.txtフォーマット)

param_search mode

$ mpirun -np 8 ./hdnnpy param_search

scikit-optimizeを使用してハイパーパラメータ探索を実行
さらに、実行後最良のパラメータを使用してトレーニングを実行
パラメータ探索の過程は出力されず、skopt_result.yamlのみ出力される

sym_func mode

$ mpirun -np 8 ./hdnnpy sym_func

対称関数計算のみを実行

phonon mode

$ ./hdnnpy phonon

作成したHDNNPを用いて、phonopy_settings.pyの設定のもとでtest_dir(in settings.py)にあるPOSCAR構造のフォノン分散図を計算する

f:id:justice_vsbr:20180802005440p:plain

optimize, test mode

おそらく不要

HDNNP-LAMMPS

有名なMD計算プログラムLAMMPSに、HDNNPを組み込んでみた
ソースコードは同じようにGithubで公開してます

github.com

こちらはC++で書かれたLAMMPSの拡張コードとなっており、LAMMPSのsrc/ディレクトリにコピーするかリンクを作成し、コンパイルすることで使えるようになります

仕様

MKL及びC++ヘッダライブラリEigenを使用するので、よしなに設定しておいてください(投げやり

使い方

$ cp *.h path/to/lammps/src/
$ cp *.cpp path/to/lammps/src/
$ cd path/to/lammps/src/
$ make mpi  # どのconfigでコンパイルするかは各自環境に合わせて
$ lmp_mpi  # 生成される実行ファイル名もconfigにより異なる

LAMMPSスクリプト中では

pair_style nnp
pair_coeff * * lammps.nnp A B

pair_coeffコマンドの第3引数にはHDNNPプログラムで出力されるような形式に従って記述したパラメータファイルを、第4引数以降には各atom typeの原子記号を指定してください









………これをREADMEにすればよかったのでは?