コンテナの利用

この章ではコンテナの利用方法を説明します。

データ解析システムではワークサーバとLSFのバッチジョブでコンテナ環境であるApptainerが利用可能です。

Info

KEKCC の Singularity は 2023/6/14 に Apptainer へ置き換わりました。


Note

一般的なApptainerの使い方は以下のリンクをご参照ください。
Link to "Apptainer User Guide"


コンテナイメージ作成環境の準備

コンテナイメージの作成には管理者(root)権限が必要です。そのため利用するイメージをApptainerが導入された別のシステムで作成し、ワークサーバに転送する必要があります。

Note

Apptainerを導入する手順は以下のリンクをご参照ください。Linux、Windows、Macに導入することができます。
Link to "Installing Apptainer"


コンテナイメージの作成

Apptainerを導入したシステムでコンテナイメージを作成します。イメージの作成には定義ファイルの利用が便利です。 以下は、Docker Hubからダウンロードした最新版CentOSのイメージを元に、開発環境やmoduleコマンドが利用可能なイメージを作成する定義ファイルの例(ファイル名:centos7.def)です。

Note

moduleコマンドについてはこちらのページをご参照ください。


# cat centos7.def
Bootstrap: docker
From: centos:7

%post
    yum groupinstall -y 'Development Tools'
    yum -y install \
    environment-modules \
    which

以下のコマンドでコンテナイメージ(ファイル名:centos7.sif)を作成します。

# apptainer build centos7.sif centos7.def

SIF形式のイメージファイルは内容を変更することができません。ファイルの追加などが必要な場合は代わりに以下のコマンドで一旦sandbox形式にします。

# apptainer build --sandbox --fix-perms centos7 centos7.def

この例ではカレントディレクトリに"catnos7"というディレクトリが出来ます。そのディレクトリ配下にファイルを追加します。 また、以下のコマンドでコンテナ内でシェルを起動することができます。

# apptainer shell --writable centos7
Apptainer>

"Apptainer>"はコンテナ内で起動したシェルのプロンプトです。yumコマンドでのパッケージの追加などが可能です。

Note

使用できるコマンドはコンテナのLinuxディストリビューションに依存します。


内容の変更が終わったらexitでコンテナのシェルを終了し、以下のコマンドでsandbox形式をSIF形式に変換します。

# apptainer build centos7.sif centos7

作成されたSIFファイルをscp等でワークサーバに転送します。

コンテナで実行するプログラムのコンパイル

上記手順で用意したコンテナイメージを使用してプログラムをコンパイルする例を紹介します。 ここではIntelコンパイラとIntel MPIを使用してIntel MPI Benchmarksをコンパイルします。

Note

Intel MPI Benchmarksのソースは以下のリンクから入手可能です。
Link to "Intel MPI Benchmarks"


入手したアーカイブをワークサーバのホームディレクトリ配下で展開します。

$> tar xf IMB-v2019.6.tar.gz
$> cd mpi-benchmarks-IMB-v2019.6

以下のコマンドでコンテナのシェルを起動します。

$> apptainer shell --bind /opt,/opt/Modules/modulefiles /path/to/centos7.sif

"apptainer shell"で起動されたコンテナのシェルでは以下がそのまま引き継がれ利用可能です。

  • ユーザID
  • ホームディレクトリ
  • カレントディレクトリ

また"--bind"オプションを使用して、指定したディレクトリをコンテナからも利用可能にすることができます。 上記例ではIntelコンパイラとIntel MPIを使用するために/optを、moduleコマンドを使用するために/opt/Modules/modulefilesをそれぞれ指定しています。

コンテナのシェルで以下のコマンドを実行しIntel MPI Benchmarksをコンパイルします。

Apptainer> source /usr/share/Modules/init/bash
Apptainer> module load intel/2020
Apptainer> export LANG=C
Apptainer> make IMB-MPI1
Apptainer> ls IMB-MPI1
IMB-MPI1
Apptainer> exit

