ジョブ利用

最終更新日:2024年7月9日


玄界のノードグループ A、Bおよび Cの各計算ノードは、ログインノードと違い、多数の利用者からの利用要求に対して資源を割り当てるジョブ管理システムによって管理されています。そのため、これらのノードでプログラムを実行するには、最初にジョブという形で利用要求を投入する必要があります。ここでは、このジョブによる各ノードグループの利用方法を紹介します。


ジョブの種類

玄界では、以下に示す二つのジョブを実行できます。

ジョブ形式 用途
バッチジョブ 予め処理手順を記述したスクリプトによりジョブを投入する、バッチ形式の実行。対話的な利用はできない。
対話型ジョブ 計算ノードにログインして利用する、対話的な実行。主に短時間のデバッグやプリポスト処理での利用を想定している。

さらにバッチジョブには以下の三種類の形態があります。

バッチジョブ種別 用途
通常ジョブ 一つのスクリプトを投入し、一つのジョブを実行する。
ステップジョブ 複数のスクリプトを一つのまとまりとして投入し、指定した順序で実行する。
バルクジョブ 一つのスクリプトを投入し、複数の通常ジョブを生成して実行する。

バッチジョブの流れ

バッチジョブによりプログラムを実行するためには一般に以下のような手続きを踏みます。

  • ジョブ操作コマンド
  • ジョブ処理用スクリプトの作成
  • ジョブの投入(pjsubコマンド)
  • (必要に応じて) ジョブ処理状況の確認(pjstatコマンド)
  • (必要に応じて) 実行中、もしくは、実行待ちのジョブ削除(pjdelコマンド)
  • 結果の確認
  • ノードの使用量の確認

ジョブ操作コマンド

ジョブ操作に使用するコマンドは以下の通りです。

機能 コマンド
ジョブ投入 pjsub
ジョブ状態参照 pjstat
ジョブ削除 pjdel
ノードグループの混雑状況確認 pjshowrsc

ジョブ投入 (pjsubコマンド)

ジョブは形式に応じて以下のいずれかで投入することができます。なお、いずれの形式も、大容量ストレージ (/home) または高速ストレージ (/fast) の中で投入してください。

  • バッチジョブ形式
$ pjsub オプション ジョブスクリプトファイル
  • 対話型ジョブ形式
$ pjsub --interact オプション 

バッチ処理用スクリプトの作成

基本オプション

オプション名 説明
-r 予約ポータルで指定したIDを指定
-o filename 標準出力をファイルfilenameに出力
-e filename 標準エラー出力をファイルfilenameに出力
-j ジョブの標準エラー出力と標準出力を同じファイルに出力する
–interact 対話型ジョブとして実行する
–restart 障害発生時にジョブを再実行する
–norestart 障害発生時にジョブを再実行しない(デフォルト)
–mail-list mailaddress メールの送信先を指定
-m メール通知を指定
-m b バッチジョブ開始時にメール通知
-m e バッチジョブ終了時にメール通知
-m r ジョブ再実行時にメール通知
-X ジョブ投入時の環境変数をジョブ実行環境に継承

バッチジョブ資源オプション

バッチジョブ処理に必要な資源に関する主要オプションは以下の通りです。 -Lに続けて利用資源または上限値を指定します。

オプション名 説明
-L rscgrp=name ジョブを投入するリソースグループ(キュー)名(詳細は、リソースグループ))
-L node ノード数の指定(1ノード以上の資源を使用する場合に必須)
-L vnode-core コア数の指定(ノードグループAで1ノード未満の資源を利用する場合に必須)
-L gpu GPU数の指定(ノードグループB,Cで1ノード未満の資源を利用する場合に必須)
-L elapse ジョブの実行時間の上限を指定
-L proc-core= プロセス単位の最大コアファイルサイズリミットを指定(デフォルト:0、最大: unlimited)
-L proc-data プロセス単位の最大データセグメントサイズリミットを指定(デフォルト: unlimited)
-L proc-stack プロセス単位の最大スタックセグメントサイズリミットを指定。RHEL の仕様により unlimited 設定の場合、実際の設定値は 2MiB となります。 (デフォルト: unlimited)
-L jobenv ジョブ環境を指定します。Singularity を使用する場合は、jobenv=singularity を必ず指定します。

統計出力オプション

オプション名 説明
-s 投入したジョブの統計情報を出力 (-S オプションと併用は不可)
-S 投入したジョブのノード情報を含む統計情報を出力 (-s オプションと併用は不可)

ジョブスクリプトの例

ノードグループAの逐次ジョブ

以下のジョブを実行するためのジョブスクリプトの例です。なお、この例では Intel oneAPIでコンパイルしたプログラムを実行することを想定しています。

資源指定項目 指定内容
リソースグループ a-batch
CPUコア数 1
経過時間 1時間
標準エラー出力も標準出力に出力 あり
#!/bin/sh
#PJM -L rscgrp=a-batch
#PJM -L vnode-core=1
#PJM -L elapse=1:00:00
#PJM -j

