Click here to read in English.
近年普及が進んでいるコンテナ仮想化技術ですが、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のインストール
必要なパッケージのインストール、およびディレクトリの作成を行います
$ sudo yum -y update
$ sudo yum -y groupinstall "Development Tools"
$ mkdir ~/git
$ cd ~/git
公式のQuick Startを参考にSingularityをインストールします
$ git clone https://github.com/singularityware/singularity.git
$ cd singularity
$ ./autogen.sh
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ singularity --help
を実行し、以下のように使い方が表示されればインストール成功です
$ singularity --help
USAGE: singularity [global options...] <command> [command options...] ...
GLOBAL OPTIONS:
-d|--debug Print debugging information
-h|--help Display usage summary
-s|--silent Only print errors
-q|--quiet Suppress all normal output
--version Show application version
-v|--verbose Increase verbosity +1
-x|--sh-debug Print shell wrapper debugging information
[...]
For any additional help or support visit the Singularity
website: http://singularity.lbl.gov/
これでSingularityのインストールは完了ですが、ここで2つの設定をしておきます
(1) simg形式のイメージを使用できるよう、squashfs-toolsをインストールしておきます
$ sudo yum -y install squashfs-tools
(2) Singularityをsudoで実行できるよう、ここのError running Singularity with sudo
の通り設定を変更します
$ sudo visudo
# Defaults secure_path = から始まる行を以下のように修正
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イメージをロードして実行する」という点では成功してます)
$ cd /tmp
$ singularity run shub://TakahisaShiratori/openfoam:4
Progress |===================================| 100.0%
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 4.1 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : 4.1
Exec : simpleFoam
[...]
--> FOAM FATAL IO ERROR:
cannot find file
file: //tmp/system/controlDict at line 0.
From function regIOobject::readStream()
in file db/regIOobject/regIOobjectRead.C at line 72.
FOAM exiting
simpleFoam以外のコマンドを実行したい場合は、$ singularity exec
を使用します。例えば、blockMeshを使用したい場合は以下のようになります
$ singularity exec shub://TakahisaShiratori/openfoam:4 blockMesh
Progress |===================================| 100.0%
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 4.1 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : 4.1
Exec : blockMesh
[...]
--> FOAM FATAL IO ERROR:
cannot find file
file: //tmp/system/controlDict at line 0.
From function regIOobject::readStream()
in file db/regIOobject/regIOobjectRead.C at line 72.
FOAM exiting
毎回Singularity Hubからイメージをダウンロードするのは時間がかかるので、以下のコマンドを実行してイメージをEC2インスタンス内に保存しておきます
$ singularity pull --name openfoam4.simg shub://TakahisaShiratori/openfoam:4
一回pullしておくと、shub://
から始まるイメージ名のかわりに.simg
ファイルを指定することでコンテナでコマンドを実行できます
$ singularity exec openfoam4.simg blockMesh
実際に解析を動かすために、OpenFOAMチュートリアルの設定ファイルをcloneして実行してみます。例えば、以下の手順でpitzDailyを実行できます
$ cd ~/git
$ git clone https://github.com/OpenFOAM/OpenFOAM-4.x.git
$ cd /tmp
$ cp -r ~/git/OpenFOAM-4.x/tutorials/incompressible/simpleFoam/pitzDaily /tmp/
$ cd /tmp/pitzDaily
$ ls
0 constant system
$ sudo singularity exec /tmp/openfoam4.simg blockMesh
$ sudo singularity exec /tmp/openfoam4.simg simpleFoam
$ ls
0 100 200 298 constant postProcessing system
100
, 200
などのディレクトリが作成されていれば成功です。これらのディレクトリ中に解析結果が格納されています。別のEC2インスタンスにファイルをコピーしてparaFoamで可視化した例を下図に示します
自分でイメージをつくる
使いたいソフトウェアのイメージが公開されていなかったり、内製コードをイメージ化して配信したい場合もあるかと思います。そのような場合はイメージを自作することもできます。イメージを自作するには、Shell(シェル)を操作して手動構築する方法と、Recipe(レシピ)を用意して自動構築する方法があります
Shellを使う
OpenFOAMの場合、Shellを使ったイメージの手動構築は難しかったため、ここではshellでのログイン方法の紹介にとどめます。例えば、DockerのUbuntuイメージから構築を始めたい場合、以下のコマンドを実行します
$ cd /tmp
$ cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2017.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2017.09"
PRETTY_NAME="Amazon Linux AMI 2017.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2017.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
$ sudo singularity build --writable ubuntu.img docker://ubuntu
$ sudo singularity shell --writable ubuntu.img
Singularity: Invoking an interactive shell within container...
Singularity ubuntu.img:/tmp> cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
1回目のcat /etc/os-release
ではホストのAmazon Linux, 2回目はコンテナのUbuntuの情報が表示されています。これでコンテナのシェルを操作できていますので、各種インストールコマンドを実行すればイメージを構築できます。コンテナからホストに戻るには$ exit
を実行します
Singularity ubuntu.img:/tmp> exit
Recipeを使う
Recipeファイル(ここでは拡張子を.def
とします)にソフトウェアのインストール手順を記載して、イメージを作成することもできます。以下の手順で、先ほど使用したOpemFOAM v4.1のイメージと同一のものを作成できます。まず、こちらのファイルをubuntu1404_openfoam4.def
として保存します
$ cd /tmp
$ wget https://raw.githubusercontent.com/TakahisaShiratori/openfoam/master/Singularity.4 -O ubuntu1404_openfoam4.def
あとは次のコマンドを実行すれば、repipeに記載の内容に従ってイメージが作成(build)されます
$ sudo singularity build openfoam4_repipe.simg ubuntu1404_openfoam4.def
このコマンドで、先ほど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実行も追々試してみたいです