バッチ処理(システムA)

バッチ処理形式で実行されるプログラムをジョブと呼びます.システムAでは,PBSジョブスケジューラを利用してジョブを制御しています.

PBSでは,キューと呼ばれる仮想的な入れ物でジョブを管理しており,システムにバッチ処理を依頼する際にはキューを指定する(キューにジョブを投入する)必要があります.スーパーコンピュータシステムでは,お申し込み頂いたサービスコースごとにキューを用意しておりますので,そのキューを使用してジョブを実行いただくことになります.

システムAでは,ジョブを実行する際に計算ノードを専有的に確保して計算を開始する仕様となっています.そのため,システムAでは68コアのCPUが最低でも確保されます.

ジョブスクリプトは,原則的にシェルスクリプトと同じ形式です.ジョブスクリプトはジョブ投入オプションを記述したオプション領域と,実行するプログラムを記述したユーザプログラム領域から構成されます.

$ cat sample.sh
#!/bin/bash
#============ PBS Options ============
#QSUB -q gr19999a
#QSUB -ug gr19999
#QSUB -W 2:00
#QSUB -A p=4:t=8:c=8:m=1355M
#============ Shell Script ============
aprun -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN ./a.out

ジョブスクリプトのオプション領域では,文の先頭に「#QSUB 」と記述し,その後ろにオプションを指定します.オプションについては, PBSオプション をご覧ください.

ジョブスクリプトの実行はqsubコマンドで行います.

なお,バッチ処理実行時は .bashrc等の設定ファイルは自動では参照されませんのでご注意ください.

ジョブスクリプトのサンプルを公開していますので,参考にしてください.

実行種別 サンプルファイル
逐次実行 ダウンロード
スレッド並列 ダウンロード
プロセス並列 ダウンロード
ハイブリッド並列 ダウンロード

lsf2pbsコマンドを利用することで,LSFの環境で使用していたジョブスクリプトのコマンドやオプション,環境変数をPBS向けに変換することができます.

書式:

lsf2pbs lsf_script [pbs_script]

実行例:

[b59999@camphor1 script]$ cat lsf.sh
#!/bin/bash
#QSUB -q gr19999b
#QSUB -A p=1:t=1:c=1:m=1G
#QSUB -W 12:00
#QSUB -rn
#QSUB -u kyodai.taro.1a@kyoto-u.ac.jp
#QSUB -B
#QSUB -N
#====command====
aprun -n $LSB_PROCS -d $LSB_THREADS -N $LSB_PPN ./a.out
#====command====

[b59999@camphor1 script]$ lsf2pbs lsf.sh pbs.sh

[b59999@camphor1 script]$ cat pbs.sh
#!/bin/bash
#QSUB -q gr19999b
#QSUB -A p=1:t=1:c=1:m=1G
#QSUB -W 12:00
#QSUB -r n
#QSUB -M kyodai.taro.1a@kyoto-u.ac.jp
#QSUB -m be
#====command====
aprun -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN ./a.out
#====command====

ジョブスクリプトのオプション領域に,PBSオプションを指定することでジョブの属性を設定することができます. -W オプションで経過時間上限値を設定しない場合,実行を開始してから1時間経過後にジョブが強制終了されますのでご注意ください. なお,PBSオプションは京大スパコン向けに一部カスタマイズを行っています.詳細はオリジナルのPBSとの差異を参照してください.

  • 主要オプション

主要オプションの機能は,前システムのLSFと同じです.

オプション 説明 指定例
-q QUEUENAME ジョブを投入するキューの指定 -q gr19999a
-ug GROUPNAME ジョブの実行グループの指定 -ug gr19999
-W HOUR : MINUTE 経過時間上限値の指定(単位は時:分) -W 6:0
-A p=procs:t=threads:c=cores:m=memory ジョブ割当リソース量の指定 -A p=4:t=8:c=8:m=2G

.

-A の引数 説明
p=procs ジョブ実行時の割当プロセス数.
t=threads ジョブ実行時のプロセスあたりの割当スレッド数. 環境変数 OMP_NUM_THREADS を自動で設定.
c=cores ジョブ実行時のプロセスあたりの割当CPUコア数. 基本的に t と同じ値を設定.
m=memory ジョブ実行時のプロセスあたりの割当メモリ量上限値(単位:M,G,T)
  • システムAでの-Aオプションのデフォルト値と最大値
オプション デフォルト値 最大値 備考
p 1 利用するキューの標準資源量まで(c=1,m=1355M以下の場合)
t 1 68 ハイパースレッディングを利用する場合は最大272
c 1 68
m 1355M 92160M (90G)
  • PBSの -A オプションの法則について

    • p の値はプロセス数を表します.

    • c の値は1プロセスあたりの割り当てコア数を表します.

    • t の値は1プロセスあたりの割り当てスレッド数を表します.

    • よって,消費する計算ノードのコア数は pとcの積 となります.(mの値がデフォルトの場合)

    • mの値をデフォルトより大きくした場合,それに比例してコア数を消費したと見なされます.具体的には以下の「ジョブ実行用に確保される計算リソースに関する注意」を参照ください.

    • cとmを両方ともデフォルトより大きくした場合は,使用コア数は,コア数をより多く要求するパラメータに合わせます.

      • p=1:t=4:c=4:m=2710M (=1355M x2)とした場合,cは4コア分を要求,mは2コア分を要求となり,結果1プロセスあたり4コア消費したと見なす.この指定では,プロセスは4コア使用するにも関わらずメモリを2コア分未満しか使えなくなりますので,特別な理由がない限り,mの値として 1355M x 4 = 5420M を指定して,メモリを使い切るべきでしょう
      • p=1:t=2:c=2:m=4065M (=1355M x3)とした場合,cは2コア分を要求,mは3コア分を要求となり,結果1プロセスあたり3コア消費したと見なす.

