個人ゲノム解析環境におけるUniva Grid Engineの利用方法

1. Univa Grid Engineの概要

Univa Grid Engine(UGE)とは、ジョブ管理システムのことで、本システム上で最適なリソース管理を行っています。UGEは旧Sun Micro Systems社が所有していたオープンソースソフトウェアであるSun Grid Engine6.2U5をから派生した商用製品で、基本的なシステム概念、ユーザコマンド体系等は Sun Grid Engineと同一です。

マニュアルについては、マニュアル類からダウンロードしてください。

 

 

2. UGEのジョブ関連上限設定について

1ユーザが同時利用可能ジョブスロット数は、以下の通りです。

設定項目 設定値
ジョブスロット上限(一般研究用アカウント) 300
ジョブスロット上限(大規模利用アカウント) 300
1ユーザ当りジョブ投入上限 5000
1ユーザ当り投入タスク上限 75000

設定値を拡張するには、問い合わせ窓口sc-help.pngまでご連絡ください。ジョブスロット上限は大規模利用アカウントまでの拡張が許可されていますので 必要な方はお問い合わせください。

 

 

3. コマンド例

 

3-1. 計算ジョブの投入

現在のバージョンのUGEでは、PATH等の環境変数はジョブ実行時の環境に引き継がれません。必要な環境変数は、ジョブスクリプト内で設定していただけますようお願いします。

計算ノードに計算ジョブを投入するには、qsubコマンドを利用します。qsubコマンドでジョブを投入する為には、投入するジョブスクリプトを作成する 必要があります。

簡単な例では以下のように記述します。

#!/bin/sh
#$ -S /bin/sh

export PATH=${PATH}:/path/to/execfiles
export LD_LIBRARY_PATH=/path/to/libfiles:${LD_LIBRARY_PATH}

pwd
hostname
date
sleep 20
date
echo “to stderr” 1>&2

この時、行の先頭に、"#$"で指定されている行が、UGEへのオプション指示行になります。

オプション指示行をシェルスクリプトにする、またはqsubコマンド 実行時のオプションとして指定することでUGEに動作を指示します。主なオプションとしては以下のものがあります。

指示行の記述 コマンドラインオプション指示 指示の意味
#$ -S インタプリタパス -S インタプリタパス コマンドインタプリタをパス指定する。シェル以外のスクリプト言語も指定可能。このオプションは指定必要
#$ -cwd #$ -cwd ジョブ実行のカレントワーキングディレクトリを指定する。これによりジョブの標準出力、エラー出力もcwd上に出力される。 指定しない場合はホームディレクトリがカレントワーキングディレクトリとなりジョブ実行される。
#$ -N ジョブ名 -N ジョブ名 ジョブの名前を指定する。この指定が無ければスクリプト名がジョブ名になる。
#$ -o ファイルパス -o ファイルパス ジョブの標準出力の出力先を指定する。
#$ -e ファイルパス -e ファイルパス ジョブの標準エラー出力の出力先を指定する。

qsubには上記の他にも指定可能なオプションが多数ありますので、詳細についてはシステムにログイン後"man qsub"として、qsubコマンドの オンラインマニュアルを参照して確認してください。

 

3-2. ジョブ投入について

本システムでは一般解析環境と異なり、ジョブ投入にキューを指定して頂く必要はございません。

qsub test.sh    

 

3-3. ジョブの実行上限時間の指定について

ジョブ投入時は、qsubコマンドの -l d_rt オプションおよび、-l s_rt オプションでジョブの実行上限時間を指定してください。
-l d_rt オプションおよび、-l s_rt オプションには同じ値を指定してください。
なお、-l d_rt オプションおよび  -l s_rt オプションに指定できる上限値はキューの実行時間の上限までです。
ジョブの標準実行上限時間は3日であるため、-l d_rt オプションおよび  -l s_rt オプションを指定しなかった場合、ジョブは3日で終了します。

 