コンテナを使用したLSFジョブの実行

上記でコンパイルしたプログラム"IMB-MPI1"をLSFのジョブとして実行する例を紹介します。

Note

LSFのジョブを実行する方法について詳しくはこちらのページを参照してください。


実行するジョブの内容は以下の通りです。

  • ジョブ名: apptainer
  • バッチキュー: b2_a
  • スロット数(コンテナの数): 4
  • 計算サーバの台数: 2
  • MPIライブラリ: Intel MPI
  • 計算サーバ間のインターコネクト: InfiniBand

以下の3つのシェルスクリプトを作成します。

  • submit.sh: bsubコマンドを実行するスクリプト
  • runjob.sh: MPIジョブとしてApptainerを起動するスクリプト
  • imb.sh: コンテナでIMB-MPI1を実行するスクリプト

各スクリプトの内容は以下の通りです。

$> cat submit.sh
#!/bin/sh

JOBNAME=apptainer
NP=4

bsub -q b2_a -n $NP -R span[ptile=2] -J $JOBNAME -o ${JOBNAME}.outfile ./runjob.sh $NP
  • -R span[ptile=2]: 1台の計算サーバで2スロット使用するオプションです。
$> cat runjob.sh
#!/bin/sh

NP=$1
module load intel/2020

mpirun -n $NP apptainer exec \
--bind \
/usr/lib64:/usr/lib64/ofed,\
/etc/libibverbs.d,\
/opt \
centos7.sif ./imb.sh
  • module load intel/2020: Intel MPIを使用するためのmoduleコマンドです。
  • mpirun -n $NP apptainer: apptainerコマンドをMPIジョブとして実行します。
  • apptainer exec ... ./imb.sh: コンテナ内で"imb.sh"を実行します。
  • --bind: Intelコンパイラ、Intel MPI、InfiniBandのライブラリがコンテナから参照できるようにします。
  • /usr/lib64:/usr/lib64/ofed: 計算サーバの/usr/lib64がコンテナ内で/usr/lib64/ofedとして参照できるようにします。

Warning

"--bind /usr/lib64:/usr/lib64/ofed"ではなく"--bind /usr/lib64"と指定した場合、コンテナの本来の/usr/lib64が参照できなくなるため、コマンドが正常に動作しなくなります。


$> cat imb.sh
#!/bin/sh

export LANG=C
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64:/usr/lib64/ofed:/opt/intel20/compilers_and_libraries_2020.1.217/linux/mpi/intel64/libfabric/lib
export I_MPI_FABRICS=shm:ofi
export I_MPI_DEBUG=1
./IMB-MPI1 pingpong
  • export LD_LIBRARY_PATH: Intelコンパイラ、Intel MPI、InfiniBandを使用するために指定します。

Warning

環境変数LD_LIBRARY_PATHの指定で"/usr/lib64/ofed"より前に"/usr/lib64"を指定して、コンテナの本来のライブラリが先に参照されるようにしてください。


  • export I_MPI_FABRICS=shm:ofi: 計算サーバ間のインターコネクトにInfiniBandを指定します。
  • export I_MPI_DEBUG=1: Intel MPIで使用しているインターコネクトを確認する場合に指定します。
  • ./IMB-MPI1 pingpong: Intel MPI BenchmarksでPingPongのテストを実行します。

Info

環境変数I_MPI_DEBUGを1以上に設定した場合、ジョブの出力ファイルにIntel MPIのデバッグ情報が出力されます。InfiniBandを使用している場合は以下の行が出力されます。"mlx"がInfiniBandを意味します。
[0] MPI startup(): libfabric provider: mlx


以下のコマンドでスクリプトを実行可能にします。

$> chmod +x submit.sh runjob.sh imb.sh

以下のコマンドでジョブを投入します。

$> ./submit.sh 

bjobsコマンドでジョブが終了したことを確認後、カレントディレクトリの"apptainer.outfile"にジョブの結果が出力されていることを確認します。