3. Singularity とは

Singularity は2015年に米国 Lawrence Berkeley national Laboratory のスーパーコンピュータの利便性を高めるために開発され、オープンソースで公開されている Linux コンテナ実装です。

現在 Singularity は、開発者らが立ち上げた Sylabs 社と、独立したコミュニティにより個別に開発されています。後者の無償のものは Community Edition(CE)と呼ばれ、修正 BSD License(一部 Apache License のコードを含む)で Github 上に公開されています。これに対し、CE をベースに十分に検証された機能を搭載し、セキュリティ対応やバグフィックスのバックポート等の有償サービスを、主要な開発を行っている Sylabs 社が提供する Singularity PRO があります。「富岳」ではセキュリティおよびサポートの観点から、Singularity PRO を採用しています。

Singularity を使うと、アプリケーションの実行に必要なシステム要件のうち、カーネル以外の部分を独立に構成・保持でき、アプリケーションと一体とできるため、同一アーキテクチャの環境であれば、実行環境をまるごと持ち運ぶことができるようになります。

また、アプリケーションに必要なランタイムライブラリの更新頻度が高い場合や、多彩なアプリケーションを駆使する必要がある場合に、それぞれの要件を個別に整えたり切り替えたりすることを考えなくてよくなります。さらに古い実行環境を保存しておくことも容易なため、データの再検証などもやりやすくなります。

他の実装と比べた Singularity の際立った特徴は以下の4点です。

  1. イメージが単一ファイルで作成されるため、コンテナイメージの管理が直感的で容易。

  2. イメージを展開せず、単一ファイルのまま利用できるので、アプリケーション稼働時の共有ファイルシステムへの I/O を抑制できる。

  3. 起動したユーザーのID・権限がコンテナ内部で継承され、同一ユーザーとしてファイル・ハードウエア・プロセスにアクセス可能。

  4. イメージ作成やコンテナ実行に際して、root 権限やデーモンを一切介在させないため、セキュアな運用が可能。

3.1. コンテナ

コンテナとは仮想化技術の一つです。完全仮想化がハードウエアのエミュレータの上で OS まるごとをインストールおよび動作させるのに対し、コンテナはホスト側のカーネルを共有し、ユーザー環境のみを切り替えて使う方式です。そのため、

  1. 起動済みのカーネル上で動くため、完全仮想化のように OS を起動する必要がなく、起動が高速でオーバーヘッドが少ない。

  2. システムとアプリケーションとユーザー設定を一体であつかうことができるため、再現性が高く、世代検証も容易。

  3. 複数のシステム上で何度も環境をセットアップしたり、動作をすり合わせ検証する必要がない。

といった特徴があります。

コンテナ実装には Singularity 以外にも Podman, Docker, LXE, Shifter, CharieCloud など多数あり、それぞれ特徴があります。 共通しているのは、ルートディレクトリ以下を切り替えて専用の環境の上でアプリケーションを動かすことです。そのユーザーランド(端的にはルートディレクトリ以下)を切り出したものをイメージと呼び、コンテナ実装ごとにフォーマットや利用方法が異なります。

コンテナの中身は既存の OS の環境と変わりません。そのため、異なるアーキテクチャのアプリケーションを持ち込むことはできません。ARM で作成されたイメージを x86_64 の環境で動かしたり、その逆はできません。また、カーネルはホスト側の物を利用するため、カーネルのバージョンに強く依存したり、追加でドライバーの導入を求められるようなアプリケーションの稼働はできない可能性があります。

3.2. イメージ

コンテナのイメージを作成するには、空のファイルシステムの中にホスト側とは別のOS環境を展開し、必要なランタイムとアプリケーションの環境を構築します。そうしてできたファイルシステムを、個別にファイルとして保存したりネットワーク上のリポジトリから取得できるようにします。

Singularity のイメージは SIF(Singularity Image Format)と呼ばれる形式の単一ファイルで構成されます。そのため、ユーザーはアプリケーションがランタイムごとインストールされたイメージを1ファイルで持つことができ、保存や転送などのハンドリングが直感的で容易です。

一方で、Singularity はイメージを SIF 形式で作成することが必須というわけではありません。他の形式で保存されたコンテナイメージを直接実行させることもできます。

3.3. 実行

基本的にコンテナの起動とは、イメージを展開してマウントし、アプリケーションの実行環境を整えるまでを指し、その中でアプリケーションを起動することとは別の意味合いを持ちます。しかし Singularity は、コンテナの起動とアプリケーションの起動を統合してしまい、コンテナを使っていることを意識せず、まるでスタティックリンクされたバイナリを扱うかのように実行することができます。

Singluarity を用いてコンテナ内でアプリケーションを実行する方法には、以下があります。

  1. コンテナ起動時にシェルを起動し、手動で操作を行う。

  2. イメージ内の任意のコマンドをコンテナの起動と同時に実行する。

  3. コンテナの起動と同時に、イメージに事前に設定されたコマンドが実行されるようにする。

  4. コンテナのみを起動しておき、外部から指定したコンテナに対してコマンドを投入する。

「富岳」をはじめとしたバッチ処理環境では、検証などを除けば2番目と3番目での実行方法をとることになるのでしょう。4番目は多数のデータの処理に同じ環境を何度も繰り返し使う場合や、 Jupyter Notebook 等のサービスを立ち上げて外部からそれにアクセスするような使い方となります。