3. 基本的な使用方法

3.1. 能動学習について

abICSは元々、第一原理計算とレプリカ交換モンテカルロ法を直接組み合わせて統計熱力学計算を行うことを念頭に開発されましたが、 計算できるモデル規模やステップ数が、第一原理計算の大きな計算コストのために限られてしまいます。 これに対して、Ver. 2では、構造最適化後のエネルギーを高速に予測する機械学習モデルを構成するための能動学習手法を実装し、 飛躍的にサンプリング速度を向上させました [Kasamatsu et al. 2022]

abICSに実装されている能動学習手法の大まかな流れは以下の通りです。

  1. ランダムに生成した多数の原子配置に対して第一原理計算を行い、訓練データ(原子配置とエネルギーの対応関係)を用意する

  2. 用意した訓練データを使って、原子配置からエネルギーを予測する機械学習モデルを構築する

  3. 機械学習モデルを使って、レプリカ交換モンテカルロ法による原子配置の統計熱力学サンプリングを行う

  4. モンテカルロ計算で出現したイオン配置をサンプリングし、それぞれに対して第一原理計算を行うことで、機械学習モデルの精度の評価を行う

  5. 不十分であった場合は、4.で計算した結果を訓練データに追加し、2.から繰り返す。

../_images/al_scheme.png

abICSを用いた能動学習のイメージ図

3.2. abICS制御用入力ファイルの準備

まず、abICSの動作全般を制御する入力ファイルを作成します。 abICSの入力ファイルは, 以下の5つのセクションから構成されます.

  1. [sampling] セクション

    レプリカ数や温度の幅, モンテカルロステップ数など,レプリカ交換モンテカルロ部分のパラメータを指定します.また、利用するソルバーの種類 (VASP, QE, ...)、ソルバーへのパス、不変な入力ファイルのあるディレクトリなど(第一原理計算)ソルバーのパラメータを指定します.

  2. [mlref] セクション

    ニューラルネットワークモデルの精度評価と訓練データの拡張などを行うため、サンプリングの結果から原子配置のみを取り出す際のオプションを設定します. abics_mlref のみで使用されます. また、訓練データを作成するために利用するソルバーの種類 (VASP, QE, ...)、ソルバーへのパス、不変な入力ファイルのあるディレクトリなど(第一原理計算)ソルバーのパラメータを指定します.

  3. [train] セクション

    訓練データから配置エネルギー予測モデルを学習する学習器の設定を行います. abics_train のみで使用されます.

  4. [observer] セクション

    取得する物理量の種類などを指定します.

  5. [config] セクション

    合金の配位などを指定します.

これらの詳細については 入力ファイルフォーマット をご覧ください。 以下に入力ファイルの例を記載します。

[sampling]
nreplicas = 8
nprocs_per_replica = 1 
kTstart = 600.0
kTend = 2000.0
nsteps = 6400 # Number of steps for sampling
RXtrial_frequency = 4
sample_frequency = 16
print_frequency = 1
reload = false

[sampling.solver]
type = 'aenet'
path= 'predict.x-2.0.4-ifort_serial'
base_input_dir = './baseinput'
perturb = 0.0
run_scheme = 'subprocess' #'mpi_spawn_ready'
ignore_species = ["O"]

[mlref]
nreplicas = 8
ndata = 5

[mlref.solver]
type = 'qe'
base_input_dir = './baseinput_ref'
perturb = 0.05
ignore_species = []

[train]
type = 'aenet'
base_input_dir = './aenet_train_input'
exe_command = ['generate.x-2.0.4-ifort_serial', 'srun train.x-2.0.4-ifort_intelmpi']
ignore_species = ["O"]
vac_map = []
restart = false

[config]
unitcell = [[8.1135997772, 0.0000000000, 0.0000000000],
            [0.0000000000, 8.1135997772, 0.0000000000],
            [0.0000000000, 0.0000000000, 8.1135997772]]
supercell = [1,1,1]