module load intel
./a.out

ノードグループAのスレッド並列ジョブ

以下のジョブを実行するためのジョブスクリプトの例です。なお、この例では Intel oneAPIでコンパイルしたプログラムを実行することを想定しています。

資源指定項目 指定内容
リソースグループ a-batch
CPUコア数 30
スレッド数 30
経過時間 1時間
標準エラー出力も標準出力に出力 あり
#!/bin/sh
#PJM -L rscgrp=a-batch
#PJM -L vnode-core=30
#PJM -L elapse=1:00:00
#PJM -j

module load intel
export OMP_NUM_THREADS=30
./a.out

ノードグループAのハイブリッド並列ジョブ

以下のジョブを実行するためのジョブスクリプトの例です。なお、この例では Intel oneAPIと Intel MPIでコンパイルおよびリンクしたプログラムを実行することを想定しています。

資源指定項目 指定内容
リソースグループ a-batch
使用ノード数 4
ノード当たりプロセス数 10
プロセス当たりスレッド数 12
経過時間 1時間
標準エラー出力も標準出力に出力 あり
#!/bin/sh
#PJM -L rscgrp=a-batch
#PJM -L node=4
#PJM -L elapse=1:00:00
#PJM -j

module load intel
module load impi
export OMP_NUM_THREADS=12
mpiexec -np 40 -ppn 10 ./a.out

ノードグループBの 1GPUジョブ

以下のジョブを実行するためのジョブスクリプトの例です。なお、この例では CUDAでコンパイルしたプログラムを実行することを想定しています。

資源指定項目 指定内容
リソースグループ b-batch
使用GPU数 1
経過時間 1時間
標準エラー出力も標準出力に出力 あり
#!/bin/sh
#PJM -L rscgrp=b-batch
#PJM -L gpu=1
#PJM -L elapse=1:00:00
#PJM -j

module load cuda
./a.out

ノードグループBの 2ノードジョブ

以下のジョブを実行するためのジョブスクリプトの例です。

資源指定項目 指定内容
リソースグループ b-batch
使用ノード数 2
使用GPU数 8
ノード当たりプロセス数 4
経過時間 1時間
標準エラー出力も標準出力に出力 あり
#!/bin/sh
#PJM -L rscgrp=b-batch
#PJM -L gpu=2
#PJM -L elapse=1:00:00
#PJM -j

module load gcc cuda cudnn nccl hpcx
mpiexec -n 8 -map-by ppr:4:node python3 pytorch_mnist.py

対話型ジョブによる実行

対話型ジョブを実行するには pjsubコマンドで --interactオプションを指定します。
以下にリソースグループ a-interで 1ノードを 1時間、対話型ジョブで利用する実行例を示します。

$ pjsub --interact -L rscgrp=a-inter,node=1,elapse=01:00:00
[INFO] PJM 0000 pjsub Job 82653 submitted.
[INFO] PJM 0081 .connected.
[INFO] PJM 0082 pjsub Interactive job 82653 started.
[ku01234567@a0001 test]$

バッチジョブの投入

バッチ処理用スクリプトファイルに記述された処理内容を pjsub コマンドを用いて依頼します。

$ pjsub go.sh
[INFO] PJM 0000 pjsub Job 1234 sunmitted.

この例では go.sh という名前で作成・保存されたファイルに記述された処理内容を依頼しています。例ではジョブID: 1234が割り振られています。


処理状況の確認

実行中・実行待ちの状況確認

投入したジョブの状態を確認するには以下のように pjstatコマンドを使用します。

$ pjstat
JOB_ID     JOB_NAME   MD ST  USER     START_DATE      ELAPSE_LIM            NODE_REQUIRE    VNODE  CORE V_MEM
82659      test2.sh   NM RNA ku400001 (07/01 15:25)   0000:20:00            8               -      -    -

ここで、JOB_IDはジョブ番号、STはジョブの現在の状態を表します。主なジョブの状態としては以下のようなものがあります。

表示 状態
QUE 待ち状態
RNA 実行開始中
RUN 実行中
RNO 実行終了中

履歴表示

以下のオプションにより過去xx日前(実行例では7日前)から現在までの実行履歴が確認できます。

$ pjstat -H day=7 -v
  • ジョブ終了のステータスは「PC」列に表示されます(0:正常終了, 1:キャンセル 等)
  • 各コード番号については "man pjstat"で確認できます。
  • メモリ使用超過が原因の場合ジョブ履歴「PC」列に “12” と出力されます。
  • 一定期間経過した過去の履歴は消去されます。

処理の終了したバッチジョブの統計情報

以下のオプションにより任意の終了したジョブID(実行例では1234)の統計情報を確認することができます。

$ pjstat -H -S 1234

バッチジョブの削除

pjdelコマンドにより実行中もしくは実行待ちのバッチジョブを取り消す(削除する)ことができます。 pjdelコマンドに続けてジョブIDを指定します(複数指定可能)。 実行中のバッチジョブの取り消しを行うと実行が中止されます。

