qsub

個人用のパソコンでは、あるソフトウェアを実行したければそのソフトウェアのアイコンをダブルクリックしたり、コマンドラインから直接実行したりすることができる。しかし、大型コンピュータの場合は複数の利用者でシェアしているため、各個人がそれぞれ好きなようにプログラムを実行させると、計算が集中して大幅に処理限界を超えてしまったり、あるいはまったく利用されないような時間などが現れる。計算資源の配分が効率よく行われない。

そこで、大型コンピュータではプログラムを実行させるにはキューイングシステムを利用している。これは、実行したいプログラムを必要なメモリや CPU の数とともに実行ファイルに書き込んで、キューイングシステムに与えし、キューイングシステムが使用予定のスペックなどを総合判断して、プログラムを実行する。

実行ファイルの作成方法

キューイングシステムにサブミットする実行ファイルは基本的にシェル(bash, zsh など)を利用して書く。

例えば手元に dna2aa.pl という Perl のプログラムがあったとする。これを実行するためには、ターミナルを起動して、以下のようにすれば実行できるものとする。

perl dna2aa.pl -in dna.fa -out aa.fa

個人のパソコンではこのように実行すればよかった。大型コンピュータで実行するには、まず以下のようなファイル(シェルスクリプト)を用意する必要がある。ここで、ファイル名を qsub_test.sh とする。

#!/bin/bash
#$ -S /bin/bash

perl dna2aa.pl -in dna.fa -out aa.fa

シェルスクリプトを作成した後に、キューイングシステムにサブミットする。以下のようにサブミットする。

qsub qsub_test.sh

計算リソースが空いていればすぐに実行されるが、空いてない場合はしばらく順番待ちになる。実行が開始されると、実行中に出力される標準エラーや標準出力は qsub_test.e999999.1 や qsub_test.o999999.1 などのファイルに出力される。

qsub オプション

上で示した簡単な実行ファイルの二行目は $# -S /bin/bash と書かれている。$# と書いてある行はプログラムを実行する際のオプションなどを指定する部分である。次のように複数のオプションを書き込むことができる。

#!/bin/bash
#$ -S /bin/bash
#$ -l s_vmem=32G -l mem_req=32G
#$ -pe def_stat 4
#$ -N QSUB_TEST
#$ -cwd

perl dna2aa.pl -in dna.fa -out aa.fa

それぞれのオプションは以下のような意味を表す。

-S 実行時のシェルを指定
-l メモリ容量の確保や計算機などの指定
-pe 利用するプロセッサー
-t アレイジョブ。互いに独立な複数のジョブを同じ方法で解析したい場合に利用する。
-N ジョブ名
-cwd qsub でジョブを実行する場合、デフォルトではホームディレクトリ(/home/username/)で始まる。-cwd をつけると、qsub コマンドを実行したディレクトリで始まる。

アレイジョブ

例えば、現在手元に SRR000001.fastq - SRR000010.fastq の 10 個の FASTQ ファイルに対して、アダプターの除去、クオリティーフィルタリング、マッピングの一連の作業を行いたい場合、SRR000001.fastq と SRR000002.fastq の処理はお互いに独立であるから、同時に実行できる。このような場合はアレイジョブを利用すると便利である。

オプションに -t 1-10:1 を加える。これは $SGE_TASK_ID に 1 から 10 まで 1 ずつインクリメントした値を代入して、ジョブを走らせるオプションである。

#!/bin/zsh
#$ -S /bin/zsh
#$ -t 1-10:1
#$ -l s_vmem=16G -l mem_req=16G
#$ -pe def_slot 16
#$ -cwd

seq_libs=(SRR000001 SRR000002 SRR000003 SRR000004 SRR000005 SRR000006 SRR000007 SRR000008 SRR000009 SRR000010)
seq_lib=seq_libs[$SGE_TASK_ID]

# 1. remove adapter
cutadapt -a ACTTTTTCGG $seq_lib.fastq > $seq_lib.qc1.fastq

# 2. quality filetering
perl prinsesq-lite.pl --verbos -fastq $seq_lib.qc1.fastq -trim_qual_left 20 -trim_qual_right 20 -out_good $seq_lib.qc2

# 3. mapping
bowtie2 -x INDEX -U $seq_lib.qc2.fastq -S $seq_lib.sam