.

  • ジョブ実行用に確保される計算リソースに関する注意

PBSジョブスケジューラでは,CPUコアを実際に利用したかどうかに関わらず,ジョブ実行にあたって確保したCPUコアすべてを利用したものとみなします.たとえば,システムAで -A p=8:t=1:c=1:m=23040M と指定してジョブを実行した場合,1プロセスあたりメモリを上限値(92160M)の1/4使用することになり,メモリ容量の制約から1ノードあたりに4プロセスが割り当てられることとなります.このとき,ジョブが実際に利用するCPUコアは8個ですが,2ノードがジョブ実行用に確保されるため,136個のCPUコアを利用したものとみなされます.

このことから,例えばp=68を指定したときに68個のCPUコアを使用したと見なされるためには,mの値は90G/68=約1355M以下でなければいけません.これがmの値のデフォルト値となっています.

なお,システムAでは,計算ノードは単一のジョブが占有します.そのため,例えばジョブスクリプトの記述ではCPUコアを34個 (0.5ノード相当)要求した場合でも,実行時は68個 (1ノード分)を利用したものとみなされます.

  • その他のオプション
オプション 説明 指定例
-o FILENAME 標準出力を保存するファイル名の指定 -o result.out
-e FILENAME 標準エラー出力を保存するファイル名の指定 -e result.err
-M MAILADDR メールアドレスを指定する -M bar@sample.com
-m b ジョブ実行開始時にメールを受け取る -m b
-m e ジョブ完了時にメールを受け取る -m e
-m be ジョブ開始時と完了時にメールを受け取る    -m be
-r n 障害発生時のジョブ再実行の禁止を指定 -r n
-N JOBNAME ジョブの実行中の名称を変更 -N sample_job

  • オプションの意味の置き換えや追加

以下のオプションは,ユーザの利便性のためにオリジナルからの置き換えや追加を行っています.

オプション 種別 京大スパコンでの意味 オリジナルの意味
-ug 追加 ジョブの実行グループの指定 -
-W 置き換え 経過時間上限値の指定     ジョブ属性の設定など
-A 置き換え ジョブ割当リソース量の指定 ジョブに任意の説明文を付加
  • 禁止オプション

以下のオプションは,京大スパコンでは無効化しています.

オプション PBSオリジナルの意味 備考
-S ジョブ実行時のシェルを指定 京大スパコンでは専用のbashから変更不可
-C ジョブスクリプトの指示子を指定 京大スパコンでは#QSUBから変更不可
-a ジョブの実行開始時間を指定
-A ジョブに任意の説明文を付加 京大スパコンではジョブ割当リソース量の指定オプションに置き換え
-h ジョブをhold状態に設定
-k 標準出力・標準エラー出力ファイルを実行ホストに保持する
-u 実行ユーザーを指定
-c チェックポイントの設定
-G Windows端末から会話型GUIアプリを使用
-p ジョブの優先度を指定
-P ジョブの所属プロジェクトを指定

ジョブスクリプトのユーザプログラム領域では,環境変数の設定や参照が可能です. なお,PBS環境変数は,京大スパコン向けに一部カスタマイズを行っています.詳細はオリジナルのPBSとの差異を参照してください.

環境変数の設定にはexportコマンドを使用し,環境変数を参照する場合は変数名の先頭に「$」を付与して記述します.

  • 環境変数の設定

    #書式 環境変数名=値; export 環境変数名
    LANG=en_US.UTF-8; export LANG
  • 環境変数の参照

    echo $LANG

PBSでは,ジョブ実行時にいくつかの環境変数が自動で設定されます.自動で設定される環境変数のうち,代表的なものを以下に示します.

環境変数名 内容
QSUB_JOBID 当該ジョブのジョブID
QSUB_QUEUE ジョブを投入したキューの名称
QSUB_WORKDIR ジョブを投入したカレントディレクトリ
QSUB_PROCS ジョブ実行時の割当プロセス数
QSUB_THREADS ジョブ実行時のプロセスあたりの割当スレッド数
QSUB_CPUS ジョブ実行時のプロセスあたりの割当CPUコア数
QSUB_CPUS_ALLOC メモリ容量からCPUコアに換算した際のCPU数
QSUB_MEMORY ジョブ実行時のプロセスあたりの割当メモリ量上限値
QSUB_PPN ジョブ実行時のノード当たり配置プロセス数

京大スパコンでは,ユーザの利便性のため,一部オリジナルの環境変数からの追加,読み替えを行っています.

環境変数 種別 オリジナルの環境変数名
QSUB_JOBID 読み替え PBS_JOBID
QSUB_QUEUE 読み替え PBS_O_CUEUE
QSUB_WORKDIR 読み替え PBS_JOBDIR
QSUB_PROCS 追加
QSUB_THREADS 追加
QSUB_CPUS 追加
QSUB_CPUS_ALLOC 追加
QSUB_MEMORY 追加
QSUB_PPN 追加

