ジョブの投入方法(jsub)

(最終更新日: 2024/12/3 ステップジョブのメールについて注意追加)

ジョブの投入は jsub コマンドを使って行います。必要なインプットファイルは scp, sftp を用いて ccfep 上に配置するなどしてください。(scp, sftp に関してはクイックスタートガイドの情報をご確認ください。)

なお、Gaussian ジョブについては g16sub/g09sub という専用コマンドを用意しております。Gaussian を使う場合は、まず g16sub/g09sub の方をご検討ください。(一応 jsub でも投入は可能ですが面倒です)

基本的な実行方法

後述するジョブスクリプト(job.sh)を用意した上で ccfep にて以下のように実行します。(実際に入力するのは $ より後の jsub job.sh の部分だけです。)正常に実行できれば、ジョブの ID とサーバ名が表示されます。

$ jsub job.sh
6169323.ccpbs1
$

jsub コマンド自体の実行はすぐに終了しますが、投入されたジョブがすぐに実行されるとは限りません。混雑時などにはしばらく待つ必要があります。投入したジョブは ccfep からログアウトした後も残ります。

表示された数字のジョブのID(上記例では 6169323)はジョブを削除したりする場合に必要になります。ただし、jsub の実行時に表示されたものを常に覚えておく必要まではありません。通常は投入後に jobinfo コマンドで表示されるものを確認する程度で十分です。

キューの指定は不要ですが、jsub -q H job.sh のように H キューを指定しても問題ありません。

jsub コマンドのオプションについては jsub --help を実行することで確認できます。投入されたジョブの状況については jobinfo コマンドで確認することができます。投入済のジョブを取り消したい、強制的に終了させたい場合は jdel コマンドを使います。

ジョブスクリプトの作成

RCCS で導入したアプリケーションで、ジョブとして実行することを想定されるものについてはジョブスクリプトのサンプルを用意しています。その標準的な置き場所などについては、サンプルジョブの実行方法のページを参照ください。独自のアプリを実行する場合にこれらサンプルをジョブスクリプトのテンプレートとして利用することもできるかもしれません。

以下に一例として 32 MPI 並列、個々のプロセスでは OpenMP で 2 並列を行うジョブのジョブスクリプトを示します。ジョブは最大で 24 時間実行することにします。実行するプログラムは自身でビルドした my-program で、RCCS の用意した Open MPI 4.1.6 を使います。(以下のサンプルで ⇐ で示した注釈部分を実際のファイルに書くとエラーになりますので、書かないようにお願いします。)

#!/bin/sh   ⇐ 1 インタープリター(shebang)の指定
#PBS -l select=1:ncpus=64:mpiprocs=32:ompthreads=2  ⇐ 2 リソースの指定
#PBS -l walltime=24:00:00  ⇐ 3 計算時間指定
                           ⇐ 4 オプションパラメータを指定可能

# ジョブ投入時の作業ディレクトリへ移動します。(推奨; 状況によっては省略可能)
# 計算ホストでのジョブ実行開始時点では通常ホームディレクトリが作業ディレクトリになります
# このコマンドを実行することでジョブ投入時のディレクトリに移動できます
cd ${PBS_O_WORKDIR}

# 必要であれば module 等の環境設定を行います
module -s purge
module -s load openmpi/4.1.6

# 以下、計算を実行するために必要な設定を追加します
export PATH="/home/users/${USER}/bin:$PATH"

INPUT=myinp.inp
OUTPUT=myout.out

# そしてプログラムを実行します。
mpirun -np 32 my-program -i ${INPUT} -o ${OUTPUT}

1 - インタープリター(shebang)の指定(必須)

スクリプトのインタープリター(shebang)を指定します。通常は以下のいずれかを指定することになるかと思います (sh/bash, csh/tcsh, zsh にそれぞれ対応します)。

  • #!/bin/sh
  • #!/bin/csh -f
  • #!/bin/zsh

このインタープリターの指定は必須です。

2 - リソースの定義(select; 必須)

キューの構成や CPU 点数の係数についてはこちらのページを確認ください
このヘッダー部分のサンプルについては、こちらのページにもいくつか例を掲載しています