$ pjdel 1234
[INFO] PJM 0100 pjdel Job 1234 canceled.

この例ではジョブID: 1234のバッチジョブの削除を依頼しジョブが正常にされたことがメッセージで示されています。


結果の確認

pjsubの-oオプションで出力ファイルを指定した場合には指定されたファイルに標準出力への結果が書き出されます。 指定がない場合には " [ジョブスクリプト名].[ジョブID].out" というファイルに出力されます。 一方、標準エラー出力は、-jオプションが指定された場合は標準出力と同じファイルに書き出されます。 -jオプションが指定されなかった場合、-eオプションで出力ファイルが指定された場合には指定されたファイルに書き出されます。
-oのどちらのオプションも指定されなかった場合、標準エラー出力は " [ジョブスクリプト名].[ジョブID].err"に書き出されます。


リソースグループの混雑状況確認

リソースグループの混雑状況は以下のように pjshowrscまたはshow_rscコマンドを使用します。

$ pjshowrsc --rg
[ CLST: genkai-clst ]
[ RSCUNIT: rscunit_pg01 ]
RSCGRP           NODE
                 TOTAL   FREE  ALLOC
a-batch           1000    999      1
a-inter           1000    999      1
a-reserve           10     10      0
b-batch             34     34      0
b-batch-mig          3      3      0
b-inter             34     34      0
b-inter-mig          3      3      0
b-reserve            4      4      0
c-batch              2      2      0
c-inter              2      2      0

$ show_rsc
                                      node              core               gpu
rscgrp                   mode         free    total     free    total     free    total
a-batch/a-inter          simplex       800      800        -        -        -        -
a-batch/a-inter          shared        199      222    23990    26640        -        -
b-batch/b-inter          simplex        30       30        -        -        -        -
b-batch/b-inter          shared          4        4        -        -       16       16
b-batch-mig/b-inter-mig  simplex         1        1        -        -        -        -
b-batch-mig/b-inter-mig  shared          2        3        -        -       56       84
c-batch/c-inter          simplex         1        1        -        -        -        -
c-batch/c-inter          shared          1        1        -        -        8        8

ステップジョブの実行

ステップジョブは、複数のバッチジョブを 1 つのまとまりとして扱い、その中で実行の順序関係や依存関係を指定
することで、ジョブチェイン機能を実現するジョブモデルです。ステップジョブは複数サブジョブから構成され、各サブジョブは同時に実行されることはありません。

ステップジョブの投入形式は以下のとおりです。

$ pjsub --step [--sparam "sn=stepno[,依存関係式]"] jobscript

ステップジョブ依存関係式

条件 説明
NONE 依存関係を示す
終了ステータス == value[,value,..]
value には任意の値を指定可能。「==」「!="」の場合は","(カンマ)を用いて、value を複数指定可能。
例:
ec==1,3,5 → 終了ステータスが 1,3,5 のいずれかであれば真。
ec!=1,3,5 → 終了ステータスが 1,3,5 のいずれでもない場合は真。
終了ステータス != value[,value,..]
終了ステータス > value
終ステータス >= value
終了ステータス < value
終ステータス <= value

ステップジョブ依存関係式で指定可能な削除タイプ

削除タイプ 説明
one 該当ジョブのみを削除します。
after 当該ジョブおよび当該ジョブに依存するジョブを再帰的に削除します。
all 当該ジョブ及び後続のすべてのジョブを削除します。

バルクジョブの実行

バルクジョブは、複数の同じバッチジョブを同時に投入し、実行するジョブです。例えば、ジョブのパラメタを変え
て、それぞれの実行結果を確認したい場合、通常のバッチジョブであれば、ジョブを 1 つ 1 つ投入する必要があり
ますが、バルクジョブを使えば、1 度に複数パターンの投入ができます。

バルクジョブの投入形式は以下のとおりです。

$ pjsub --bulk --sparam start-end jobscript

バルクジョブを実行する場合、サブジョブごとに設定されるバルク番号を用いてプログラムの入出力ファイルを変
更することが可能です。バルク番号は環境変数 PJM_BULKNUM で参照することが可能です。


8つのサブジョブが input.1~input.8 の入力ファイルをそれぞれ読み込み、出力ファイル output.1~output.8
をそれぞれ出力する

[username@genkai0001 ~]$ ls input.*
input.1 input 2 input.3 input.4 input.5 input.6 input.7 input.8
[username@genkai0001 ~]$ vi bulk.sh
#!/bin/sh
#------ pjsub option --------#
#PJM -L rscgrp=a-batch
#PJM -L node=1
#PJM -L elapse=1:00:00
#PJM -j
#------- Program execution -------#
./a.out < input.$PJM_BULKNUM > output.$PJM_BULKNUM
[username@genkai0001 ~]$ pjsub --bulk --sparam 1-8 bulk.sh
[INFO] PJM 0000 pjsub Job 12345 submitted.

関連情報

玄界のジョブ利用についての詳細は以下を参照してください。