システムAでは,ジョブスクリプトが実行されるノード(ゲートウェイノード)とプログラムが実行されるノード(計算ノード)が分かれています.プログラムを計算ノード上で動作させるためには,逐次プログラム,MPIプログラムに関わらず,ジョブスクリプトのプログラムを実行する箇所に 必ず aprun コマンドを使用する必要があります.

ゲートウェイノードの資源は計算ノードに比べ非力かつ小規模なため,aprunを使用しないコマンド実行は,システムに与える負荷の低いプログラムやコマンドのみとしてください.

下記のようにPBS環境変数を使用して記述することで,逐次プログラムもMPIプログラムも同じ記述で動作させることができます.

aprun -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN ./a.out

aprunコマンドのオプションのうち,代表的なものを以下に示します.オプションの詳細については,コマンドのマニュアル(man aprun)を参照してください.

オプション 機能
-n procs 起動するプロセス数を指定する
-d cores プロセスあたり確保するCPUコア数を指定する
-N procs_per_node ノードあたりのプロセス数を指定する
-cc cpulist
-cc none
プロセスやスレッドをCPUコアにバインディングするオプション
・ 省略時(多くの場合推奨):自動的にCPUコアのバインディングを設定する(前詰めの割り当て)
・ -cc none:CPUコアのバインディングを行わない(コアを固定化せずにOSが動的に割り当てる)
・ -cc cpulist:cpulist には CPUコアのIDを列挙します.記述方法の詳細は man aprun でご確認ください.

上記オプションの値は,ユーザが直接指定することもできます.
例えば,プログラムを1ノード辺り16プロセスx4スレッドで,4ノード使用してハイブリッド並列したい場合,ジョブスクリプトは下記のようになります.
このとき,プロセス辺りのスレッド並列数を指定する環境変数 OMP_NUM_THREADS は,ご自身で指定する必要がある事にご注意ください.

#!/bin/bash
#============ PBS Options ============
#QSUB -q gr19999a
#QSUB -ug gr19999
#QSUB -W 2:00
#QSUB -A p=4:t=1:c=68:m=90G    # 4ノード確保する
#============ Shell Script ============
export OMP_NUM_THREADS=4
aprun -n 64 -d 4 -N 16 ./a.out

ゲートウェイノードでは全ユーザのジョブスクリプトを扱うため,ジョブごとにCPU時間の制限がかけられています.プログラム中で大容量データの標準出力を行った場合,このCPU時間制限を超過する可能性があり,制限時間を越えた時点でジョブが中断されます.大容量の出力を行う場合は,標準出力ではなく,リダイレクトなどの手段でファイル出力を利用するようにしてください.

システムAでは,プロセスおよびスレッドへのコア割り当ては,デフォルトでは先頭のコアから順に割り当てられていきます. 例えば,ジョブスクリプトで#QSUB -A p=3:t=2:c=2とした場合,3個のプロセスに先頭から2物理コアずつ割り当てられ,プロセスの中で2個のスレッドに1物理コアずつ割り当てられます.

KNLの実行モードについては,クラスタモードはQuadrant固定です.

MCDRAMのモードは,QSUBオプションで下記を指定することで変更できます.各モードの計算ノードの数が不足した場合,ノードの再起動によりモードを切り替えるためジョブがラン状態になるまで20分程度かかることがあります.切り替え作業中のジョブはキャンセルが行えませんのでご注意ください.

モード オプション 備考
Flat -mm flat
Cache -mm cache デフォルトのモードです

KNLは,2つのコアを持つタイルが碁盤目状に配置された構造になっています.MCDRAMは,KNLチップ内に実装された高速なメモリで,外周のEDCと呼ばれるタイルと繋がっています.容量は16GiBです.各タイルは,EDC経由でMCDRAMにアクセスします.

(出展:"Knights Landing (KNL): 2nd Generation Intel(R) Xeon Phi(TM) Processor",hotchips 2016)

MCDRAMの利用形態は,ユーザが下記2種類から選択できます.

  1. Flatモード

    MCDRAMとメインメモリを異なるアドレスに配置し,プログラムがどちらにも直接アクセスできるようにします. MCDRAMによく使われるデータを配置することで,プログラム実行を高速化できる可能性があります. メモリ空間において,MCDRAMはデフォルトではメインメモリの末尾以降に配置されているため,意識したプログラミングや実行が必要です. MCDRAMにデータを配置する方法としては,numactlコマンドやIntel MKLライブラリを使用する方法があります. XeonPhiプログラミング入門を参考にしてください. MKLライブラリは,プログラム中のmkl_mallocなどのMKL関数に対し,デフォルトでMCDRAMを利用しようとしますので,Intel MKLのマニュアルを参照しご利用ください.

    numactlを使う場合,下記のジョブスクリプトの例のようにaprunコマンドで指定するユーザプログラムに"numactl -m 1"をつけると,MCDRAMが使えます.なお,この方法ではメインメモリが使えないため,ユーザプログラムが16GB以上のメモリ空間を使おうとするとジョブが強制終了します.

    例:

    #!/bin/bash
    
    #QSUB -q gr19999a
    #QSUB -ug gr19999
    #QSUB -A p=1:t=16:c=16:m=16G
    
    aprun -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN numactl -m 1 ./a.out
  2. Cacheモード

    MCDRAMをキャッシュとして使用します.プログラムの変更を伴わないため簡易に高速な結果を得られやすい設定です. 一般のキャッシュと同様にシステムが自動で使用し,ユーザは直接アクセスできません. ジョブスクリプトで -mm オプションを省略した場合や -mm chache を指定すると,このモードになります.

