HPC特化型コンテナ"Singularity"でOpenFOAMを動かす

記事タイトルとURLをコピーする

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は成功するのですが、runexecの実行時に、OpenFOAMのコマンドを呼び出せずに失敗します 詳細は調査中です

おわりに

本記事では、HPC特化型コンテナであるSingularityをAmazon EC2にインストールし、OpenFOAMのチュートリアルを実行しました。うまく活用すれば、AWS, 他のクラウドサービス, オンプレミスなどの複数環境間でソフトウェアを持ち運べそうです。Singularityの長所であるMPI実行も追々試してみたいです