コマンド実行例は以下の通りです。ジョブの投入時にジョブの実行上限時間に192時間(8日×24時間)を指定して実行し、 -l d_rt オプション、 -l s_rt オプションを指定して実行します。

qsub -l d_rt=192:00:00 -l s_rt=192:00:00 test.sh    

 

3-4. ジョブの投入状況の確認

qsubで投入したジョブがジョブとして投入されたかを確認します。投入したジョブの状態確認にはqstatコマンドを利用します。例えばジョブが 投入されていたとすれば以下のように表示されます。

[username@at027 ~]$ qstat
job-ID     prior   name       user         state submit/start at     queue                          jclass                         slots ja-task-ID 
------------------------------------------------------------------------------------------------------------------------------------------------
     80312 0.50000 QLOGIN     username     r     02/27/2019 17:42:00 login.q@at027                                                     1
     80313 0.25000 jobname    username     r     02/27/2019 17:44:30 epyc.q@at040                                                      1
     80314 0.25000 jobname    username     r     02/27/2019 17:44:35 epyc.q@at040                                                      1
     80315 0.25000 jobname    username     r     02/27/2019 17:44:40 epyc.q@at040                                                      1

 

この時、"state"欄の文字の意味は以下のようになります。

文字 意味
r ジョブ実行中
qw ジョブはキューで待機中
t ジョブは実行ホストへ転送処理中
E ジョブにエラーが発生
d ジョブは削除処理中

 

また、キューの利用状況を確認したい場合は、"qstat -f"と入力します。以下のような出力が出力されます。

[username@at027 ~]$ qstat -f
queuename                      qtype resv/used/tot. np_load  arch          states
---------------------------------------------------------------------------------
medium.q@m01                   BP    0/0/80         0.00     lx-amd64      
---------------------------------------------------------------------------------
medium.q@m02                   BP    0/0/80         0.00     lx-amd64      
---------------------------------------------------------------------------------
medium.q@m03                   BP    0/0/80         0.00     lx-amd64      
---------------------------------------------------------------------------------
medium.q@m04                   BP    0/0/80         0.00     lx-amd64      
(中略)
---------------------------------------------------------------------------------
epyc.q@at033                   BP    0/0/64         0.00     lx-amd64      
---------------------------------------------------------------------------------
epyc.q@at034                   BP    0/0/64         0.00     lx-amd64      
---------------------------------------------------------------------------------
epyc.q@at035                   BP    0/0/64         0.00     lx-amd64      
(中略)
---------------------------------------------------------------------------------
intel.q@it003                  BP    0/0/32         0.00     lx-amd64      
---------------------------------------------------------------------------------
intel.q@it004                  BP    0/0/32         0.00     lx-amd64      
---------------------------------------------------------------------------------
intel.q@it005                  BP    0/0/32         0.00     lx-amd64      
---------------------------------------------------------------------------------
intel.q@it006                  BP    0/0/32         0.00     lx-amd64      
---------------------------------------------------------------------------------
(以下略)

これにより、どのノード(キュー)にジョブが投入されているかを判別することができます。

 

各キューのジョブの投入状況、キューの負荷状況等、全体を把握するのには、"qstat -g c"として確認することが 出来ます。

[username@at027 ~]$ qstat -g c
CLUSTER QUEUE                   CQLOAD   USED    RES  AVAIL  TOTAL aoACDS  cdsuE  
--------------------------------------------------------------------------------
epyc.q                            0.00      0      0   4160   4224      0     64 
gpu.q                             0.00      0      0     64    112      0     48 
intel.q                           0.00      0      0   1472   1472      0      0 
login.q                           0.00      1      0    383    384      0      0 
login_gpu.q                       0.00      0      0     48     48      0      0 
medium.q                          0.00      0      0    800    800      0      0 
short.q                           0.00      0      0    128    224      0     96

 

"qstat -j ジョブID"とすることで、ジョブの詳細情報を取得することができます。