[[config.base_structure]]
type = "O"
coords = [
     [0.237399980, 0.237399980, 0.237399980],
     [0.762599945, 0.762599945, 0.762599945],
     [0.512599945, 0.012600004, 0.737399936],
     [0.487399966, 0.987399936, 0.262599975],
     [0.012600004, 0.737399936, 0.512599945],
     [0.987399936, 0.262599975, 0.487399966],
     [0.737399936, 0.512599945, 0.012600004],
     [0.262599975, 0.487399966, 0.987399936],
     [0.987399936, 0.487399966, 0.262599975],
     [0.012600004, 0.512599945, 0.737399936],
     [0.487399966, 0.262599975, 0.987399936],
     [0.512599945, 0.737399936, 0.012600004],
     [0.262599975, 0.987399936, 0.487399966],
     [0.737399936, 0.012600004, 0.512599945],
     [0.237399980, 0.737399936, 0.737399936],
     [0.762599945, 0.262599975, 0.262599975],
     [0.512599945, 0.512599945, 0.237399980],
     [0.487399966, 0.487399966, 0.762599945],
     [0.012600004, 0.237399980, 0.012600004],
     [0.987399936, 0.762599945, 0.987399936],
     [0.987399936, 0.987399936, 0.762599945],
     [0.012600004, 0.012600004, 0.237399980],
     [0.487399966, 0.762599945, 0.487399966],
     [0.512599945, 0.237399980, 0.512599945],
     [0.737399936, 0.237399980, 0.737399936],
     [0.262599975, 0.762599945, 0.262599975],
     [0.237399980, 0.512599945, 0.512599945],
     [0.762599945, 0.487399966, 0.487399966],
     [0.762599945, 0.987399936, 0.987399936],
     [0.237399980, 0.012600004, 0.012600004],
     [0.737399936, 0.737399936, 0.237399980],
     [0.262599975, 0.262599975, 0.762599945],
     ]

[[config.defect_structure]]
coords = [
     [0.000000000, 0.000000000, 0.000000000],
     [0.749999940, 0.249999985, 0.499999970],
     [0.249999985, 0.749999940, 0.499999970],
     [0.249999985, 0.499999970, 0.749999940],
     [0.749999940, 0.499999970, 0.249999985],
     [0.499999970, 0.749999940, 0.249999985],
     [0.499999970, 0.249999985, 0.749999940],
     [0.000000000, 0.499999970, 0.499999970],
     [0.749999940, 0.749999940, 0.000000000],
     [0.249999985, 0.249999985, 0.000000000],
     [0.249999985, 0.000000000, 0.249999985],
     [0.749999940, 0.000000000, 0.749999940],
     [0.499999970, 0.000000000, 0.499999970],
     [0.000000000, 0.749999940, 0.749999940],
     [0.000000000, 0.249999985, 0.249999985],
     [0.499999970, 0.499999970, 0.000000000],
     [0.374999970, 0.374999970, 0.374999970],
     [0.624999940, 0.624999940, 0.624999940],
     [0.374999970, 0.874999940, 0.874999940],
     [0.624999940, 0.124999993, 0.124999993],
     [0.874999940, 0.874999940, 0.374999970],
     [0.124999993, 0.124999993, 0.624999940],
     [0.874999940, 0.374999970, 0.874999940],
     [0.124999993, 0.624999940, 0.124999993],
     ]
[[config.defect_structure.groups]]
name = 'Al'
# species = ['Al']    # default
# coords = [[[0,0,0]]]  # default
num = 16 #432 #16000
[[config.defect_structure.groups]]
name = 'Mg'
# species = ['Mg']    # default
# coords = [[[0,0,0]]]  # default
num = 8 #216 #8000


[observer]
reference_structure = "MgAl2O4.vasp"
ignored_species = ["Al", "O"]

3.3. 第一原理ソルバー用参照ファイルの準備

訓練データの生成に用いる第一原理ソルバーの入力形式に従った入力ファイルを用意します。 参照ファイルのパスはabICSの入力ファイルにある [mlref.solver] セクションの base_input_dir で指定します。 座標情報については記載する必要はありません。 以下、Quantum ESPRESSOの参照ファイルの例について記載します。

&CONTROL
  calculation = 'relax'
  tstress = .false.
  tprnfor = .false.
  pseudo_dir = './pseudo'
  disk_io = 'low'
  wf_collect = .false.
/
&SYSTEM
  ecutwfc      =  60.0
  occupations  = "smearing"
  smearing     = "gauss"
  degauss      = 0.01
/
&electrons
  mixing_beta = 0.7
  conv_thr = 1.0d-8
  electron_maxstep = 100
/
&ions
/
ATOMIC_SPECIES
Al 26.981 Al.pbe-nl-kjpaw_psl.1.0.0.UPF
Mg 24.305 Mg.pbe-spnl-kjpaw_psl.1.0.0.UPF
O  16.000 O.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS crystal

K_POINTS gamma

3.3.1. 第一原理ソルバー利用時の注意点

