HDNNPプログラム作ってます
今までの進捗まとめ
HDNNP
Constructing high‐dimensional neural network potentials: A tutorial review
この論文を元にPythonで独自開発してます
Githubで公開してます
超ガバガバなのでREADMEもドキュメントもまだ書いてないしライセンスも設定してないし。。
今の所少数の研究室メンバしか使ってませんがもし使いたい人がいたら連絡してください
仕様
Python2.7を使用
以下のパッケージに依存
- chainer v4
- chainerMN
- dill
- mpi4py
- matplotlib
- numpy
- phonopy
- quippy
- scikit-learn
- scikit-optimize
quippyはPyPIにあるものではないのでpipで入れないように。
コンパイルが多少難しいので注意
用途
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.sample
、phonopy_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
構造のフォノン分散図を計算する
optimize, test mode
おそらく不要
HDNNP-LAMMPS
有名なMD計算プログラムLAMMPSに、HDNNPを組み込んでみた
ソースコードは同じようにGithubで公開してます
こちらは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にすればよかったのでは?