PIMDとAENETを使って機械学習分子シミュレーションをやってみよう: 2024年Docker版

経路積分第一原理分子動力学法ソフトウエアのPIMDを使って、機械学習分子シミュレーションをやってみることにします。

[PIMDとAENETを使って機械学習分子シミュレーションをやってみよう](https://qiita.com/cometscome_phys/items/660a84119b5d4acce903)
ではVirtual Boxを使ったやり方について書きましたが、ここではDockerを使ってやってみることにします。前回の記事と違うのは

1. Dockerを使うのでPIMDとaenetとQEがすでにインストール済み。いきなり実行できる。
2. 簡単なチュートリアルを書いてみた（第一原理MDと機械学習MD）
3. 自己学習ハイブリッドモンテカルロ法のチュートリアルも書いてみた

です。

# はじめに。PIMDとは

https://ccse.jaea.go.jp/software/PIMD/index.jp.html

PIMDはその名前からわかりますように、経路積分法を用いることで量子効果を取り入れた分子動力学計算ができます。
例えば、水素は軽いために量子振動が大きく、量子効果が大きいことが知られています。
したがって、水素の含まれる物質の計算では、第一原理計算を用いた分子動力学法である第一原理分子動力学では足りず、
実際の物質の振る舞いとシミュレーションがずれることが起きるかもしれません。
というわけで、PIMDは経路積分第一原理分子動力学を行うことができるソフトとして知られているのですが、実は経路積分を使わない通常の第一原理計算ソフトとしても様々なことができます。
その例として、PIMDの最新版において実装された機械学習分子動力学をやってみることにしましょう。

# 使うソフトウェア

1. PIMD
オープンソースの経路積分第一原理分子動力学法ソフトウエア。 https://ccse.jaea.go.jp/software/PIMD/index.jp.html

2. AENET (The Atomic Energy Network)
http://ann.atomistic.net aenetは、原子の配置をインプット、第一原理計算によって計算された系のエネルギーをアウトプットとして、エネルギーを模倣するようなニューラルネットワークを作成するオープンソースソフトウェアです。

3. QuantumESPRESSO https://www.quantum-espresso.org 第一原理計算ソフトウエア。フリーで利用することができる。

4. Docker
Dokcerを使うと、MacやWindowsやLinuxにおいて仮想的に別のOSを走らせることができます。また、パッケージが整備されたイメージを使うことで、インストール作業なしにいきなりそのパッケージを使用することができます。
今回はPIMD+QE+aenetが入ったイメージを作成しましたので、そちらを使うことになります。

# 動作確認環境

- M1 Mac
- Intel Mac

# 環境整備：Dockerのインストール
まず、Dockerをインストールしてください。Dockerは色々なサイトにインストール方法がありますので、適当に調べて入れてみてください。
Macであれば、[こちら](https://hub.docker.com/editions/community/docker-ce-desktop-mac/)からインストールができます。

# PIMD+QE+aenetのイメージの取得
次に、PIMD+QE+aenetのイメージを取得します。

```
docker pull cometscome/pimd_aenet_qe
```
で取得できます。

説明は[こちら](https://hub.docker.com/r/cometscome/pimd_aenet_qe)です。

あるいは、自前でDockerfileからビルドしたい方は、
https://github.com/cometscome/PIMD_with_QE_aenet_Docker
のものを使ってください。

このイメージでは、2021年のIntelのOneAPIに含まれたFortranとMKLとMPIを利用してPIMDとQEとaenetをコンパイルしています。

## 2023/9/12 追記
PIMDの最新バージョンが2.6.0となりましたので、2.6.0が動くDockerイメージを作成しました。コンパイラはOneAPI 2023となっています。これを使うには、
```
docker pull cometscome/pimd_aenet_qe:pimd_2_6_0
```
としてください。Dockerfileは[こちら](https://github.com/cometscome/PIMD_with_QE_aenet_Docker/tree/master/2.6.0)です。
2.5.2 (OneAPI 2022を使用)が使いたい場合には、
```
docker pull cometscome/pimd_aenet_qe:pimd_2_5_2
```
です。Dockerfileは[こちら](https://github.com/cometscome/PIMD_with_QE_aenet_Docker/tree/master/2.5.2)です。

## 2024/8/22 追記

OSをUbuntu 22.04に、PIMDを最新バージョンを2.6.1にし、Intel OneAPIを2024としたDokcerイメージを作成しました。
これを使うには、
```
docker pull cometscome/pimd_aenet_qe:pimd_2_6_1
```
としてください。
今回は、pimdに追加されたcmakeによるコンパイルを用いています。Dockerfileは[こちら](https://github.com/cometscome/PIMD_with_QE_aenet_Docker/tree/master/2.6.1)です。なお、cmakeを使うと、
```
cmake -DQE=on -DQEVERSION=6.3 -DAENET=on -DMKL=on .
```
のような簡単な感じでQEもaenetもコンパイルしてくれてリンクしてくれます。

# 実行のテスト
次に、Dockerで走らせてみます。

```
docker run --shm-size=2gb --rm -it cometscome/pimd_aenet_qe
```
を実行します。もし、M1 Macの場合には、

```
docker run --shm-size=2gb --platform=linux/amd64 --rm -it cometscome/pimd_aenet_qe
```
としてプラットフォームを指定しましょう。ただし、M1 Macでintelのコンパイラでコンパイルしたやつを動かすとどうにも遅いようですので、gfortranでコンパイルしたものを使ったほうがいいかもしれません（無事イメージができたらどこかからpullできるようにするかもしれません）

## Quantum EspressoによるMDのテスト
第一原理分子動力学ですね。これは、

```
cd pimd/examples/SiO2/qe_md/
mpirun -np 2 pimd.mpi.x
```
をすると、SiO2の個体に対して第一原理MDを行います。この例では2並列で動きます。

## aenetによるMDのテスト
機械学習分子動力学ですね。これは、

```
cd ~/pimd/examples/SiO2/aenet_pimd_nvt/
mpirun -np 2 pimd.mpi.x
```
で実行可能です。これはすでに学習済みのニューラルネットワークを使用します。

## QE+aenetの自己学習ハイブリッドモンテカルロ法(SLHMC)のテスト

これは、

```
cd ~/pimd/examples/SiO2/qe_slhmc
mpirun -np 2 pimd.mpi.x
```
で実行可能です。こちらはSiO2のニューラルネットワークをSLHMC法でどんどん改善していきます。
SLHMCは[ディープラーニングと物理学オンラインの講演スライド](https://cometscome.github.io/DLAP2020/slides/Nagai_SLHMC20200514.pdf)や
[論文](https://arxiv.org/abs/1909.02255)を参考にしてください。

PIMDでのMDの実行の仕方については、追記するか別の機会にもう少し詳しく記述してみたいと思います。
もう少し興味のある方は、PIMDのマニュアルは
https://ccse.jaea.go.jp/software/PIMD/doc/manual/manual.html
にありますので、こちらを見てみてください。




# 2025/04/09追記
Intel OneAPI 2025で試してみたところ少しおかしいようです。2025からifortがなくなり、LLVMベースのifxになりました。これによってaenetの一部で動作が変更され、セグメンテーションフォルトが起きるようになっていたようです。
これを修正したパッチを用意しました。また、QEとaenetとPIMDをOneAPI 2025.1でコンパイルできるようにDockerfileを整備しました。ifortがないためにifxをifortとしてみなすリンクを作ったりしています。

PIMDのバージョンは2.7.0に対応しました。Dockerfileは[こちら](https://github.com/cometscome/PIMD_with_QE_aenet_Docker/tree/master/2.7.0)です。自分でbuildする場合は、このディレクトリにあるsrc.patchというファイルも一緒に置いた状態でbuildしてください。
イメージは

```
docker pull cometscome/pimd_aenet_qe:pimd_2_7_0
```
でダウンロードできます。