メインコンテンツに移動

ジョブのサブミット

新システム

ジョブをサブミットするには、作業の内容を記入した「ジョブスクリプト」を作成します. そして,それを計算の待ち行列「キュー」に登録します.登録後は,放っておけば,ジョブが順番に処理されていきます.ジョブ文には

  • 自分の使用する計算時間を記載します.記載しなければ3時間で強制停止されます.
  • 自分が使用したい計算機の特性(高速機〜低速機)を記載します.
    • 記載しないと・・・どうやら一番ダメなマシンに割り振る癖があるみたいですね.
  • 自分の使用するメモリーやディスクの量を記載しても良いです.
    • 記載しないと,メモリー不足の計算機を割り当てられたりします.ジョブが「ふ・・・」と止まるやつは,だいたいこれ
    • 大きく書きすぎると,いつまでもジョブが開始しなかったりします.
    • おいらのプログラムのmemory使用量を知らないだと?!素人め,ここを読め

待ち行列「キュー」には4クラスあります.

F: ファーストクラス

急ぎの仕事である場合に利用します.他のジョブを一旦休止させてでも,自分が先に実行します(他のジョブが完全停止するわけではありません.わずかばかりの資源を割り振ります).ジョブの実行は,ユーザーが何を指定したとしても1日を越えることができません.

B: ビジネスクラス

まあ大事な仕事である場合に利用します.エコノミーの乗客を踏んづけてでも,自分が搭乗します.(踏まれたジョブは完全停止するわけではありません.わずかな資源が割り振られます)ジョブの実行は,ユーザーが何を指定したとしても7日を越えることができません.

E: エコノミークラス

まあゆっくりで良い仕事である場合に利用します.高位ジョブがなければ,実行します.ジョブの実行は,ユーザーが何を指定したとしても30日を越えることができません.

L: ランディングギアクラス

まあできた方が良い仕事である場合に利用する密航者です.正規の乗客が搭乗口に出現しただけで,機外放出(強制停止)され,高位ジョブが完了した180分後に再投入されます.強制停止される5分前にSIGCONT, SIGTERMが到来しますので,プログラマーによっては対策が可能かもしれません(特に対策していない場合,プログラムは強制終了されます).5分後にSIGKILLが到来し,まだ生きているプログラムも強制終了されます.ジョブの実行は,ユーザーが何を指定したとしても99日を越えることができません.

SIGCONTがなにかって?それが分からない人は,このクラスは使わない方がいいと思うよ.

ジョブ文の記述

ジョブ文の例を示します:

#!/bin/bash           ←必ず入れてください
#SBATCH --partition F   ←ジョブクラスを指定しなければならない
#SBATCH --output my_output.txt  ←画面出力ファイルを指定しなければならない
#SBATCH --error my_error.txt       ←エラー出力ファイルを指定しなければならない
#SBATCH --job-name="MyJob"      ←ジョブに名前を指定しても良い
#SBATCH --time=0-13:04  ←ジョブの継続時間(日数-時間:分). 省略時は3時間になります
#SBATCH --constraint="CL0|CL1"   ←計算機のFeatureを限定しても良いし,しなくてもよい
#SBATCH --tmp=1T  ←計算機のディスクサイズ(Tならテラ, Gならギガ)を指定しなくてもよい
#SBATCH --ntasks=4     ←MPIプロセス数. 省略すると1
#SBATCH --cpus-per-task=2   ←OMPスレッド数. 省略すると1
#SBATCH --mem-per-cpu=500  1スレッドあたりメモリーの使用量を記入したいならどうぞ
#SBATCH --mem=100G1ノードあたりメモリーの使用量をMBで記入したいならどうぞ
cd `StartDisk`    ←必ず入れてください
srun ./MyProgram      ←あなたの実行ファイルを実行(MPIの場合). MPIを使わないならsrun不要
cd `FinishDisk` ←必ず入れてください

ジョブの継続時間が短いほうが,優先順位が高くなります.つまり・・・他のジョブに踏んづけられる可能性が小さくなります.ですがジョブの継続時間が経過してしまうと強制終了されますので注意.

メモリーの使用量?そんなもん知るか!という向きには,試しに多めにとってジョブを実行すると,「そのプログラムで使ったメモリーサイズ」が記録で読めます:

[sugimoto@ig2014-1 1254]$ sl 250
       JobID      User  Partition    JobName      State    Elapsed     MaxRSS  MaxVMSize
------------ --------- ---------- ---------- ---------- ---------- ---------- ----------
250           sugimoto          F    ~(o_o)~  COMPLETED   00:06:03                       
250.batch                              batch  COMPLETED   00:06:03      0.05G      0.13G