キューに投入されたジョブは,キューごとに設定されたスケジューリングポリシーに従って実行順序が決定されます.

システムAでは,下記のポリシーで固定です(ユーザによるポリシー変更は将来的に対応予定).

ポリシーの種類 設定
SCHEDULING_POLICY
(キューに投入されたジョブの実行順序を決めるポリシー)
fcfs
(キューに投入された順番でジョブを実行する先着順スケジューリング)
PASSING_POLICY
(実行順序が自分より早いジョブを追い越して実行してもよいかを設定するポリシー)
pass
(あるジョブを実行するのに十分な計算資源がある場合,そのジョブよりも前に並んでいる実行待ちジョブを追い越して実行する)

ジョブレポート
ジョブの実行が完了すると,ジョブレポートが作成されます.レポートには次の2つの情報が含まれます.

  • ジョブの標準出力
  • ジョブの標準エラー出力

デフォルトで作成されるファイル
レポート出力に関するオプションを特に指定しない場合は,次に示す命名規則でファイルが作成されます.

内容 ファイル名
標準出力・ジョブ情報 Ammddhh.oXXXXXX
標準エラー出力 Ammddhh.eXXXXXX
  • 1つのジョブに対して2つのファイルが自動生成されます
  • ファイル名の mmddhhはジョブの実行が開始された月・日・時を,XXXXXXはジョブIDを表します.

ジョブが異常終了した場合,ジョブレポートの標準エラー出力中に終了理由が表示されます.

  • 経過時間制限(-W オプション)による終了

    =>> PBS: job killed: walltime 3602 exceeded limit 3600
    aprun: Apid 379565: Caught signal Terminated, sending to application
  • メモリ超過によるシステム側からの強制終了

    [NID 00181] 2016-10-07 16:04:40 Apid 391976: OOM killer terminated this process.
    Application 392007 exit signals: Killed

利用可能なキューを確認するためには, qstat コマンドと -q オプションを使用します.

(実行例)

$ qstat -q
Queue            Memory CPU Time Walltime Node   Run   Que   Lm  State
---------------- ------ -------- -------- ---- ----- ----- ----  -----
ta                 --      --       --     --      0     0   --   E R
pa                 --      --       --     --      0     0   --   E R
gr19999a           --      --       --     --      0     0   --   E R
                                               ----- -----
                                                   0     0
  • ジョブスクリプトの -q オプションでキューを指定することで,そのキューにジョブを投入することができます.
  • 利用可能なキューは,申し込みされたサービスコースに応じて決まっており,キュー名は次のようになります.
サービスコース キュー名
パーソナルコース pa
グループコース グループ名+a
  • グループコースのキューを使用する場合は, -ug オプションでグループを指定する必要があります.エントリコースやパーソナルコースについては,特別な指定は不要です.

  • qstatコマンド実行時に,ta というキュー名が表示されますが,このキューにはバッチ処理ジョブを投入することはできません.

  • 左から6,7列目のRUN,QUEはそれぞれ投入ジョブ,実行待ちジョブを表します.

キューにジョブを投入するためには, qsub コマンドを使用します.

(実行例)

$ qsub sample.sh
11.pbs
  • 作成したジョブスクリプトファイルを,コマンドの最後に続けて入力します.
  • ジョブスクリプトの実行がシステムに依頼され,ジョブIDが表示されます.
  • グループコースのキューを使用する場合は,ジョブスクリプトの#QSUB -ugオプションでグループ名を指定してください
  • ジョブがキューの上限以上のコア数を要求した場合,下記のようなメッセージが出て,ジョブは投入されません.
    qsub: Error: job's npcus requested exceeds Rstd 1152

    ここで,"Rstd 1152" の部分は,ジョブが一度に要求できるコア数の上限を 論理コア で示しています.これを4で割った値が物理コア数,すなわちお申込み頂いた資源量となります.

投入したジョブの状態を確認するためには, qstat コマンドを使用します.

(実行例 1)

$ qstat
Job id            Name             User              Time Use S Queue
----------------  ---------------- ----------------  -------- - -----
86.pbs            qsubtest.sh      b59999            00:00:00 R workq
  • 投入したジョブのうち,実行待ち,または実行中のジョブが表示されます.
  • 左から4列目の Time Useは,ジョブスケジューラでのCPU利用時間となっており,計算ノードでのCPU利用時間とは異なりますのでご注意ください.
  • 左から5列目の S 列に状態が表示されます.Q は実行待ち,R は実行中の状態であることを表します.また,H が表示された場合,投入されたプログラムがエラーなどで待機(ホールド)状態になっています.この場合は,後述のqdelコマンドでジョブをキャンセルしてください.

1台の計算ノード内で複数のプログラムを同時に実行する方法については, 1台の計算ノードで複数のプログラムを同時に実行する方法 をご覧ください.

