近年普及が進んでいるコンテナ仮想化技術ですが、HPCの領域においても利用が広がっています。大学のスパコンにDockerが導入される例も出てきていますし、AWS提供のAWS BatchもDockerベースのサービスです。
コンテナ仮想化のスタンダードとなりつつあるDockerですが、HPC用途で使用するにはいくつか課題があります。そのうちの1つが、コンテナ間でのMPI通信が難しいという点です。流体解析などのシミュレーションを大規模に実行する際には、複数台のサーバ(ノード)、複数のCPUを利用して並列処理を行いますが、この際に利用される通信規格がMPIです。これをDockerで利用するのが難しいため、HPC環境でのコンテナ導入のハードルとなっています。
そこでHPC用途に特化したコンテナとして登場したのがSingularityです。主に以下のようなメリットがあります。MPIなどHPC環境に求められる要望を満たしつつ、コンテナ仮想化のメリットを享受できる印象です。
- MPIを利用可能
- DockerイメージをSingularityイメージに変換でき、Dockerの利用を前提に構築した資産を活用可能
- Singularity Hubやプライベートレジストリを使ったコンテナの共有が可能
本記事では、Amazon EC2にSingularityをインストールし、実際に使ってみます。コンテナ内で実行するソフトウェアとして、オープンソースの流体解析ソルバであるOpenFOAM(OpenFOAM v4.1 Ubuntu版)を使用します。前半はSingularity Hubで公開されているイメージを使用する方法、後半はイメージを自作する方法を紹介します。最後に、実際に使ってみてつまづいた点を共有します。MPI実行までは本記事内ではたどり着けませんでしたのでご容赦ください。
使ってみる
EC2構成情報
今回の検証に使用したEC2は以下の通り設定しました
Region
ap-northeast-1(Tokyo)
AMI
Amazon Linux AMI 2017.09.1.20171120 x86_64 HVM GP2(ami-da9e2cbc)
Instance Type
t2.micro
EBS
16GiB
Security Group
自分のローカル環境からのSSH接続(TCP22)を許可
Singularityのインストール
必要なパッケージのインストール、およびディレクトリの作成を行います。
1 $ sudo yum -y update
2 $ sudo yum -y groupinstall "Development Tools"
3 $ mkdir ~/git
4 $ cd ~/git
5
公式のQuick Startを参考にSingularityをインストールします。
1 $ git clone https://github.com/singularityware/singularity.git
2 $ cd singularity
3 $ ./autogen.sh
4 $ ./configure --prefix=/usr/local
5 $ make
6 $ sudo make install
7
[$ singularity --help] を実行し、以下のように使い方が表示されればインストール成功です。
1 $ singularity --help
2 USAGE: singularity [global options...] <command> [command options...] ...
3
4 GLOBAL OPTIONS:
5 -d|--debug Print debugging information
6 -h|--help Display usage summary
7 -s|--silent Only print errors
8 -q|--quiet Suppress all normal output
9 --version Show application version
10 -v|--verbose Increase verbosity +1
11 -x|--sh-debug Print shell wrapper debugging information
12
13 [...]
14
15 For any additional help or support visit the Singularity
16 website: http://singularity.lbl.gov/
17
これでSingularityのインストールは完了ですが、ここで2つの設定をしておきます。
(1) simg形式のイメージを使用できるよう、squashfs-toolsをインストールしておきます。
1 $ sudo yum -y install squashfs-tools
2
(2) Singularityをsudoで実行できるよう、ここの [Error running Singularity with sudo]の通り設定を変更します。
1 $ sudo visudo
2 # Defaults secure_path = から始まる行を以下のように修正
3 Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
これで準備完了です。
公開イメージを使う
ここからSingularity上でコンテナを動作させ、OpenFOAMのチュートリアルを実行してみます。
Singularity HubにてOpenFOAMインストール済みのイメージを公開しましたので、まずはこれを使います。[$ singularity run] を実行すると、Singularity Hubからイメージがダウンロードされ、即時実行されます。このたび公開したイメージでは、[$ singularity run] 実行時にsimpleFoamが実行されるように設定しています。以下のようにコマンドを実行し、simpleFoam実行時の内容が出力されれば成功です
(simpleFoamの設定ファイルがディレクトリ内にないためエラーが出力されますが、「Singularityイメージをロードして実行する」という点では成功してます)
1 $ cd /tmp
2 $ singularity run shub://TakahisaShiratori/openfoam:4
3 Progress |===================================| 100.0%
4 /*---------------------------------------------------------------------------*\
5 | ========= | |
6 | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
7 | \\ / O peration | Version: 4.1 |
8 | \\ / A nd | Web: www.OpenFOAM.org |
9 | \\/ M anipulation | |
10 \*---------------------------------------------------------------------------*/
11 Build : 4.1
12 Exec : simpleFoam
13
14 [...]
15
16 --> FOAM FATAL IO ERROR:
17 cannot find file
18
19 file: //tmp/system/controlDict at line 0.
20
21 From function regIOobject::readStream()
22 in file db/regIOobject/regIOobjectRead.C at line 72.
23
24 FOAM exiting
25
simpleFoam以外のコマンドを実行したい場合は、[$ singularity exec] を使用します。例えば、blockMeshを使用したい場合は以下のようになります。
1 $ singularity exec shub://TakahisaShiratori/openfoam:4 blockMesh
2 Progress |===================================| 100.0%
3 /*---------------------------------------------------------------------------*\
4 | ========= | |
5 | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
6 | \\ / O peration | Version: 4.1 |
7 | \\ / A nd | Web: www.OpenFOAM.org |
8 | \\/ M anipulation | |
9 \*---------------------------------------------------------------------------*/
10 Build : 4.1
11 Exec : blockMesh
12
13 [...]
14
15 --> FOAM FATAL IO ERROR:
16 cannot find file
17
18 file: //tmp/system/controlDict at line 0.
19
20 From function regIOobject::readStream()
21 in file db/regIOobject/regIOobjectRead.C at line 72.
22
23 FOAM exiting
24
毎回Singularity Hubからイメージをダウンロードするのは時間がかかるので、以下のコマンドを実行してイメージをEC2インスタンス内に保存しておきます。
1 $ singularity pull --name openfoam4.simg shub://TakahisaShiratori/
2
一回pullしておくと、[shub://] から始まるイメージ名のかわりに [.simg] ファイルを指定することでコンテナでコマンドを実行できます。
1 $ singularity exec openfoam4.simg blockMesh
2
実際に解析を動かすために、OpenFOAMチュートリアルの設定ファイルをcloneして実行してみます。例えば、以下の手順でpitzDailyを実行できます。
1 $ cd ~/git
2 $ git clone https://github.com/OpenFOAM/OpenFOAM-4.x.git
3 $ cd /tmp
4 $ cp -r ~/git/OpenFOAM-4.x/tutorials/incompressible/simpleFoam/pitzDaily /tmp/
5 $cd /tmp/pitzDaily
6 $ ls
7 0 constant system
8 $ sudo singularity exec /tmp/openfoam4.simg blockMesh
9 $ sudo singularity exec /tmp/openfoam4.simg simpleFoam
10 $ ls
11 0 100 200 298 constant postProcessing system
[100] , [200] などのディレクトリが作成されていれば成功です。これらのディレクトリ中に解析結果が格納されています。別のEC2インスタンスにファイルをコピーしてparaFoamで可視化した例を下図に示します。
自分でイメージをつくる
使いたいソフトウェアのイメージが公開されていなかったり、内製コードをイメージ化して配信したい場合もあるかと思います。そのような場合はイメージを自作することもできます。イメージを自作するには、Shell(シェル)を操作して手動構築する方法と、Recipe(レシピ)を用意して自動構築する方法があります。
Shellを使う
OpenFOAMの場合、Shellを使ったイメージの手動構築は難しかったため、ここではshellでのログイン方法の紹介にとどめます。例えば、DockerのUbuntuイメージから構築を始めたい場合、以下のコマンドを実行します。
1 $ cd /tmp
2 $ cat /etc/os-release
3 NAME="Amazon Linux AMI"
4 VERSION="2017.09"
5 ID="amzn"
6 ID_LIKE="rhel fedora"
7 VERSION_ID="2017.09"
8 PRETTY_NAME="Amazon Linux AMI 2017.09"
9 ANSI_COLOR="0;33"
10 CPE_NAME="cpe:/o:amazon:linux:2017.09:ga"
11 HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
12 $ sudo singularity build --writable ubuntu.img docker://ubuntu
13 $ sudo singularity shell --writable ubuntu.img
14 Singularity: Invoking an interactive shell within container...
15
16 Singularity ubuntu.img:/tmp> cat /etc/os-release
17 NAME="Ubuntu"
18 VERSION="16.04.3 LTS (Xenial Xerus)"
19 ID=ubuntu
20 ID_LIKE=debian
21 PRETTY_NAME="Ubuntu 16.04.3 LTS"
22 VERSION_ID="16.04"
23 HOME_URL="http://www.ubuntu.com/"
24 SUPPORT_URL="http://help.ubuntu.com/"
25 BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
26 VERSION_CODENAME=xenial
27 UBUNTU_CODENAME=xenial
28
1回目の [cat /etc/os-release] ではホストのAmazon Linux, 2回目はコンテナのUbuntuの情報が表示されています。これでコンテナのシェルを操作できていますので、各種インストールコマンドを実行すればイメージを構築できます。コンテナからホストに戻るには [$ exit] を実行します。
1 Singularity ubuntu.img:/tmp> exit
2
Recipeを使う
Recipeファイル(ここでは拡張子を [.def] とします)にソフトウェアのインストール手順を記載して、イメージを作成することもできます。以下の手順で、先ほど使用したOpemFOAM v4.1のイメージと同一のものを作成できます。まず、こちらのファイルを [ubuntu1404_openfoam4.def] として保存します。
1 $ cd /tmp
2 $ wget https://raw.githubusercontent.com/TakahisaShiratori/openfoam/master/Singularity.4 -O ubuntu1404_openfoam4.def
3
あとは次のコマンドを実行すれば、repipeに記載の内容に従ってイメージが作成(build)されます。
1 $ sudo singularity build openfoam4_repipe.simg ubuntu1404_openfoam4.def
2
このコマンドで、先ほどSingularity Hubからダウンロードした [openfoam4.simg] と同一のイメージ[openfoam4_repipe.simg] がbuildされます。自分のオリジナルイメージを作成したい場合は、ここを参照しつつ [.def] ファイルを書き換えて、buildしましょう。
つまづいた点
使ってみて、つまづいた点を3点挙げます
ホストとコンテナ間のファイル共有
こちらのページの [Working with Files] 部の記載によると、デフォルトで [/home/$USER], [/tmp], [$PWD]の3つのディレクトリがホストとコンテナの間で共有されます。本記事の手順では、主な作業ディレクトリとして、環境に依存しない/tmpを使用しました。ディスクのマウント操作が不要で便利な一方、意図せずホスト側のファイルを改変してしまうこともありそうなので注意しましょう。
bashrcが実行されない
OpenFOAMはインストール後に、環境変数の自動設定のため [~/.bashrc] に追記をする必要があります。しかし、Singularityはコンテナの起動時にbashrcが実行されないようです。環境変数は、このrecipeの16行目のように、[$SINGULARITY_ENVIRONMENT] へ代入します。
OpenFOAM v5だと環境設定がうまくできない
最新版のOpenFOAM(v5)を使おうと思い、こちらのrecipeからイメージを作成しようとしましたが、うまく動作しませんでした。コンテナのbuildは成功するのですが、[run] や [exec] の実行時に、OpenFOAMのコマンドを呼び出せずに失敗します 詳細は調査中です。
おわりに
本記事では、HPC特化型コンテナであるSingularityをAmazon EC2にインストールし、OpenFOAMのチュートリアルを実行しました。うまく活用すれば、AWS, 他のクラウドサービス, オンプレミスなどの複数環境間でソフトウェアを持ち運べそうです。Singularityの長所であるMPI実行も追々試してみたいです。