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

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のインストール

必要なパッケージのインストール、およびディレクトリの作成を行います 公式のQuick Startを参考にSingularityをインストールします $ singularity --helpを実行し、以下のように使い方が表示されればインストール成功です これでSingularityのインストールは完了ですが、ここで2つの設定をしておきます

(1) simg形式のイメージを使用できるよう、squashfs-toolsをインストールしておきます (2) Singularityをsudoで実行できるよう、ここError running Singularity with sudoの通り設定を変更します これで準備完了です

公開イメージを使う

ここからSingularity上でコンテナを動作させ、OpenFOAMのチュートリアルを実行してみます。

Singularity HubにてOpenFOAMインストール済みのイメージを公開しましたので、まずはこれを使います。$ singularity runを実行すると、Singularity Hubからイメージがダウンロードされ、即時実行されます。このたび公開したイメージでは、$ singularity run実行時にsimpleFoamが実行されるように設定しています。以下のようにコマンドを実行し、simpleFoam実行時の内容が出力されれば成功です
(simpleFoamの設定ファイルがディレクトリ内にないためエラーが出力されますが、「Singularityイメージをロードして実行する」という点では成功してます) simpleFoam以外のコマンドを実行したい場合は、$ singularity execを使用します。例えば、blockMeshを使用したい場合は以下のようになります 毎回Singularity Hubからイメージをダウンロードするのは時間がかかるので、以下のコマンドを実行してイメージをEC2インスタンス内に保存しておきます 一回pullしておくと、shub://から始まるイメージ名のかわりに.simgファイルを指定することでコンテナでコマンドを実行できます 実際に解析を動かすために、OpenFOAMチュートリアルの設定ファイルをcloneして実行してみます。例えば、以下の手順でpitzDailyを実行できます 100, 200などのディレクトリが作成されていれば成功です。これらのディレクトリ中に解析結果が格納されています。別のEC2インスタンスにファイルをコピーしてparaFoamで可視化した例を下図に示します

自分でイメージをつくる

使いたいソフトウェアのイメージが公開されていなかったり、内製コードをイメージ化して配信したい場合もあるかと思います。そのような場合はイメージを自作することもできます。イメージを自作するには、Shell(シェル)を操作して手動構築する方法と、Recipe(レシピ)を用意して自動構築する方法があります

Shellを使う

OpenFOAMの場合、Shellを使ったイメージの手動構築は難しかったため、ここではshellでのログイン方法の紹介にとどめます。例えば、DockerのUbuntuイメージから構築を始めたい場合、以下のコマンドを実行します 1回目のcat /etc/os-releaseではホストのAmazon Linux, 2回目はコンテナのUbuntuの情報が表示されています。これでコンテナのシェルを操作できていますので、各種インストールコマンドを実行すればイメージを構築できます。コンテナからホストに戻るには$ exitを実行します

Recipeを使う

Recipeファイル(ここでは拡張子を.defとします)にソフトウェアのインストール手順を記載して、イメージを作成することもできます。以下の手順で、先ほど使用したOpemFOAM v4.1のイメージと同一のものを作成できます。まず、こちらのファイルをubuntu1404_openfoam4.defとして保存します あとは次のコマンドを実行すれば、repipeに記載の内容に従ってイメージが作成(build)されます このコマンドで、先ほど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実行も追々試してみたいです

AWS運用自動化サービス「Cloud Automator」無料トライアルはこちらから

COMMENT ON FACEBOOK