(実行例 2)

[b59999 ~]$ qstat -f 10
Job Id: 10.pbs
Job_Name = jobscript.sh
Job_Owner = b59999@camphor1.kudpc.kyoto-u.ac.jp
job_state = Q
queue = gr19999x
server = pbs
Checkpoint = u
ctime = Fri Jun 10 14:55:26 2016
Error_Path = camphor1.kudpc.kyoto-u.ac.jp:/usr/home/b59999/jobscript.sh.e10
Hold_Types = n
Join_Path = n
Keep_Files = n
Mail_Points = a
mtime = Fri Jun 10 14:55:26 2016
Output_Path = camphor1.kudpc.kyoto-u.ac.jp:/usr/home/b59999/jobscript.sh.o10
Priority = 0
qtime = Fri Jun 10 14:55:26 2016
Rerunable = True
Resource_List.ncpus = 1
Resource_List.nodect = 1
Resource_List.place = pack
Resource_List.select = 1:ncpus=1
Resource_List.walltime = 01:00:00
substate = 10
Variable_List = PBS_O_SYSTEM=Linux,PBS_O_SHELL=/bin/bash,
    PBS_O_HOME=/usr/home/b59999,PBS_O_LOGNAME=b59999,
    PBS_O_WORKDIR=/usr/home/b59999,PBS_O_LANG=ja_JP.UTF-8,
    PBS_O_PATH=/usr/lib64/qt-3.3/bin:/usr/home/b59999/perl5/bin:/opt/pbs/
    default/bin:/opt/java/jdk1.7.0_45/bin:/usr/local/emacs-23.4/bin:/opt/ap
    p/intel/impi/5.0.3.049/bin64:/opt/app/intel/composer_xe_2015.6.233/bin/
    intel64:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/
    bin:/usr/home/b59999/.local/bin:/usr/home/b59999/bin,
    PBS_O_MAIL=/var/spool/mail/b59999,PBS_O_QUEUE=gr19999x,
    PBS_O_HOST=camphor1.kudpc.kyoto-u.ac.jp
comment = Not Running: Not enough free nodes available
etime = Fri Jun 10 14:55:26 2016
Submit_arguments = jobscript.sh
project = _pbs_project_default
  • -f <ジョブID> オプションを付与することで,ジョブの詳細情報を確認することができます.

投入したジョブをキャンセルするためには, qdel コマンドを使用します.

(実行例)

$ qdel 44
  • ジョブIDを引数に指定します.
  • 実行待ちのジョブ,実行中のジョブともに指定できます.

投入したジョブの詳細情報を確認するためには, qs コマンドを使用します.

(実行例)

$ qs
 QUEUE     USER     JOBID   STATUS PROC THRD CORE   MEM ELAPSE( limit)
 gr19999a  b59999   5610    RUN       4   32   32   10G  01:12( 20:00)
 gr19999a  b59999   5611    PEND      1   32   32   20G  00:00( 01:00)

実行中のジョブについて,ジョブの途中経過を確認するためには, qcat コマンドを使用します.
ジョブの標準出力の表示は -o オプションを,標準エラー出力の表示は -e オプションを使用します.

(実行例 1)

$ qcat -o 5610
Tue May  1 00:00:01 JST 2012
Subroutine A step1 finished
Subroutine A step2 finished
Subroutine A step3 finished
  • ジョブIDを引数に指定します.
  • 対応するジョブの,その時点での標準出力が表示されます.

(実行例 2)

    $ qcat -e 5610
    Tue May  1 00:00:01 JST 2012
    STDERR 1
  • ジョブIDを引数に指定します.
  • 対応するジョブの,その時点での標準エラー出力が表示されます.

グループコースのキューの利用状況は qgroup コマンドで確認できます.なお, -l オプションを指定すると,ジョブごとの詳細情報が確認できます.

(実行例 1)

$ qgroup
 QUEUE    SYS |   RUN  PEND OTHER | ALLOC ( MIN/ STD/ MAX) | READY
----------------------------------------------------------------
 gr19999a  A  |     1     0     0 |    64 (  32/ 128/ 256) | 64
 gr19999a  A  |     0     0     0 |     0 (  64/ 256/ 512) | 192
 
 QUEUE    USER     |   RUN(ALLOC)  PEND(REQUEST) OTHER(REQUEST)
----------------------------------------------------------------
 gr19999a b59999   |     1(   64)     0(     0)     0(     0)
  • グループコースのキュー全体の情報,利用者ごとの統計情報が表示されます.

(実行例 2)

$ qgroup -l
 QUEUE    SYS |   RUN  PEND OTHER | ALLOC ( MIN/ STD/ MAX) | READY
----------------------------------------------------------------
 gr19999a  A  |     1     1     0 |    64 (  32/ 128/ 256) | 64
 gr19999a  A  |     0     0     0 |     0 (  64/ 256/ 512) | 192
 
 QUEUE    USER           |   RUN(ALLOC)  PEND(REQUEST) OTHER(REQUEST)
 ----------------------------------------------------------------
 gr19999a taro123kyoto   |     1(   64)     0(     0)     0(     0)
 gr19999a b59999         |     0(    0)     1(    32)     0(     0)
 
 QUEUE    USER          JOBID   | STAT  SUBMIT_AT        | ALC/REQ | PROC THRD CORE    MEM  ELAPSE
