以下の表に示すApptainer を利用することができます。 OSに付属するパッケージとして提供されているため、モジュールファイルによる環境設定は不要です。
バージョン | モジュールファイル名 | システムA | システムB/C | システムG | クラウドシステム | 備考 |
---|---|---|---|---|---|---|
1.1.9 | none | + | + | + | + | 旧名称:singularity |
+ : すべてのユーザが利用可能
- : 利用不可
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.で作成したジョブスクリプトを用いてジョブ投入.
$ sbatch test.sh
Submitted batch job {jobid}
実行結果確認.
$ 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をインストールしたコンテナイメージを作ります.
コンテナを生成するためのレシピファイルを作成し,ubuntu22_tensorflow.def
として保存する.
Bootstrap: docker
From: ubuntu:22.04
%post
apt-get update
apt-get install -y python3 python3-pip
pip3 install tensorflow
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
動作確認
## コンテナを起動する
$ 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'
Apptainerのコンテナイメージを保存するディレクトリへ移動する
$ cd container_image
DockerHubからコンテナイメージをダウンロードし,ビルドする
$ apptainer build lolcow.sif docker://godlovedc/lolcow
INFO: Starting build...
Getting image source signatures
(中略)
INFO: Creating SIF file...
INFO: Build complete: lolcow.sif
コンテナイメージが作成されていることを確認
$ ls lolcow.sif
lolcow.sif
DockerHubで公開されているopenfoam を使用した動作例です。 実行の際には、openfoamに付属するデータを用いています。 あくまで動作確認をした一例ですので、実施したい内容に応じて必要な準備をや読み替えを行ってください。
Apptainerのコンテナイメージを保存するディレクトリへ移動する
$ cd container_image
DockerHubからコンテナイメージをダウンロードし,ビルドする
$ apptainer build openfoam10-paraview510.sif docker://openfoam/openfoam10-paraview510
(略)
INFO: Creating SIF file...
INFO: Build complete: openfoam10-paraview510.sif
テストデータのコピー
$ 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/
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;
#!/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
$ sbatch jobscript.sh