GAMESSプログラムで第一原理計算を実行可能なDockerコンテナを作る方法

# はじめに

こんにちは，(株)日立製作所 研究開発グループ サービスコンピューティング研究部の露木です。

材料開発にAI・機械学習を適用する際に常に問題となるのがデータ数の少なさです。材料候補の物質を変えながら，大量の実験を繰り返して教師データとなる物性値を測定することは困難であり，少量の実験値から学習を行わなければなりません。しかし幸運なことに，計算化学・計算物理学の理論にもとづいてシミュレーション計算を行えば，第一原理的に物性値を得ることができます。このようにデータセットを補う観点から，機械学習を適用する立場でもシミュレーション計算を実行できる環境を整えることは非常に重要といえます。

本記事でとりあげる[GAMESS](https://www.msg.chem.iastate.edu/gamess/)プログラムは，量子力学にもとづいた繰り返し計算により電子の波動関数を計算し，分子の物性を計算するためのプログラムです。GAMESSはアイオワ州立大学により開発されているプログラムであり，理論化学・計算化学分野における有力なプログラムといえます。GAMESSプログラムは主要な波動関数法 (HF法やMP2法，結合クラスター法，配置間相互作用法など) や 密度汎関数法 (DFT) ベースの電子状態計算，相対論補正や振動状態計算等にも対応しています。同種のプログラムには[GAUSSIAN](https://gaussian.com/)や [MOLPRO](https://www.molpro.net/)，[TURBOMOLE](http://www.cosmologic.de/turbomole/home.html) などがあります。ご興味ある方は，これらプログラムと比較検討してみてください。

本稿ではGAMESSを利用して第一原理的な電子状態計算を行うことを目標に，Dockerコンテナとして実行環境を構築する方法を記します。

# 手順
## コンパイル環境の準備

インターネットには [DrSnowbird/hpc-app-gamess](https://github.com/DrSnowbird/hpc-app-gamess) や [saromleang/docker-gamess](https://github.com/saromleang/docker-gamess) などのGAMESS用のDockerfileが既に公開されています。しかし，これらには開発者の環境 (大学) に固有のコードが入っていますので，そのままでは使えません。そこで，今回は汎用的なDockerfileを新たに作りました。

まずは，このリポジトリを clone してDockerfileを入手してください。

```
git clone <リポジトリのURL> (注. 現時点では未公開。準備完了したら公開します)
```

次に，GAMESSの公式サイトからそのソースコード `gamess-current.tar.gz` を入手します。[Gordon Group/GAMESS Homepage](https://www.msg.chem.iastate.edu/gamess/License_Agreement.html) をWebブラウザで開いてライセンスに合意できるか確認したら，メールアドレスを登録してください。大抵は数時間以内にダウンロード用のURLとパスワードがメールで送付されます。

`gamess-current.tar.gz` を入手したら解凍します。

```
tar xzf gamess-current.tar.gz
```

次に，GAMESSのコンパイルオプションを対話的に生成していきます。まずはその準備としてbaseコンテナをビルドします。

```
docker-compose build base
```

baseコンテナを起動して，シェルにログインします。

```
docker run --rm -it -v `pwd`/gamess:/opt/gamess base /bin/bash
```

`gamess-current.tar.gz` に同梱されている `config` スクリプトを実行してコンパイルオプションを生成します。 `config` スクリプトを実行したら，質問が表示されていきますので環境とお好みに合わせて設定してください。

```
./config
```

ご参考までに先程のDockerfileで動作確認済みの設定例を以下に記します。

## 質問1

まず，`config`スクリプトを実行後，最初に表示される質問は単なるイントロダクションなので，読み終わりましたらEnterキーを押してください。

```
This script asks a few questions, depending on your computer system,
to set up compiler names, libraries, message passing libraries,
and so forth.

You can quit at any time by pressing control-C, and then <return>.

Please open a second window by logging into your target machine,
in case this script asks you to 'type' a command to learn something
about your system software situation.  All such extra questions will
use the word 'type' to indicate it is a command for the other window.

After the new window is open, please hit <return> to go on.
```

## 質問2

2つ目の質問はコンパイルする環境を選ぶものです。今回は 64-bit CPU のLinux として linux64 を選択します。

```
After the new window is open, please hit <return> to go on.
   GAMESS can compile on the following 32 bit or 64 bit machines:
axp64       - Alpha chip, native compiler, running Tru64 or Linux
cray-xt     - Cray's massively parallel system, running CNL
cray-xc     - Cray's XC40, with KNL nodes
hpux32      - HP PA-RISC chips (old models only), running HP-UX
hpux64      - HP Intel or PA-RISC chips, running HP-UX
ibm32       - IBM (old models only), running AIX
ibm64       - IBM, Power3 chip or newer, running AIX or Linux
ibm64-sp    - IBM SP parallel system, running AIX
ibm-bg      - IBM Blue Gene (Q model), these are 64 bit systems
linux32     - Linux (any 32 bit distribution), for x86 (old systems only)
linux64     - Linux (any 64 bit distribution), for x86_64 or ia64 chips,
              using gfortran, ifort, or perhaps PGI compilers.
mac32       - Apple Mac, any chip, running OS X 10.4 or older
mac64       - Apple Mac, any chip, running OS X 10.5 or newer
sgi32       - Silicon Graphics Inc., MIPS chip only, running Irix
sgi64       - Silicon Graphics Inc., MIPS chip only, running Irix
sun32       - Sun ultraSPARC chips (old models only), running Solaris
sun64       - Sun ultraSPARC or Opteron chips, running Solaris
win32       - Windows 32-bit (Windows XP, Vista, 7, Compute Cluster, HPC Edition)
win64       - Windows 64-bit (Windows XP, Vista, 7, Compute Cluster, HPC Edition)
winazure    - Windows Azure Cloud Platform running Windows 64-bit
singularity - GAMESS Singularity container image

    type 'uname -a' to partially clarify your computer's flavor.

please enter your target machine name: 
```

## 質問3

3つ目の質問はGAMESSのソースコードが置かれている場所を問うものです。正しい答えは `config` スクリプトが保存されているカレントディレクトリですので，そのままEnterキーを押してください。

```
Where is the GAMESS software on your system?
A typical response might be /u1/mike/gamess,
most probably the correct answer is /opt/gamess

GAMESS directory? [/opt/gamess]
```

## 質問4

4つ目の質問はコンパイルしたGAMESSプログラムを配置するディレクトリです。こちらもそのままEnterキーを押してください。

```
Setting up GAMESS compile and link for GMS_TARGET=linux64
GAMESS software is located at GMS_PATH=/opt/gamess

Please provide the name of the build locaation.
This may be the same location as the GAMESS directory.

GAMESS build directory? [/opt/gamess]
```

## 質問5

5個目の質問はGAMESSのバージョンを問うものです。このバージョンはコンパイルする人が区別するために決めるものなので，任意の値で構いません。ここではデフォルトの `00` のままEnterキーを押します。

```
Please provide a version number for the GAMESS executable.
This will be used as the middle part of the binary's name,
for example: gamess.00.x

Version? [00]
```

## 質問6

6つ目の質問はコンパイラを選択するものです。今回は `gfortran` と入力して Enterキーを押します。今回のDockerfileでは利用不可能ですが，もしもお手元に intelのfortranコンパイラ (ifort) のライセンスがあり，利用可能であればそちらのほうが高速になります。

```
Linux offers many choices for FORTRAN compilers, including the GNU
compiler suite's free compiler 'gfortran', usually included in
any Linux distribution.  If gfortran is not installed, it can be
installed from your distribution media.

To check on installed GNU compilers, for RedHat/SUSE style Linux,
   type 'rpm -aq | grep gcc' for both languages,
and for Debian/Ubuntu style Linux, it takes two commands
   type 'dpkg -l | grep gcc'
   type 'dpkg -l | grep gfortran'

There are also other compilers (some commercial), namely Intel's 'ifort',
Portland Group's 'pgfortran', Pathscale's 'pathf90', AMD's 'AOCC',
and ARM's armflang.
The last four are not common, and aren't as well tested.

type 'which gfortran'  to look for GNU's gfortran   (a good choice),
type 'which ifort'     to look for Intel's compiler (a good choice),
type 'which pgfortran' to look for Portland Group's compiler,
type 'which pathf90'   to look for Pathscale's compiler.
type 'which aocc'      to look for AMD's compiler.
type 'which armflang'  to look for ARM compiler.
Please enter your choice of FORTRAN:
```

## 質問7

次の質問は gfortran のバージョンを問うものです。 gfortran -v コマンドを実行すればバージョンを確認できますが，今回のDockerfileであれば 7.4 を入力してEnterキーを押してください。

```
Linux offers many choices for FORTRAN compilers, including the GNU
compiler suite's free compiler 'gfortran', usually included in
any Linux distribution.  If gfortran is not installed, it can be
installed from your distribution media.

To check on installed GNU compilers, for RedHat/SUSE style Linux,
   type 'rpm -aq | grep gcc' for both languages,
and for Debian/Ubuntu style Linux, it takes two commands
   type 'dpkg -l | grep gcc'
   type 'dpkg -l | grep gfortran'

There are also other compilers (some commercial), namely Intel's 'ifort',
Portland Group's 'pgfortran', Pathscale's 'pathf90', AMD's 'AOCC',
and ARM's armflang.
The last four are not common, and aren't as well tested.

type 'which gfortran'  to look for GNU's gfortran   (a good choice),
type 'which ifort'     to look for Intel's compiler (a good choice),
type 'which pgfortran' to look for Portland Group's compiler,
type 'which pathf90'   to look for Pathscale's compiler.
type 'which aocc'      to look for AMD's compiler.
type 'which armflang'  to look for ARM compiler.
Please enter your choice of FORTRAN: gfortran

gfortran is very robust, so this is a wise choice.

Please type 'gfortran -dumpversion' or else 'gfortran -v' to
detect the version number of your gfortran.
This reply should be a string with at least two decimal points,
such as 4.9.4 or 6.3.0.
The reply may be labeled as a 'gcc' version,
but it is really your gfortran version.

Please enter only the first decimal place, such as 4.9:
```

## 質問8

このコメントはgfortarnのバージョンが適合していることを教えてくれているだけですので，そのままEnterキーを押して次に進んでください。

```
   Good, the newest gfortrans can compile REAL*16 data type.
   Please report any numerical issues you encounter.
hit <return> to continue to the math library setup.
```

## 質問9

数値計算を高速化するためのライブラリとして，何をつかうか質問されています。今回は `atlas` をつかうので， `atlas` と入力してから Enterキーを押してください。

```
Linux distributions do not include a standard math library.

There are several reasonable add-on library choices,
       MKL from Intel           for 32 or 64 bit Linux (very fast)
      ACML from AMD             for 32 or 64 bit Linux (free)
     LibFLAME from AMD          for 64 bit Linux (free)
     ATLAS from www.rpmfind.net for 32 or 64 bit Linux (free)
  PGI BLAS from Portland Group  for 32 or 64 bit Linux
     ArmPL from ARM             for 64 bit Linux
and one very unreasonable option, namely 'none', which will use
some slow FORTRAN routines supplied with GAMESS.  Choosing 'none'
will run MP2 jobs 2x slower, or CCSD(T) jobs 5x slower.

Some typical places (but not the only ones) to find math libraries are
Type 'ls /opt/intel/mkl'                 to look for MKL
Type 'ls /opt/intel/Compiler/mkl'        to look for MKL
Type 'ls /opt/intel/composerxe/mkl'      to look for MKL
Type 'echo $MKLROOT'                     to look for MKL
Type 'ls -d /opt/acml*'                  to look for ACML
Type 'ls -d /usr/local/acml*'            to look for ACML
Type 'ls /usr/lib64/atlas'               to look for Atlas
Type 'ls /opt/pgi/linux86-64/*/lib/*     to look for libblas.a from PGI
Type 'ls /opt/pgi/osx86-64/*/lib/*       to look for libblas.a from PGI
Type 'echo $ARMPL_DIR'                   to look for ArmPL

Enter your choice of 'mkl' or 'atlas' or 'acml' or 'libflame' or 'openblas' or 'pgiblas' or 'armpl' or 'none':
```

## 質問10

次の質問は `atlas` をインストールしたディレクトリを問うものです。 `/usr/lib/x86_64-linux-gnu/atlas` を入力して Enterキーを押してください。

```
Where is your Atlas math library installed?  A likely place is
   /usr/lib64/atlas

  **BOLT: /shared/math/atlas/3.10.3-gnu-4.8.5-skylake
  **BOLT: /shared/math/atlas/3.10.3-gnu-4.8.5-amd-epyc
  **BOLT: /shared/math/atlas/3.10.3-gnu-4.8.5-skylake-lapack
  **BOLT: /shared/math/atlas/3.10.3-gnu-4.8.5-amd-epyc-lapack
Please enter the Atlas subdirectory on your system:
```

## 質問11

この質問は注意事項を述べているだけですので，そのままEnterを押します。

```
The linking step in GAMESS assumes that a softlink exists
within the system's /usr/lib/x86_64-linux-gnu/atlas
   from libatlas.so   to a specific file like libatlas.so.3.0
   from libf77blas.so to a specific file like libf77blas.so.3.0
config can carry on for the moment, but the 'root' user should
   chdir /usr/lib/x86_64-linux-gnu/atlas
   ln -s libf77blas.so.3.0 libf77blas.so
   ln -s libatlas.so.3.0   libatlas.so
prior to the linking of GAMESS to a binary executable.

Math library 'atlas' will be taken from /usr/lib/x86_64-linux-gnu/atlas

please hit <return> to compile the GAMESS source code activator
```

## 質問12

このメッセージは自動設定用プログラムのコンパイルに成功したことを示すものです。そのままEnterを押してください。

```
gfortran -o /opt/gamess/tools/actvte.x actvte.f
unset echo
Source code activator was successfully compiled.

please hit <return> to set up your network for Linux clusters.
```

## 質問13

並列計算の方法に関する質問です。今回はDockerであり，ノード間並列計算 (mpi) の利用は困難ですので単一のノードに閉じた並列計算のみを有効化します。`sockets` を入力してEnterキーを押してください。

```
If you have a slow network, like Gigabit Ethernet (GE), or
if you have so few nodes you won't run extensively in parallel, or
if you have no MPI library installed, or
if you want a fail-safe compile/link and easy execution,
     choose 'sockets'
to use good old reliable standard TCP/IP networking.

If you have an expensive but fast network like Infiniband (IB), and
if you have an MPI library correctly installed,
     choose 'mpi'.

If you wish to use a combination of TCP/IP networking for small
messages and MPI for large messages in a 'mixed' fashion,
     choose 'mixed'.

communication library ('serial','sockets' or 'mpi' or 'mixed')?
```

## 質問14

クラスター結合法に関するベータ版のコードをコンパイルするかという質問です。時間がかかる上に収束が難しい計算手法ですし，コンパイルも異様に遅くなりますから特別な事情が無い限りは `no` にしておきます。

```
Users have the option of compiling the beta version of the
active-space CCSDt and CC(t;3) codes developed at Michigan
State University (CCTYP = CCSD3A and CCT3, respectively).

These builds take a considerable amount of time and memory for
compilation due to the amount of machine generated source code.
We recommend that users interested in installing these codes
compile GAMESS in parallel using the Makefile generated during
the initial configuration ('make -j [number of cores]').

This option can be manually changed later by modifying install.info

Optional: Build Michigan State University CCT3 & CCSD3A methods?  (yes/no):
```

## 質問15

最後の質問はGPUによる高速化ライブラリの利用に関する質問です。今回はGPUを利用する予定は無いので `no` を選びます。

```
64 bit Linux and IBM builds can attach a special LIBCCHEM code for fast
MP2 and CCSD(T) runs.  The LIBCCHEM code can utilize nVIDIA GPUs,
through the CUDA libraries, if GPUs are available.
Usage of LIBCCHEM requires installation of HDF5 I/O software as well.
GAMESS+LIBCCHEM binaries are unable to run most of GAMESS computations,
and are a bit harder to create due to the additional CUDA/HDF5 software.
Therefore, the first time you run 'config', the best answer is 'no'!
If you decide to try LIBCCHEM later, just run this 'config' again.

Do you want to try LIBCCHEM?  (yes/no):
```

## GAMESSプログラムのコンパイル

すべての質問に答えたら，GAMESSプログラムを含むDockerイメージをビルドします。下記コマンドを実行するとGAMESSプログラムをソースコードからコンパイルするため，しばらく時間がかかります。

```
docker-compose build docker-gamess
```

# おわりに

以上でコンパイルは終わりです。環境準備はできましたので，いよいよGAMESSを使えるようになりましたが記事が長くなってしまいましたので，使い方は次回に解説します。

# 参考URL

- [Gordon Group/GAMESS Homepage](https://www.msg.chem.iastate.edu/index.html)
- [GitHub - saromleang/docker-gamess: Deployment of the General Atomic and Molecular Electronic Structure System (GAMESS) quantum chemistry code via a Docker container.](https://github.com/saromleang/docker-gamess)
- [GitHub - DrSnowbird/hpc-app-gamess: HPC Test Bench based on CentOS](https://github.com/DrSnowbird/hpc-app-gamess)