原子座標以外の設定については基本的にソルバーごとに指定する必要があります。ただし、構造最適化をする原子の指定についてはabICS側で制御することが可能です。構造最適化機能を有効にする場合には、ソルバーの参照ファイルで構造最適化オプションを有効にした上で、構造最適化のステップ数なども指定することで最適化が行われます。 また、abICSではソルバー毎に、参照ファイル名、実装時に仮定している参照ファイルのルールなどがあります。 以下、それらについて説明します。

VASP

  • URL : https://www.vasp.at

  • 参照ファイル

    • INCAR, POTCAR, KPOINTS ファイルを用意してください。

      • POTCARファイルは元素をアルファベット順に並べてください。

      • POSCARファイルは不要ですが、依存パッケージである pymatgen のバージョンによっては必要になります。その場合、なにか適当なファイルを用意してください。

Quantum Espresso

  • URL : https://www.quantum-espresso.org

  • バージョンは 6.2 以上を利用してください。

    • いわゆる旧形式 XML バージョンは利用できません。

  • 参照ファイル

    • 参照ファイル名は scf.in にしてください。

    • calculationscfrelax のみ対応しています。

    • \(\Gamma\) 点のみで計算する場合には、 kpointsGamma に指定すると高速化します。

OpenMX

  • URL : http://www.openmx-square.org

  • バージョンは 3.9 を利用してください。

  • 参照ファイル

    • 参照ファイル名は base.dat にしてください。

3.4. 機械学習モデル訓練および評価用参照ファイルの準備

使用する機械学習モデルソルバー(現在はaenetのみに対応)の入力形式に従った入力ファイルを用意します。 参照ファイルのパスはabICSの入力ファイルにある [solver] セクションの base_input_dir で指定します。 座標情報については、abICSの入力ファイルを参照するため、記載する必要はありません。

3.4.1. 機械学習モデルソルバー利用時の注意点

aenet

  • URL : http://ann.atomistic.net

  • バージョン2.0.4 で動作確認済。

  • 参照ファイル(参照ファイルの具体例についてはチュートリアル参照)

    • aenet用の入力ファイルを [train] セクションの base_input_dir で設定したディレクトリ内の generatetrain 、および predict ディレクトリに設置してください。

    • aenetでは、訓練用の原子配置とエネルギーのデータを、原子環境記述子とエネルギーの関係に変換した中間バイナリフォーマットにまとめてから訓練を行います。この変換を行う generate.x 用の 入力ファイルを generate ディレクトリに設置してください。

    • generate.x で生成された訓練データを読み込み、訓練を行う train.x 用の入力ファイルを train ディレクトリに設置します。 ファイル名は train.in としてください。

    • 訓練したポテンシャルモデルを使って入力座標に対してエネルギーを 評価するための predict.x 用の入力ファイル predict.in を、 predict ディレクトリに設置してください。

  • abICS 入力ファイル

    • [solver] セクションで type , perturb , run_scheme に関しては、能動学習スキームを用いる場合は以下に設定してください。

    type = “aenet”
    perturb = 0.0
    run_scheme = ‘subprocess’
    

3.5. 学習データの作成

  1. abics_mlref を用いて訓練データの大元となる第一原理計算用の入力ファイルを生成します。

  2. 1で生成した入力ファイルに対して第一原理計算を実施します(チュートリアルでは GNU parallel を利用し網羅計算を実行しています)。

3.6. 機械学習モデルの作成

  1. abics_mlref を再度実行して、学習で用いる abics_train が読み込めるよう第一原理計算の結果を変換します。

  2. 次に abics_train を実行して機械学習モデルの作成を行います。 計算が無事終了すると、 baseinput ディレクトリに学習済みの機械学習モデル(ニューラルネットワーク)が出力されます。

3.7. モンテカルロサンプリングの実行

abics_sampling を用いてモンテカルロサンプリングを行います(MPI 実行時に指定するプロセス数はレプリカ数以上である必要があります)。 実行すると、カレントディレクトリ以下にレプリカ番号を名前にもつディレクトリが作られ、各レプリカはその中でソルバーを実行します。 なお、 LAMMPSインターフェースをもちいた aenet ライブラリ呼び込みにも対応しています(aenetPyLammps)。 ファイル入出力やプロセスフォークなどを行わないため、 aenet を直接呼び出すよりも高速に動作します。 aenetPyLammps の利用には、 aenet-lammps および LAMMPS のインストールが必要です。 インストールや使い方の詳細は LAMMPS インターフェースを利用したサンプリング を参照してください。