------------------------------------------------------------------------------------------------
 gr19999a taro123kyoto  104545  | RUN   2012-06-06 15:10 |      64 |   32    1    1  2000M   00:30
 gr19999a b59999        104546  | PEND  2012-06-06 15:10 |      32 |    1    1    1   500M   00:30
  • -l オプションを指定すると,グループコースのキュー全体の情報,利用者ごとの統計情報に加えて,ジョブごとの情報が表示されます.
  • ALC/REQ のコア数は,メモリの使用量も加味して,当該ジョブが使用する資源量を表示します.

ヘッダ 概要
RUN, PEND, OTHER ジョブの件数
ALLOC 割り当てコア数(メモリ使用量に応じてコア数を切り上げ.システムA: 1355MB毎)
MIN キューに対する最低保証コア数
STD キューに対する標準コア数
MAX キューに対する最大コア数
READY すぐに利用可能なコア数

MIN,STD,MAXの詳細な意味はこちらを参照ください.

ヘッダ 概要
RUN (ALLOC) 実行中のジョブ数と割り当て資源量(コア数換算)
PEND (REQUEST) 実行待ちのジョブ数と要求資源量(コア数換算)
OTHER (REQUEST) 上記以外の状態のジョブ数と要求資源量(コア数換算)

ヘッダ 概要
STAT ジョブの状態(RUNなど)
SUBMIT_AT ジョブの投入日時
ALC/REQ 資源量(コア数換算)
PROC プロセス数
THRD プロセスあたりのスレッド数
CORE プロセスあたりのコア数
MEM プロセスあたりのメモリサイズ
ELAPSE 経過時間の制限値

以前のスーパーコンピュータシステムに搭載されていたLSFジョブスケジューラとの違いについては, 前システムからの移行 のページで整理しておりますので,そちらをご覧ください.

1つのジョブの中で,複数のプログラムを同時に実行させることによって,計算資源を有効に利用することができます.
複数のプログラムを1つのジョブとして同時に実行させるためには,シェルスクリプト中に複数の実行コマンドを記載し,aprunコマンドでそのシェルスクリプトを実行するようにします.

※本手法の対象は,逐次プログラムもしくはOpenMPや自動並列化機能でスレッド並列化したプログラムです.
※複数のMPIプログラムを1つのジョブとして同時に実行させることはできません.

各スクリプトの例を以下に記します.

Crayコンパイラを用いて実行する場合は,下記の環境変数を設定する必要があります.
※下記の設定が漏れていると,計算結果に問題が生じます.
設定の影響を所望のジョブに限定するために,下記の設定は所望のジョブのスクリプト中に記述することをお勧めします.

export PMI_NO_FORK=1
export PMI_NO_PREINITIALIZE=1

qsubコマンドで実行するジョブスクリプト(逐次)

※下記のスクリプトは,プログラムを4つ同時に実行する場合のサンプルです

#!/bin/bash
#QSUB -q gr19999a
#QSUB -ug gr19999
#QSUB -A p=4:t=1:c=1:m=3G
aprun -d $QSUB_THREADS -n $QSUB_PROCS -N $QSUB_PPN -b sh ./multiprocess.sh
  • キューを -q オプションで指定します.
  • ユーザグループを -ug オプションで指定します.
  • 使用するリソースを -A オプションで下記の通り指定します.
    • 引数pには使用するプロセス数.
      • 同時に実行したいプログラム数を指定してください.ここでは4となります.
    • 引数cには利用するプロセス(プログラム)あたりに使用するコア数.
      • プログラムはシングルスレッド実行ですので,1を指定します.
    • 引数tには利用するプロセス(プログラム)あたりに使用するスレッド数.
      • プログラムはシングルスレッド実行ですので、1を指定します.
    • 引数mには利用するメモリプロセス(プログラム)辺りの容量.
  • aprunコマンドに続けて「-d $QSUB_THREADS」と「-n $QSUB_PROCS」,「-N $QSUB_PPN 」を指定し,「-b」に続けて実行するシェルスクリプトのパスを記載します.

ジョブスクリプト中で実行するシェルスクリプト(逐次)

#!/bin/bash
case $ALPS_APP_PE in
    0) ./a1.out ;;
    1) ./a2.out ;;
    2) ./a3.out ;;
    3) ./a4.out ;;

esac
  • リソースを確保すると,それぞれのプロセスごとにランク番号が付与されます.
  • プロセスが実行されると,環境変数 ALPS_APP_PE から割り当てられたランク番号を読み出すことが可能となります.
  • ランク番号を用いて処理分岐を行うシェルスクリプトを作成することで,実行するプログラムをプロセスごとに分けることが可能となります.
    これによって,複数のプログラムを1つのジョブとして同時に実行する事が可能となります.

qsubコマンドで実行するジョブスクリプト(OpenMP)

※下記のスクリプトは,4スレッド実行のプログラムを8つ同時に実行する場合のサンプルです