この例では, 配列サイズ(VMSize)130MB, 実際のメモリー使用量(RSS)50MBです.これらを参考に記入してください(現在のところ,実際に使用したサイズ,で十分だと思います).デフォルトは500MBしかなかったと思います.

  • 宣言したサイズ以上を利用すると強制終了されます ←現在.この機能は無効にしている
  • というわけで,小さめに宣言しても,まずは困りません.ただし,ジョブが増えてきた時,高貴なジョブは,宣言に基づくメモリーに余裕があるマシンを踏んづけようと考えるみたいです.
  • 自分のジョブが走っているのに,メモリーに余裕があるな,とシステムが思うと,重複してジョブを実行しようとします.それでメモリーが溢れても,「メモリー指定しないやつが悪い」という考えのようです.
    • ノードあたりメモリーのデフォルトは 10GB です.気に入らない場合,
             #SBATCH --mem=120G
      とか指定してください

    • スレッドあたりメモリーのデフォルトは1GB です. 128スレッド使うと 128GBないと走りません.気に入らない場合
             #SBATCH --mem-per-cpu=2G
      とか指定してください

  • メモリー要件を満たさない計算ノードには投入されません.計算機のメモリー要件は,sn コマンドで取得可能:
[sugimoto@ig2014-1 ]$ sn
NODE       PARTITION   C:S:T  MEM DISK FEATURE    FREE-CPU -MEM REASON
as2020-1   F,B,E,L    1:16:2  128  830 CL2,AS        32/32 128G  
as2020-2   F,B,E,L    1:32:2  256  612 CL4,CL5,CL8,AS  0/64 10G  
as2020-3   F,B,E,L    1:32:2  256  600 CL4,CL5,CL8,AS 64/64 256G  
as2022-1   F,B,E,L    1:64:2  256  800 CL4,CL5,CL8,AS 0/128 243G  
ib2007-1   F,B,E,L     1:2:1    3  150 CL0             2/2 3G  
ig2016-1   F,B,E,L    2:18:2  256  900 CL4,CL8        0/72 51G  
ig2017-1   F,B,E,L    2:18:2  256  800 CL4,CL8       72/72 256G  

MEM欄:計算機が有するメモリー
-MEM欄:今余っているメモリー

計算機には,その速度や装備に応じてFeatureが指定されています.ジョブ文で#SBATCH --constraint を利用し,特性を持つ計算機を指定することも可能です.

  • CL0&CL1 という風に,複数の特性を全て持つ計算機を選べます. 途中に空白を入れてはいけません.
  • CL0|CL1 という風に,複数の特性のどちらかを持つ計算機を指定できます.途中に空白を入れてはいけません.

cd `StartDisk`は, ジョブを投入するフォルダーを, 丸ごと計算ノードに転送する命令です.また, cd `FinishDisk`は, 計算ノードのフォルダーを丸ごと元の場所に上書きする命令です.計算自身は,計算ノードの作業ディスク上で行われるので,計算に必要なデータが現在のフォルダーに正しく存在する必要があります.

ジョブ中の実際の作業では,これらは結局
   cd 計算ノードの作業フォルダー
   srun ./MyProgram
   cd 元のフォルダー
となって実行されるのです.

あとGPUの有無もわかるので指定できたらいいなー(ここいらへん未完成)

ジョブの投入

ジョブ部分が欠けたら,

sbatch ジョブ文

で投入できます.sq, slコマンドで投入具合を確認できます:

$ sq
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               301         E     1313    shogo  R 1-01:16:42      1 ib2007-1
               302         E     1315    shogo  R   22:54:41      1 ig2014-1
               306         E     1317    shogo  R   21:57:28      1 ig2014-1

sqでは実行中のジョブが, slでは実行済みのジョブが表示されます: 

$ sl -a -l
       JobID      User  Partition    JobName      State    Elapsed     MaxRSS  MaxVMSize        NodeList
------------ --------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------
306              shogo          E       1317    RUNNING   21:58:29                              ig2014-1
306.batch                              batch    RUNNING   21:58:29                              ig2014-1
306.0                                   DSMC    RUNNING   21:58:07                              ig2014-1
308              shogo          E       1319  COMPLETED   12:56:02                              ig2014-1
308.batch                              batch  COMPLETED   12:56:02      0.49G      0.13G        ig2014-1

ジョブを投入したフォルダーは smgr f [ジョブ番号] でわかります:

$ smgr f
301 : /net/sun1/shogo/wmix3/1313
302 : /net/sun1/shogo/wmix3/1315
306 : /net/sun1/shogo/wmix3/1317

うまくいかない場合,ここをチェック