select 文では CPU コア数、MPI 並列数、OpenMP 並列数、GPU 数を指定します。メモリの大きなノードを使う場合もここで指定が必要です。(行頭の#PBS -l も必須です。)基本的な書式は以下のようになります。

#PBS -l select=(ノード数):ncpus=(CPUコア数):mpiprocs=(MPI並列数):ompthreads=(OpenMP並列数)[:ngpus=(GPU数)][:jobtype=largemem]

ノード数について

  • ncpus=1-63 で GPU を使わない場合(jobtype=core 相当)はノード数は常に 1 です。
  • ncpus=64 もしくは 128 の時(jobtype=vnode 相当)、ノード数は 1 以上の数字となります。利用するCPUコア数は (ノード数)*(CPUコア数) となります。
  • ngpus が 1 以上の場合(jobtype=gpu 相当)、ノード数は 1 以上の数字となります。利用するCPUコア数は (ノード数)*(CPUコア数) で、利用する GPU数は (ノード数)*(GPU数) です。

select= の直後に入力するノード数以外の情報についてはノードあたりの数字になります。mpiprocs の値は MPI の machine file の指定と関係します。ompthreads の値は環境変数 OMP_NUM_THREADS に相当する意味となります。

  • ncpus= では利用するノードあたりの CPU コア数を指定します。指定できる数字は 1-64 と 128 です。
  • mpiprocs= ではノードあたりの MPI 並列数を指定します。通常は mpiprocs * ompthreads の値が ncpus と一致するようにします。
  • ompthreads= では各プロセスの OpenMP 並列数を指定します。通常は mpiprocs * ompthreads の値が ncpus と一致するようにします。OpenMP 以外のスレッド並列の場合はこの値は無視されます。
  • ジョブで使用できるメモリ量は ncpus= で指定した CPU コア数に比例します。jobtype=largemem 指定時は 7.875 GB/コア で、それ以外の場合は 1.875 GB/コア です。キュー情報のページも参照してください。

MPI ライブラリのビルド方法によってはキューイングシステムから提供される machine file を正しく考慮できない可能があります。その場合は環境変数 PBS_NODEFILE で指定されているファイルを machine file (host file)として使う必要があります。RCCS で用意している MPI ライブラリは暗黙的にキューイングシステムが提供する machine file を考慮できるようになっています。

  • GPU を使う場合は ngpus= で利用する GPU 数を指定することができます。なお、GPU あたりの CPU コア数(ncpus/ngpus)は 16 以下である必要があります。また、1ノードあたりの GPU 数が 8 であるため、ngpus の値は 1-8 の値となります。

# 32 CPU コア、2 GPU の指定例
#PBS -l select=1:ncpus=32:mpiprocs=2:ompthreads=16:ngpus=2

  • メモリが約 1 TB ある Type F ノードを使いたい場合は jobtype=largemem を指定します。Type F は全部で 14 ノードしかないため非常に混雑します。できるだけ通常の Type C ノードを使うようにしてください。なお、Type F ノードは GPU を搭載していないため、jobtype=largemem 指定時は ngpus を指定できず、ncpus の値も 64 か 128 となります。

# jobtype=largemem の指定例(2 ノード、合計 256 コア)
#PBS -l select=2:ncpus=128:mpiprocs=64:ompthreads=2:jobtype=largemem

3 - 計算時間の指定(walltime; 必須)
#PBS -l walltime=(時間):(分):(秒)

の書式で計算時間を指定します。walltime=30:00 のように書いた場合は 30 時間ではなく、30 分で指定されてしまいます。ご注意ください。

ジョブで消費される CPU 点数はここで指定した時間(walltime)ではなく、実際に実行した時間(elapsed time)から計算されます。そのため、ある程度は余裕を持って時間を指定していただいて大丈夫です。ただし、長い時間を指定すると特に混雑時にジョブが入りにくくなりますので、あまりに長い時間を指定しないようお願いします。

次回のメンテナンス開始までに終了しないジョブについては次回メンテナンス終了後まで実行されません(この場合 jsub は warning を出力します。)しかし、別の言い方をすると、長いジョブをメンテナンスの前にあらかじめジョブを投入しておけば、そのジョブはメンテナンス後すぐに実行開始されます。

特殊な利用方法について