#!/bin/bash
#QSUB -q gr19999a
#QSUB -ug gr19999
#QSUB -A p=8:t=4:c=4:m=3G
aprun -d $QSUB_THREADS -n $QSUB_PROCS -N $QSUB_PPN -cc none -b sh ./multiprocess.sh
  • キューを -q オプションで指定します.
  • ユーザグループを -ug オプションで指定します.
  • 使用するリソースを -A オプションで下記の通り指定します.
    • 引数pには使用するプロセス数.
      • 同時に実行したいプログラム数を指定してください.ここでは8となります.
    • 引数cには利用するプロセス(プログラム)あたりに使用するコア数.
      • プログラムは4スレッド実行ですので、4を指定します.
    • 引数tには利用するプロセス(プログラム)あたりに使用するスレッド数.
      • プログラムは4スレッド実行ですので,4を指定します.
    • 引数mには利用するメモリのプロセス(プログラム)辺りの容量.
  • aprunコマンドに続けて「-d $QSUB_THREADS」と「-n $QSUB_PROCS」,「-N $QSUB_PPN 」,「-cc none」を指定し,「-b」に続けて実行するシェルスクリプトのパスを記載します.

ジョブスクリプト中で実行するシェルスクリプト(OpenMP)

#!/bin/bash
case $ALPS_APP_PE in
    0)  ./aaa.out ;;
    1)  ./bbb.out ;;
    2)  ./ccc.out ;;
    3)  ./ddd.out ;;
    4)  ./eee.out ;;
    5)  ./fff.out ;;
    6)  ./ggg.out ;;
    7)  ./hhh.out ;;

esac
  • リソースを確保すると,それぞれのプロセスごとにランク番号が付与されます.
  • プロセスが実行されると,環境変数 ALPS_APP_PE から割り当てられたランク番号を読み出すことが可能となります.
  • ランク番号を用いて処理分岐を行うシェルスクリプトを作成することで,実行するプログラムをプロセスごとに分けることが可能となります. これによって,複数のプログラムを1つのジョブとして同時に実行する事が可能となります.

ジョブスクリプトで「#QSUB -A t=4」 を指定したことで,qsubシステムによって1プロセスあたり4スレッド使用する設定が自動的に行われます. そのため,上記シェルスクリプトでは各プログラムを4スレッドで実行されます.

プロセスごとにスレッド数を変化させたい場合は,下記のように OMP_NUM_THREADS={使用したいスレッド数} をプロセスごとに定義します.

#!/bin/bash
case $ALPS_APP_PE in
    0) export OMP_NUM_THREADS=1; ./aaa.out ;;
    1) export OMP_NUM_THREADS=2; ./bbb.out ;;
    2) export OMP_NUM_THREADS=2; ./ccc.out ;;
    3) export OMP_NUM_THREADS=3; ./ddd.out ;;
    4) export OMP_NUM_THREADS=3; ./eee.out ;;
    5) export OMP_NUM_THREADS=4; ./fff.out ;;
    6) export OMP_NUM_THREADS=4; ./ggg.out ;;
    7) export OMP_NUM_THREADS=4; ./hhh.out ;;

esac

1つのジョブで複数のプログラムを同時に実行させることで,1台の計算ノード資源を有効に利用することができます.
ただし,複数のMPIプログラムを1ジョブで同時に動かすことはできないため,逐次プログラムもしくはOpenMPや自動並列化機能でスレッド並列化したプログラムが対象となります.

複数のプログラムを1つのジョブで同時に実行させるためには,シェルスクリプト中に複数の実行コマンドを記載しておき,aprunコマンドでそのシェルスクリプトを実行するようにします.

各スクリプトの例を以下に記します.

Crayコンパイラを用いて実行する場合は,下記の環境変数を設定する必要があります.
※下記の設定が漏れていると,計算結果に問題が生じます.

export PMI_NO_FORK=1
export PMI_NO_PREINITIALIZE=1

#!/bin/bash
#QSUB -q gr19999a
#QSUB -A p=1:t=1:c=32:m=61440M
aprun -d $QSUB_CPUS -b sh ./multirun.sh
  • 使用するリソースを -A オプションで指定します.引数cには利用するコア数を,引数mには利用するメモリの総容量を指定します.
  • aprunコマンドのオプションに 「-d $QSUB_CPUS」と「-b sh」を指定します.
  • aprunコマンドの引数には,実行ファイルそのものではなく,シェルスクリプトを指定します.

#!/bin/bash
./a01.out &
./a02.out &
(中略)
./a32.out &
wait
  • 1つのジョブで実行したい逐次プログラムを並べて記載します.このとき,実行コマンドの末尾に & を記載し,各プログラムがバックグラウンドで実行するようにします.
  • シェルスクリプトの最後にwaitコマンドを記載し,同期を取るようにします.

#!/bin/bash
export OMP_NUM_THREADS=4
./aaa.out &
export OMP_NUM_THREADS=12
./bbb.out &
export OMP_NUM_THREADS=16
./ccc.out &
wait
  • 1つのジョブで実行したいOpenMPプログラムを並べて記載します.このとき,実行コマンドの末尾に & を記載し,各プログラムがバックグラウンドで実行するようにします.
  • OpenMPの並列数は環境変数OMP_NUM_THREADSで指定することができ,各プログラムを異なる並列数で実行することが可能です.
  • シェルスクリプトの最後にwaitコマンドを記載し,同期を取るようにします.

システムAの計算ノードでは,標準の仮想メモリページサイズである4KB以外に,次のページサイズをサポートしています.

