MateriApps LIVE! と COMBO によるベイズ最適化
Last Update:2021/12/09
ここでは、Pythonによるベイズ最適化ライブラリをMateriApps LIVE!へインストールし、チュートリアルを実行してみます。チュートリアルではCuの安定な結晶粒界構造探索を行います
参考文献:
- S. Kiyohara, H. Oda, K. Tsuda and T. Mizoguchi, “Acceleration of stable interface structure searching using a kriging approach”, Jpn. J. Appl. Phys. 55, 045502 (2016).
使用したバージョン:
- MateriApps LIVE! バージョン 2.1 (Debian Stretch, Python 2.7.13)
- COMBO (masterブランチ最新版 2016/04/13更新)
VirtualBoxの設定:
デフォルトではMateriApps LIVE!には1GBのメモリが割り当てられています。COMBOの実行には1GBでは不足するので、メモリ割り当てを2GBに増やしておきます
- Oracle VM VirtualBox マネージャ画面から
- MateriAppsLive-2.1-amd64を選択
- 「設定」ボタン→「システム」ボタン→「マザーボード」タグ
- メインメモリーを2GBに増やし、「OK」ボタン
Cythonのインストール:
$ sudo apt install cython
COMBOのインストール:
$ wget https://github.com/tsudalab/combo/archive/master.tar.gz -O - | tar zxf -
$ cd combo-master
$ python setup.py build
$ sudo python setup.py install
データファイルのダウンロード
後で実行するチュートリアルスクリプトでは、サンプルデータファイルが必要です。データファイルが存在しない場合にはスクリプト内で自動的にダウンロードしようとしますが、現状 http://www.tudalab.org のSSLの証明書の不具合からダウンロードが失敗します。ここでは、スクリプトの実行前に明示的にダウンロードしておきます
$ cd examples/grain_bound $ mkdir -p data $ wget --no-check-certificate http://www.tsudalab.org/files/s5-210.csv -O data/s5-210.csv
このファイルには 17982 件のデータが入っています。 1カラム目から3カラム目までが、Cu結晶粒界のオフセット、4カラム目がGULPにより計算された粒界エネルギーを表します
まずは、ベイズ最適化を行う前に、ファイルの中から最適値を探してみます。
$ sed 's/\r/\n/g' data/s5-210.csv | tail +2 | sed 's/,/ /g' | cat -n | sort -n -k 5 -r | tail 8696 7.3 1.2 0 0.957542959 8104 5.7 1.2 0 0.95752306 6327 0.8 1.2 3.6 0.95751311 6919 2.4 1.2 3.6 0.957503729 8418 6.5 1.2 1.8 0.95748724 7826 4.9 1.2 1.8 0.957480133 6291 0.8 1.2 0 0.957478996 6883 2.4 1.2 0 0.957467625 6605 1.6 1.2 1.8 0.957453411 7197 3.2 1.2 1.8 0.957449716
7197番目のサンプルが最小値 0.957449716 を取ることが分かります
チュートリアルの実行:
それではチュートリアルを実行してみましょう。まず iPython Notebook を起動し、チュートリアルスクリプトを開きます
$ ipython notebook tutorial.ipynb
ブラウザが立ち上がり、チュートリアルファイルが開きます。まず「cell」メニューから「All Output」→「Clear」を選択し、以前の出力結果を消去します
次に、「cell」メニューから「Run All」を選択し、スクリプトを上から順番に実行します
デフォルトでは初期ランダムサーチを20サンプル行った後、ベイズ最適化を80ステップ行います。合計100サンプル中の最適値として
0100-th step: f(x) = -1.003655 (action=1183) current best f(x) = -0.963759 (best action=5698)
が求まります (Out[7]の終わりの方を見てください)。COMBOへのデータ読み込み時に、エネルギーの値にマイナス符号を付け、最大値を求めていることに注意してください。100サンプルの探索では、まだ最適値(0.957449716)は求まっていないことが分かります
次に、サンプル数を増やして実行してみます。In[7]の中の max_num_probes を 80 から 480 に変更します。「cell」メニューから「All Output」→「Clear」を選択し、以前の出力結果を消去してから、「cell」メニューから「Run All」を選択してスクリプトを実行します
再び Out[7] を見ると、今回は411ステップ目で最適値が見つかっていることが分かります
ステップ毎に探索したサンプルのエネルギー(にマイナス符号を付けたもの)は res.fx に入っています。プロットするには、セルに以下のコードを入力し shift + enter で実行します
plt.plot(range(res.total_num_search), res.fx[0:res.total_num_search])
また、それぞれのステップまでの最適値は以下のコードで出力されます
plt.plot(range(res.total_num_search), best_fx)