Apptainer

以下の表に示すApptainer を利用することができます。 OSに付属するパッケージとして提供されているため、モジュールファイルによる環境設定は不要です。

バージョン モジュールファイル名 システムA システムB/C システムG クラウドシステム 備考
1.1.9 none + + + + 旧名称:singularity

+ : すべてのユーザが利用可能
- : 利用不可

  1. ubuntu.sif というコンテナイメージを用いて,ハイブリッド並列を行うプログラム(a.out)を実行するための,ジョブスクリプト(test.sh)を作成します
    #!/bin/bash
    #============ Slurm Options ===========
    #SBATCH -p gr19999b             # ジョブキュー(パーティション)の指定。投入したいキュー名に適宜変更が必要。
    #SBATCH -t 1:00:00              # 経過時間の指定(1時間を指定する例)。
    #SBATCH --rsc p=2:c=40          # 要求リソースの指定(2プロセス,40コアを使用するハイブリッド並列の例)。
    #SBATCH -o %x.%j.out            # ジョブの標準出力ファイルの指定。%xはジョブ名、%j はジョブIDに置換されます。
    #============ Shell Script ============
    set -x
    ## GPUを使わない場合
    srun apptainer exec --bind `pwd`,/opt/system,/usr/lib64 --env LD_LIBRARY_PATH=/usr/lib64 ubuntu.sif ./a.out
    ## GPUを使う場合(--nvを付加することでGPU対応になる)
    srun apptainer exec --nv --bind `pwd`,/opt/system,/usr/lib64 --env LD_LIBRARY_PATH=/usr/lib64 ubuntu.sif ./a.out

オプション 意味 実行例
--bind MOUNT_DIR マウントするディレクトリを指定 --bind /LARGE0,LARGE1,/opt/system,/usr/lib64
--env ENVIRONMENT 環境変数を指定 --env LD_LIBRARY_PATH=/usr/lib64
--nv GPUを使用する場合に追記 --nv
  1. 1.で作成したジョブスクリプトを用いてジョブ投入.

    $ sbatch test.sh
    Submitted batch job {jobid}
  2. 実行結果確認.

    $ cat test.sh.{jobid}.out
    ================ Slrum Info ================
    DATE      = 2023-03-08T14:38:10+09:00
    PARTITION = gr19999d
    JOB_ID    = {jobid}
    JOB_NAME  = test.sh
    NNODES    = 1
    RSC_OPT   = p=1:t=8:c=8:m=8G
    ============================================
    _________
    < hello!! >
    ---------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ここでは,ubuntu22.04のdockerイメージをベースパッケージとして python3とtensorflowをインストールしたコンテナイメージを作ります.

  1. コンテナを生成するためのレシピファイルを作成し,ubuntu22_tensorflow.def として保存する.

    Bootstrap: docker
    From: ubuntu:22.04
      
    %post
    apt-get update
    apt-get install -y python3 python3-pip
    pip3 install tensorflow
  2. 1.で生成したレシピファイル(ubunutu22_tensorflow.def)を使用して,コンテナイメージのビルドを実行する.コンテナイメージは.ubuntu22_tensorflow.sif として保存する.

    $  apptainer build --fakeroot {コンテナイメージの保存先} {コンテナイメージを生成するためのレシピファイル}
     
    (例)
    $ apptainer build --fakeroot ~/ubuntu22_tensorflow.sif ubuntu22_tensorflow.def
    INFO:    Starting build...
    Getting image source signatures
    (中略)
    INFO:    Creating SIF file...
    INFO:    Build complete: ubuntu22_tensorflow.sif
    • コンテナイメージの保存先は,ホームディレクトリ配下に設定して下さい. 保存先を大容量ディスクにするとコンテナイメージのビルドに失敗します.
  3. 動作確認

    ## コンテナを起動する
    $ apptainer shell ~/ubuntu22_tensorflow.sif
     
    ## Python3を立ち上げる
    Apptainer> python3
    Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
     
    ## Tensorflowの動作確認
    >>> import tensorflow as tf
    >>> tf.__version__
    '2.11.0'

  1. Apptainerのコンテナイメージを保存するディレクトリへ移動する

    $ cd container_image
  2. DockerHubからコンテナイメージをダウンロードし,ビルドする

    $ apptainer build lolcow.sif docker://godlovedc/lolcow
    INFO:    Starting build...
    Getting image source signatures
    (中略)
    INFO:    Creating SIF file...
    INFO:    Build complete: lolcow.sif
    • Build failed となった場合は,再度ビルドをお試しください.
  3. コンテナイメージが作成されていることを確認

    $ ls lolcow.sif
    lolcow.sif