[username@at027 ~]$ qstat -j 199666
==============================================================
job_number:                 199666
jclass:                     NONE
submission_time:            02/27/2019 17:42:00.867
owner:                      username
uid:                        9876
group:                      ddbj
gid:                        9876
supplementary group:        ddbj
sge_o_home:                 /home/username
sge_o_log_name:             username
sge_o_path:                 /cm/local/apps/gcc/7.2.0/bin:/home/geadmin/UGER/bin/lx-amd64:/cm/local/apps/environment-modules/4.0.0//bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:/sbin:/usr/sbin:/cm/local/apps/environment-modules/4.0.0/bin:/home/username/.local/bin:/home/username/bin
sge_o_shell:                /bin/bash
sge_o_workdir:              /lustre8/home/username
sge_o_host:                 gw1
account:                    sge
stderr_path_list:           NONE:NONE:/dev/null
hard resource_list:         d_rt=259200,mem_req=8G,s_rt=259200,s_stack=10240K,s_vmem=8G
soft resource_list:         epyc=TRUE,gpu=TRUE,intel=TRUE,login=TRUE
mail_list:                  username@gw1
notify:                     FALSE
job_name:                   QLOGIN
stdout_path_list:           NONE:NONE:/dev/null
priority:                   0
jobshare:                   0
restart:                    n
env_list:                   TERM=xterm
department:                 defaultdepartment
binding:                    NONE
mbind:                      NONE
submit_cmd:                 qlogin
category_id:                4
request_dispatch_info:      FALSE
start_time            1:    02/27/2019 17:42:00.884
job_state             1:    r
exec_host_list        1:    at027:1
granted_req.          1:    mem_req=8.000G
usage                 1:    wallclock=01:00:01, cpu=00:00:00, mem=0.00000 GBs, io=0.00000 GB, iow=0.000 s, ioops=0, vmem=N/A, maxvmem=N/A
scheduling info:            -

 

実行状況を確認していて、ジョブの状況が異常でジョブの終了を待たずにただちに削除したい場合はqdelコマンドを使用します。 "qdel ジョブID"とします。自分が投入しているジョブをすべて削除したい場合は、"qdel -u ユーザ名"とすることで実行可能です。

 

3-5. ジョブの結果の確認

ジョブの結果は、ファイル名がジョブ名.oジョブIDのファイルににジョブの標準出力、ホームディレクトリ上の下記のファイル名でジョブの標準エラー出力 が出力されています。ファイルをご確認ください。

ジョブ名.eジョブID

 

実行したジョブがどのぐらいのリソースを利用したか等の詳細情報については、qreportコマンドで確認することができます。

[username@at137 ~]$ qreport -j 110488
==============================================================
owner                okishinya                                                  
jobnumber            110488                                                     
taskid               undefined                                                  
slots                1                                                          
pe_taskid            NONE                                                       
granted_pe           NONE                                                       
exit_status          0                                                          
failed               0                                                          
qname                epyc.q                                                     
hostname             at116                                                      
jobname              TEST_intel                                                 
qsub_time            20190307-22:30:33                                          
start_time           20190307-22:31:31                                          
end_time             20190307-22:31:35                                          
ru_wallclock         4.249                                                      
cpu                  3.0                                                        
mem                  0.0                                                        
maxvmem              0.0G                                                       
r_mem                8.000G                                                     
r_q                  NONE                                                       
r_cpu                NONE

 

 

4. その他使用例

 

4-1. MPIジョブの投入方法

MPIとは、分散メモリ間のメッセージ通信API規格のことで、すべての計算ノードは、UGEの管理下にあるためMPIジョブ起動時にはMPI環境とUGEを連携させる必要があります。

MPIプログラムとUGEを連携させるための環境としてParallel Environment(PE)という環境をUGEに設定しています。

本システム上では以下の種類のPEを設定しています。