ページサイズ moduleファイル名
2MB craype-hugepages2M
8MB craype-hugepages8M
16MB craype-hugepages16M
64MB craype-hugepages64M
128MB craype-hugepages128M
256MB craype-hugepages256M
512MB craype-hugepages512M

ページサイズを変更してプログラムを実行する場合は,上表に記載のmoduleファイルをロードした状態でコンパイルを行ってください.また,ジョブ実行時にも同moduleファイルがロードされている必要があります.

ジョブ投入時には,aprunコマンドのオプションにて,利用するhugepageメモリ(ページサイズを大きくしたメモリ)の容量を次の形式で明示的に指定してください.1ノードで利用可能なメモリ容量90GBに近い値を指定すると hugepageメモリの確保に失敗する場合がありますので,必要な容量だけを指定してください.

オプション 機能
-m MemorySize hs プロセス当たりの,利用するhugepageメモリ容量(単位:MB)

(1) 利用するページサイズのmoduleファイルをロードしてからコンパイルを行う
$ module load craype-hugepages2M
$ ftn test.f90
(2) 利用するプロセスあたりのメモリ容量を指定してジョブを実行する
$ cat jobscript.sh
(中略)
module load craype-hugepages2M
aprun -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN -m20000hs ./a.out
$ qsub jobscript.sh

詳細については,man intro_hugepages,man libhugetlbfs,および man aprun コマンドをご確認ください.

システムAのプロセッサではハイパースレッディング機能が有効になっており,1個の物理的なCPUコアを最大4個の仮想コアとして利用できます.PBSの-A オプションでプロセスあたりのスレッド数(t)とコア数(c)を,t=c×n (1≦n≦4) となるように指定してください.CPUコア上でn個のスレッドを起動させることができます.

(実行例)

$ tssrun -A p=8:t=4:c=2  ./a.out
  • プロセスあたり2個のCPUコアを割り当て,その上でコアあたり2個のスレッドを起動します.
  • 8プロセス全体で16個のCPUコアが確保され,32個のスレッドが利用できます.

PBSでは,あるジョブが終わってから次のジョブを実行させるといった,ジョブの実行順序の指定ができます. 下記のようにqsubの -W depend オプションを使います.

-W depend=afterok:<jobid>

例えば、ジョブスクリプトa.shの終わった次にb.shを実行したいとします。 まず、"qsub a.sh"コマンドでa.shを投入して、その結果ジョブ番号が10000.jaだったとすると、以下のコマンドでb.shを投入すれば、a.shの終了後にb.shが実行されます。

$ qsub -W depend=afterok:10000.ja b.sh

qstatコマンドやqsコマンドで状況確認すると、b.shは、a.shの終了まで"HOLD"状態となります。

a.shとb.shを一度に投入したい場合は、以下のようなシェルスクリプトを実行することで可能です。

例:bashの場合

  • スクリプト(depend.shとします)
    #!/bin/bash
    JOBID=`qsub a.sh`
    qsub -W depend=afterok:$JOBID b.sh
  • 実行コマンド
    $ sh depend.sh

qsコマンドの結果は以下のように見えます。

 QUEUE     USER     JOBID      STATUS  PROC THRD CORE    MEM ELAPSE( limit)
 gr19999a  w00001   116316     RUN        1    1    1  1355M  00:01( 01:00)
 gr19999a  w00001   116317     HOLD       1    1    1  1355M  00:00( 01:00)

パラメータだけ違う似たジョブを一度に投入できる「アレイジョブ」機能が利用できます.

下記のように,ジョブスクリプトで -J オプションを使います.

#QSUB -J <start number>-<end number>[:step]

-J オプションを指定すると,ジョブ中で変数 $PBS_ARRAY_INDEX にアレイジョブ数がセットされ,インクリメントしながら実行されます.

例:a.out というプログラムに 1.data を入力するジョブ,2.dataを入力するジョブ,・・・,4.dataを入力するジョブ,をまとめて実行したい場合

  • ジョブスクリプト (この例ではarray.shとします)
#!/bin/bash

#QSUB -q gr19999a
#QSUB -ug gr19999
#QSUB -A p=68:t=1:c=1:m=1355M
#QSUB -J 1-4

aprun  -n $QSUB_PROCS -d $QSUB_THREADS -N $QSUB_PPN  ./a.out ${PBS_ARRAY_INDEX}.data
  • 実行
$ qsub array.sh
  • 投入直後にqsした結果
$ qs
 QUEUE     USER     JOBID        STATUS  PROC THRD CORE    MEM ELAPSE( limit)
 gr19999a  b59999   3023275[1]   PEND       68    1    1  1355M  00:00( 01:00)
 gr19999a  b59999   3023275[2]   PEND       68    1    1  1355M  00:00( 01:00)
 gr19999a  b59999   3023275[3]   PEND       68    1    1  1355M  00:00( 01:00)
 gr19999a  b59999   3023275[4]   PEND       68    1    1  1355M  00:00( 01:00)

3023275[1] のジョブでは./a.out 1.dataが,3023275[2]のジョブでは./a.out 2.dataが,実行されます.

KNLのプログラミングテクニックに関する情報を紹介したサイトにリンクしています.


Copyright © Academic Center for Computing and Media Studies, Kyoto University, All Rights Reserved.