DockerHubで公開されているopenfoam を使用した動作例です。 実行の際には、openfoamに付属するデータを用いています。 あくまで動作確認をした一例ですので、実施したい内容に応じて必要な準備をや読み替えを行ってください。

  1. Apptainerのコンテナイメージを保存するディレクトリへ移動する

    $ cd container_image
  2. DockerHubからコンテナイメージをダウンロードし,ビルドする

    $ apptainer build openfoam10-paraview510.sif docker://openfoam/openfoam10-paraview510
    (略)
    INFO:    Creating SIF file...
    INFO:    Build complete: openfoam10-paraview510.sif
  3. テストデータのコピー

    $ cp -a /opt/system/app/openfoam/10/intel-2022.3-impi-2022.3/OpenFOAM-10/tutorials/basic/scalarTransportFoam/pitzDaily . 
    $ cd pitzDaily
    $ mkdir -p resources/blockMesh
    $ cp -a /opt/system/app/openfoam/10/intel-2022.3-impi-2022.3/OpenFOAM-10/tutorials/resources/blockMesh/pitzDaily resources/blockMes/
  4. MPI並列のために system/decomposeParDict ファイルを以下の内容で新規保存する。

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  10
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    format      ascii;
    class       dictionary;
    note        "mesh decomposition control dictionary";
    object      decomposeParDict;
}

numberOfSubdomains  2;
method          scotch;
  1. ジョブスクリプトを作成する
#!/bin/bash
#============ SBATCH Directives =======
#SBATCH -p gr19999b       # ご利用可能なキューを指定してください
#SBATCH -t 1:00:00        # 経過時間の制限を1時間に指定
#SBATCH --rsc p=2:c=1     # 2プロセス分の資源要求(2プロセス×1コア)
#SBATCH -o %x.%A.out      # 標準出力の出力先

#============ Shell Script ============

# 概要:
#   ホスト側にインストールされているopenmpi をコンテナ側でも参照できるようにすることで、
#   infiniband および slurm に対応したmpi 実装を用いて、コンテナを介したopenfoam を並列実行する。
# 
#
# apptainer のオプションの補足
#   --bind :
#     /opt/system/app             # ホスト側に導入されているopenmpi を使うために、コンテナ側でマウントする。
#     /usr/lib64:/usr/lib64/host  # ホスト側のアプリ(今回はopenmpi)を動作させるための必須ライブラリがあるディレクトリをコンテナ側でマウントする。
#                                 # コンテナ内のローカルライブラリと競合を避けるためにマウント先を /usr/lib64/host を指定してマウントする。
#   --env 
#     LD_LIBRARY_PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib64/host 
#     # openfoam のコンテナ内に openmpi が同梱されているため、ホスト側のmpiを優先するために、/opt/system/app/openmpi/4.0.5/gnu-8.5.0/lib を先頭に設定している。
#     # 2,3番目に、コンテナ内のアプリを正常に動作させるために、ubuntu のローカルライブラリをこの位置に設定する。
#     # 4番目に、openmpiが依存するinfiniband 関係のライブラリを認識させるために、/usr/lib64/host を最後に設定する。
#     # ホストとコンテナの状況に応じてライブラリの競合が発生しないように考慮が必要。
#
#     PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/bin:/opt/openfoam10/bin:/usr/bin:/bin \
#     # コマンドラインで認識させたいコマンドのあるPATH を追加している。絶対PATHで利用するなら設定不要。
#     # この例では、ホスト側の openmpi をPATHの先頭に追加し最優先させた上で、コンテナ内の openfoam および/usr/bin, /bin を設定している。
#

# blockMesh を1並列で実行
srun -n 1 apptainer exec  \
   --bind /opt/system/app,/usr/lib64:/usr/lib64/host  \
   --env LD_LIBRARY_PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib64/host \
   --env PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/bin:/opt/openfoam10/bin:/usr/bin:/bin \
   ../openfoam10-paraview510.sif  \
   foamExec  blockMesh -dict resources/blockMesh/pitzDaily

# cecomposePar を1並列で実行
srun -n 1 apptainer exec  \
   --bind /opt/system/app,/usr/lib64:/usr/lib64/host  \
   --env LD_LIBRARY_PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib64/host \
   --env PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/bin:/opt/openfoam10/bin:/usr/bin:/bin \
   ../openfoam10-paraview510.sif  \
   foamExec  decomposePar

# scalarTransportFoam を実行(slurm の --rsc で指定した並列数で起動)
srun apptainer exec  \
   --bind /opt/system/app,/usr/lib64:/usr/lib64/host  \
   --env LD_LIBRARY_PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib64/host \
   --env PATH=/opt/system/app/openmpi/4.0.5/gnu-8.5.0/bin:/opt/openfoam10/bin:/usr/bin:/bin \
   ../openfoam10-paraview510.sif  \
   foamExec  scalarTransportFoam -parallel
  1. ジョブ投入する
$ sbatch jobscript.sh