PE名 設定されたPEの意味(スロットの割り当てポリシー)
mpi 極力多数のノード上に子プロセスを起動しようとする。
mpi-fillup 極力少数のノードに子プロセスを充填して起動しようとする。
mpi_4 1ノード当り4プロセスを起動するようにする。
mpi_8 ノード当り8プロセスを起動しようとする。

 

プロセスのメモリ使用量など、計算資源の利用状況を検討した上で、上のPEから利用したい環境を選択します。

選択したら、それをジョブスクリプトに"-pe pe環境名 並列数"という形式で記述します。

#$ -S /bin/bash
#$ -N Ray
#$ -pe mpi-fillup 60-80
/usr/local/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines /home/username/Ray-1.7/Ray  \
-p /home/username/scratch/SRR033552_1.fastq /home/username/scratch/SRR033552_2.fastq \
-p /home/username/scratch/SRR033553_1.fastq /home/username/scratch/SRR033553_2.fastq \
(以下略)

 

MPIプログラムを起動する時、プログラムをどのくらいの並列数で起動するかを指定する並列数と、どのホストに 起動するかを定義するマシンファイルをmpirunコマンドに渡す必要があります。

UGE環境下では指示行に-peを指定すると、UGEが指定されたポリシーに適合する空いているノード(ジョブスロット)を確認し、 並列数($NSLOTS)とマシンファイル($TMPDIR/machines)を自動生成し、これをジョブスクリプトに与えます。

上記の例では、並列数を範囲指定しています。範囲指定をした場合、指定した範囲の中で空いているスロット数 をUGEが判別し、並列数とマシンファイルを自動生成します。

 

4-2. ジョブの使用メモリ量を指定してジョブを投入する方法

ジョブ管理システムに投入されるジョブが利用可能な仮想メモリ容量は、デフォルトでは8GBに制限されています。この制限を超えるような仮想メモリ容量を要求するようなジョブは、ジョブ投入時に明示的に必要な仮想メモリ容量を 要求して投入します。

以下のように"-l"オプションで指定してジョブを投入します。

[username@at027 ~]$ qsub -l s_vmem=8G -l mem_req=8G test.sh

 

この例では1ジョブで8GBのメモリの使用を要求してジョブを投入しています。ここで指定している"s_vmem"、"mem_req"は 以下の意味を持ちます。

項目名 意味
s_vmem 投入ジョブが指定する仮想メモリの上限値を宣言する。ここで宣言した値はジョブの実行環境に適用され、 この値を超えてジョブが動作しようとするとジョブがkillされる。
mem_req 使用するメモリの量を宣言する。

 

4-2-1. マルチスレッド、MPI並列動作をするジョブに対して、メモリ要求量を明示する場合の注意事項

メモリ要求を明示するジョブ投入方法と、PE環境を併用する場合の注意点についてご説明します。

MPI並列環境(mpi)、スレッド並列環境(def_slot) を指定して、かつ、-l s_vmem、-l mem_reqを指定した場合、並列環境で指定した並列数と指定したメモリ量が掛け合わされた容量のメモリをシステム に要求してジョブが投入されます。

例えば、下記のように指定した場合、8GBのメモリを使用するプロセスを8個起動することを指定した意味となり、ジョブが使用するメモリ総量として8×8=64GBを指定したことになります。 その点について注意した上で指定する要求メモリ量を決定してください。

-pe def_slot 8 -l s_vmem=8G -l mem_req=8G
-pe mpi_fillup 8 -l s_vem=8G -l mem_req=8G    

 

4-3. マルチスレッド動作、複数プロセスを起動するジョブの投入方法について

プロセスとしては1つですが、マルチスレッド動作をしてCPUコアを複数使うようなプログラムや(MPI並列プログラムでは ないが)親プロセスが子プロセスを複数起動して処理を行うようなプログラムのために、"def_slot"という PEを定義しています。

以下のように、def_slotの後に利用するコア数(スロット数)を指定します。

qsub -pe def_slot 4 test.sh

 

4-4. アレイジョブの投入方法

