====== ジョブを実行する ======
スーパーコンピューティングシステムでジョブを実行する方法を説明します。\\
大規模並列計算サーバのフロントエンドノード(super)へのsshによるログインが完了していることを前提とします。\\
===== 概要 =====
==== PBSジョブスケジューラ ====
MASAMUNE-IMRで実行される計算(ジョブ)は、ジョブ管理ソフトウェア[[https://www.altairjp.co.jp/pbs-professional/|PBS Professional]]によって管理されます。\\
ユーザーは実行したいジョブを予め用意されたジョブキューに投入する必要があります。その後、PBSジョブスケジューラによってキュー内のジョブの実行順序、実行ノードなどがスケジューリングされ、スーパーコンピュータの計算ノードに割り当てられて実行されます。\\
\\
==== ジョブスクリプト ====
ジョブをキューに投入するには、qsubコマンドを使用します。\\
実行したい処理内容を記述したスクリプトファイルを用意し、以下のようにコマンドを実行することでジョブが投入されます。\\
$ qsub [-q キュー名] [-l select=ノード数] [-N ジョブ名] [-M 電子メールアドレス] [-m 電子メール通知の指定] [-l walltime=経過時間上限] [-l ライセンス種類=使用ライセンス数] [実行するスクリプトファイル]
\\
キュー名やノード数といったオプションはスクリプトファイル中に記述することができます。\\
コマンドの入力ミスを避けるためにもスクリプト中でのオプションの指定を推奨します。\\
一般的なスクリプトファイルの書式は以下のようなものです。\\
#!/bin/sh
#PBS -l select=ノード数
#PBS -q キュー名
#PBS -N ジョブ名
(以下、実行したい処理内容を記述)
\\
上記スクリプトのうち1行目は、記述内容をシェルスクリプトとして実行するよう指定する行です。\\
また、2行目以降の"#PBS"から始まる行を記述することで、PBSに渡すオプションをスクリプト中で指定することが可能です。\\
\\
===== ジョブの実行方法 =====
それでは、実際にジョブスクリプトを作成し、ジョブを投入してみましょう。\\
使用したいアプリケーションがスパコンシステムにインストールされている場合は、[[:application|アプリケーション一覧・使用方法]]からスクリプト例をご覧いただけます。\\
\\
以下の内容のファイルを作成し、ファイル名を"hello.sh"として保存してください。\\
このスクリプトは、キューP_016に"hello"という名前のジョブを投入します。使用ノード数は1ノードとします。\\
#!/bin/sh
#PBS -l select=1
#PBS -q P_016
#PBS -N hello
# ジョブ投入したディレクトリを/work領域にコピーし、/work領域に移動
DIRNAME=`basename $PBS_O_WORKDIR`
WORKDIR=/work/$USER/$PBS_JOBID
mkdir -p $WORKDIR
cp -raf $PBS_O_WORKDIR $WORKDIR
cd $WORKDIR/$DIRNAME
# echoコマンドを実行し、標準出力をresult.out、標準エラー出力をresult.errにリダイレクトする。
aprun echo "Hello world!" > result.out 2> result.err
# ジョブが終了後、結果をジョブ投入したディレクトリに移動
cd; if cp -raf $WORKDIR/$DIRNAME $PBS_O_WORKDIR/.. ; then rm -rf $WORKDIR; fi
大規模並列計算サーバでは、必ずaprunコマンドを使用してプログラムを実行してください。\\
スクリプトに関する詳細は[[:user_manual:supercomputer:job_submission_management|ジョブの投入・管理]]を参照してください。
実行中のジョブの途中経過については、/work/$USER/$PBS_JOBID/$DIRNAME以下のファイルを確認してください。\\
また、プログラムが上限実行時間以内に終了しなかった場合、上記スクリプトの最終行が実行されないため、出力ファイルはジョブ投入したディレクトリにコピーされません。\\
\\
スクリプトを作成したら、以下のようにqsubコマンドでジョブを投入します。\\
ジョブの投入に成功すると、ジョブID(この場合は123456.sdb)が表示されます。
$ qsub hello.sh
123456.sdb
\\
ジョブの状態はstatjコマンドで確認できます。
$ statj
sdb:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
123456.sdb username P_016 hello -- 1 72 768gb 24:00 Q --
\\
それぞれの項目の意味は以下のとおりです。
^項目 ^意味 ^
|Job ID |ジョブに割り当てられたID |
|Username |ユーザ名 |
|Queue |ジョブが投入されたキュー名 |
|Jobname |ジョブ名 |
|SessID |セッションID |
|NDS |占有ノード数 |
|TSK |CPUコア数 |
|Req'd Memory |使用可能メモリ上限 |
|Req'd Time |実行時間上限 |
|S |ジョブの状態\\ Q: 実行待ち\\ R: 実行中\\ E: 実行終了処理中\\ H: ホールド |
|Elap Time |ジョブ実行開始からの経過時間 |
\\
ジョブが終了すると、カレントディレクトリに以下のファイルが保存されます。
result.out
result.err
hello.o123456
hello.e123456
\\
名前が"{ジョブ名}.o{ジョブID}"および"{ジョブ名}.e{ジョブID}"のファイルはそれぞれ標準出力および標準エラー出力の内容が記録されます。\\
今回はそれぞれresult.outおよびresult.errにリダイレクトしているため、これらのファイルの内容は空になります。\\
標準出力および標準エラー出力に計算結果などを大量に出力するプログラムを実行する場合、必ず出力内容をファイルにリダイレクトしてください。\\
リダイレクトされない出力内容はPBSの一時ファイル保管領域に保存されるため容量枯渇の原因となり、他のユーザのジョブ実行に影響します。\\
そのため、上記の注意事項をお守りいただけない場合、当該ジョブを強制的にキャンセルさせていただく場合がございます。
\\
出力結果を見てみましょう。
$ cat result.out
Hello world!
Application 5598879 resources: utime ~0s, stime ~1s, Rss ~9980, inblocks ~0, outblocks ~0
\\
以上でスパコンシステムへのログインからファイル転送・ジョブの実行方法の説明を行いました。\\
各サーバのより詳細な使用方法については、[[:user_manual|ユーザーマニュアル]]をご覧ください。\\
アプリケーション個別のジョブ実行方法については、[[:application|アプリケーション一覧・使用方法]]からご確認いただけます。\\
\\
------
[[getting_started:transfer_file|<<「ファイル転送を行う」に戻る]] | [[:getting_started|「はじめに」に戻る]]