UGEはアレイジョブと呼ばれる概念を持ちます。

一度に多数のジョブをシステムに投入したい場合(パラメトリックスタディでパラメータを変えながらジョブを投げたい場合) はアレイジョブ機能を利用してください。

決して、多数のジョブをそのまま投入しようとしないでください。システムを過負荷を与える場合があります。

例えば、以下のように-tオプションを指定して投入します。 "-t 1-6:2"は、最小インデックス番号を1、最大インデックス番号を6とし、それに対して":2"を付加することで、1つ飛ばしのインデックス 番号を付けることを指定しています。この為、インデックス番号としては、1,3,5が指定されたことになります。これはqstatの出力の 各行の末尾に、タスクIDとして参照が可能となっています。

[username@at027 ~]$ qsub -t 1-6:2 arraytest.sh
Your job-array 10000.1-6:2 ("arraytest.sh") has been submitted
[username@at027 ~]$ qstat
job-ID     prior   name       user         state submit/start at     queue                jclass            slots ja-task-ID 
-----------------------------------------------------------------------------------------------------------------------------
     10000 0.25000 arraytest. username     r     03/04/2019 20:31:57 epyc.q@at095                                 1 1
     10000 0.25000 arraytest. username     r     03/04/2019 20:31:57 epyc.q@at095                                 1 3
     80430 0.25000 arraytest. username     r     03/04/2019 20:31:57 epyc.q@at095                                 1 5
	 

 

タスクIDは、ジョブスクリプト内で、SGE_TASK_IDという変数によって参照可能です。このため、「アレイジョブ内の各タスクは SGE_TASK_IDの値を確認して、それぞれ異なる処理を行う。」ということが可能です。

例えばパラメトリックスタディをしたい場合、 ジョブスクリプト内で、SGE_TASK_IDを参照して、入力データを分割して切り替えるという処理を記述することによって対応することが 可能になります。

 

4-5. クラスタ全体の混雑状況の確認方法

各キューのジョブの投入状況、キューの負荷状況等、全体を把握するのには、"qstat -g c"として確認することが 出来ます。

[username@at027 ~]$ qstat -g c
CLUSTER QUEUE                   CQLOAD   USED    RES  AVAIL  TOTAL aoACDS  cdsuE  
--------------------------------------------------------------------------------
epyc.q                            0.00      1      0   4159   4224      0     64 
gpu.q                             0.00      0      0     64    112      0     48 
intel.q                           0.00      0      0   1472   1472      0      0 
login.q                           0.00      4      0    380    384      0      0 
login_gpu.q                       0.00      0      0     48     48      0      0 
medium.q                          0.00      0      0    800    800      0      0 
short.q                           0.00      0      0    128    224      0     96 
    

 

4-6. ジョブの実行情報等の確認方法

ジョブ実行終了後、そのジョブが使用したリソース量等の情報を確認するには"qreport"コマンドを使用します。

"qacct"コマンドでも確認できますが、可能な限り"qreport"コマンドをご利用ください。

[username@at027 sh]$ qreport -j 80431
==============================================================
owner                username
jobnumber            100000
taskid               1
slots                1
pe_taskid            NONE
granted_pe           NONE
exit_status          0
failed               0
qname                epyc.q
hostname             at095
jobname              jobname
qsub_time            20YYMMDD-HH:50:54
start_time           20YYMMDD-HH:50:57
end_time             20YYMMDD-HH:51:57
ru_wallclock         0.15
cpu                  0.1
mem                  0.0
maxvmem              0.0G
r_mem                8.000G
r_q                  NONE
r_cpu                NONE

 

4-7. GUIでジョブを投入したい場合

qmonというコマンドがあります。詳細については、"man qmon"でオンラインマニュアルを確認して下さい。

 

 

その他詳細について

UGEのユーザマニュアルを本システムのユーザ向けページに掲示しました。

上記の1. Univa Grid Engineのマニュアルページをご確認ください。