Rabbit Ears
DBCLS開発もふもふ日記
DBCLS開発もふもふ日記
03/30
12/27
gmapはTopHatなどのshort read処理ツールをSun Grid Engineで並列分散処理させる際の支援ツールです.gmapを使うことで,各ツールのオプションの設定や出力ディレクトリの作成,Sun Grid Engineへのジョブ投入といった一連の処理がコマンドひとつで簡単に実行できるようになります.TopHat,Bowtie,SOAP2の実行に対応しています.
現在gmapはGitHubで公開中です.以下のURL先から入手することができます.利用にはRuby(1.9.1以降)とSun Grid Engine,およびTopHat,Bowtie,SOAP2などのツールがインストールされているクラスタ環境が必要です.
https://github.com/mickey24/gmap
以降,gmapを使った場合のメリットについて,例を交えながら紹介していきたいと思います.
以下の設定でTopHatによる解析を行う場合について考えます.
TopHatをコマンドラインから手入力で実行した場合の例を以下に示します.
$ mkdir result $ tophat -o result/1 /path/to/genome/mouse/chr1 \ /path/to/SRP0123/SRX0123/SRR0123.fastq && \ tophat -o result/2 /path/to/genome/mouse/chr2 \ /path/to/SRP0123/SRX0123/SRR0123.fastq && \ tophat -o result/3 /path/to/genome/mouse/chr3 \ /path/to/SRP0123/SRX0123/SRR0123.fastq && \ ... tophat -o result/19 /path/to/genome/mouse/chr19 \ /path/to/SRP0123/SRX0123/SRR0123.fastq && \ tophat -o result/X /path/to/genome/mouse/chrX \ /path/to/SRP0123/SRX0123/SRR0123.fastq && \ tophat -o result/Y /path/to/genome/mouse/chrY \ /path/to/SRP0123/SRX0123/SRR0123.fastq
これは流石に面倒ですね.同じようなコマンドを染色体の数(1〜19, X, Yで計21)だけ入力しなければならず,またミスもしやすく危険です.for文を使えば以下のようにある程度短く効率的に書けますが,それでもTopHatを使う度に毎回自分の手でfor文を入力するのは大変です.
$ mkdir result
$ for i in `seq 1 19` X Y
do
tophat -o result/${i} /path/to/genome/mouse/chr${i} \
/path/to/SRP0123/SRX0123/SRR0123.fastq
done
シェルスクリプトは同じようなコマンドを何度も実行する時に使うと非常に便利です.例えば以下のようなシェルスクリプトを書き,mouse.shなどのファイル名で保存します.
input=$1
output=$2
mkdir ${output}
for i in `seq 1 19` X Y
do
tophat -o ${output}/${i} /path/to/genome/mouse/chr${i} ${input}
done
これを以下のようにコマンドラインから実行します.
$ sh mouse.sh /path/to/SRP0123/SRX0123/SRR0123.fastq result
これでmouseのゲノムに対するTopHatの処理が随分楽に実行できるようになりました.しかし,この場合でも以下のような問題が残ります.
1についてはシェルスクリプトのコマンドライン引数でゲノムなどを指定するようにすればある程度解決できますが,今度はスクリプト実行時に毎回Bowtieインデックスのpathのような冗長な引数を入力しなければならなくなるという問題が発生してしまいます.染色体番号の指定も面倒になりそうです.かといってゲノムやオプションごとにスクリプトをコピーして当該箇所だけ書き換えたものを作っていくと,同じようなスクリプトが散在して管理が大変になる怖れがあります.
2については,ひとつのマシンで全染色体に対する処理を行うのではなく,以下のようにクラスタ環境で並列分散処理をすることで解決できます.
Sun Grid Engineはクラスタ環境用のジョブ投入システムです.qsubコマンドを使うことで,シェルスクリプトなどのプログラムをジョブとしてクラスタ環境に投入し,Sun Grid Engineが割り当てたマシンやリソースを使って実行させることができます.
Sun Grid Engineを使った場合のメリットは以下の通りです.
TopHat,Bowtie,SOAP2は,ひとつの入力ファイルに対する染色体ごとの処理は基本的にそれぞれ独立して実行させることができます.そのため,Sun Grid Engineを使って各染色体ごとに1ジョブずつ投入することで同時に実行させることが可能です.十分な計算リソースがあれば,ひとつのマシンで逐次実行する場合と比べて大幅な高速化が可能です.
しかし,Sun Grid Engineを使うことで新たな問題もいくつか出てきます.
TopHatなどのツールを実行する度に,これらのことに気を遣いながらシェルスクリプトを書くのは非常に大変です.また,前節で挙げた問題1もまだ解決していません.そこでgmapの出番です.
gmapを使った場合のコマンドを以下に示します.
$ gmap -t tophat -g mouse -o result \ /path/to/SRP0123/SRX0123/SRR0123.fastq
これだけで,mouseの各染色体についてTopHatのジョブをSun Grid Engineで同時実行することができます.各ツールの引数の指定,Sun Grid Engineへのジョブ投入,出力ディレクトリの作成といった作業は全部gmapがやってくれます.
gmapを使った場合の利点を以下に示します.
gmapを使うには,あらかじめホームディレクトリに.gmapという名前のファイルを設置し,そこに設定を書いておく必要があります..gmapファイルには主に以下の設定を記述します.
各ゲノムのBowtieインデックスについての設定例を以下に示します.
genome_config: mouse: genome_path : /path/to/genome/mouse/chr%s chrnum : 1-19,X,Y human: genome_path : /path/to/genome/human/chr%s chrnum : 1-22,X,Y
このように設定を記述しておくことで,違うゲノム(例: human)を使ってTopHatを処理したい時も簡単に実行できるようになります.
$ gmap -t tophat -g human -o result \ /path/to/SRP0123/SRX0123/SRR0123.fastq
tophatなどのツールに与える引数も.gmapファイルに書きます.入力ファイルのSRPの番号ごとに同じ引数を使うことが多いため,各ツールの引数はSRPごとに指定できるようになっています.以下に例を示します.
project_config: default: tophat : "--solexa-quals -r 200 --mate-std-dev 50" bowtie : "-X 250 -I 150" soap2 : "-x 250 -m 150" SRP0123: tophat : "--solexa-quals -r 200 --mate-std-dev 50" bowtie : "-X 250 -I 150" soap2 : "-x 250 -m 150"
これらの設定を書いておくだけで,入力ファイルに合わせてTopHatなどのツールに適切な引数が与えられるようになります.
gmapでTopHat,Bowtie,SOAP2を使う大規模計算を少しでもサポートできれば幸いです.
10/15
DBCLSのSun Grid Engineクラスタ環境に以下のツールの最新版をインストールした.
10/01
09/29
MacPortsパッケージのアップデートを行うと,最新パッケージのバージョンのせいで既存のシステムが動かなくなったりすることがある.その場合,システムを最新パッケージに合わせて更新・修正したり,他のライブラリを調整したりすれば解決する場合もあるが,現時点では解決策が分からない&どうしてもシステムを以前のように動ける状態にしたい時は,当該パッケージをダウングレードすることで一時的に解決できる.
まずダウングレードしたいパッケージを確認する.port upgradeでパッケージをアップデートした場合は,以下のように過去のバージョンのパッケージも残っている.
$ port installed ruby19 The following ports are currently installed: ruby19 @1.9.1-p376_0 ruby19 @1.9.1-p378_0 ruby19 @1.9.2-p0_1 ruby19 @1.9.2-p0_2 (active)
port activateでダウングレードしたいバージョンを指定し,それを有効化する.
$ sudo port activate ruby19 @1.9.1-p378_0 ---> Deactivating ruby19 @1.9.2-p0_2 ---> Activating ruby19 @1.9.1-p378_0
これでダウングレード完了.
$ port installed ruby19 The following ports are currently installed: ruby19 @1.9.1-p376_0 ruby19 @1.9.1-p378_0 (active) ruby19 @1.9.2-p0_1 ruby19 @1.9.2-p0_2
しかし,これはあくまで一時的な解決策なので注意が必要だ.
09/29
DBCLSのSun Grid Engineクラスタ環境に以下のツールの最新版をインストールした.
月末恒例のアップデート作業.今回は特に問題なく終わった.
g86のサーバ管理を引き継いでくれる人に参考にしてもらうために.
y_benjo さんのLDAプログラムのC++コードを読んでメモリ使用量を削減したり高速化したりするためのアイディアを出した.std::mapではなくstd::vectorで済ませたり.
09/29
DBCLSの統合牧場では,牧場の住民が好き勝手に使うMac Proサーバ「g86」が動いています.私はこのサーバのアップデート作業を毎月月末に行っています.
g86のアップデート作業は以下の手順で行っています.
この作業手順についてメモしておきます.
まず,アップデート作業を行う1週間前に以下の3点をサーバ利用者に予告しておきます.
MacPortsのアップデートで更新されるパッケージ一覧はport outdatedで表示することができます.この時にport selfupdateで最新のパッケージ一覧を取得しておきます.
$ sudo port -d selfupdate $ port outdated
portコマンドの-d(debug)オプションはデバッグ出力を有効にするためのもので,これを指定すると非常に細かいレベルで実行ログが画面に出力されます.
まずg86にログインし,他のユーザがログイン中・作業中でないか確認する必要があります.wコマンドでログイン中のユーザ一覧を,topコマンドで実行中のプロセス一覧を表示して確認します.
$ w $ top -u
topコマンドに-uを指定すると,CPU使用率が高いプロセスから順に一覧表示することができます.ユーザがログイン中・計算中の場合は計算停止とログアウトをしてもらってから以下の作業を進めます.
MacPortsの古いパッケージはport upgrade outdatedで一括アップデートができます.
$ sudo port -v upgrade outdated
portに-v(verbose)を指定するとパッケージインストール時のconfigureやmakeなどの作業状況が細かく表示されます.途中でエラーが発生した時の対処の参考になるため,port installやport upgradeを実行する時は-vもセットで指定することをおすすめします.-dを指定するとさらに細かいレベルで作業状況が出力されますが,普段は-vで十分でしょう.
ユーザからアップデートしてほしくないパッケージが指定されている場合は,少し面倒ですが以下のようにします.
$ sudo port -v upgrade `port outdated | tail +2 | awk '{print $1}' | grep -v '^ruby$'`
上の例ではruby以外のoutdatedなパッケージがすべてアップデートされます.grep -vでアップデートしたくないパッケージ名を指定して一覧から除外しています.パッケージ名の前後に^と$を付けているのは,例えばgrep -v rubyのように^$なしで指定するとjrubyもパターンにマッチして意図せずアップデートされないといったことがあるためです.
アップデート作業が終わったらMac OS Xの再起動を行います.再起動はGUIからでもいいですし,以下のようにコマンドラインから行うことも可能です.
$ sudo shutdown -r now
-rで再起動(reboot),nowで今すぐ実行という意味になります.
Mac OS Xのソフトウェアアップデート
基本的にはg86にGUIでログインしてメニューの「リンゴマーク」→「ソフトウェア・アップデート」からアップデート作業を行えばOKです.再起動が必要な場合はそのままGUIから行いましょう.
また,softwareupdateコマンドを使うことで,コマンドラインからソフトウェアアップデートを行うこともできます.
# 利用可能なアップデートの一覧を表示 $ softwareupdate -l # アップデートを全てインストール $ sudo softwareupdate -i -a
各オプションはそれぞれ-l(list)で一覧表示,-i(install)でインストール,-a(all)で全てのパッケージを選択という動作になります.
アップデート後に再起動が必要な場合はそのことが表示されますので,shutdownコマンドで再起動します.
$ sudo shutdown -r now
この記事で示した重要コマンドのpathを以下に示しておきます.PATHが通っていないせいで各コマンドが見つからなかった場合は参考にしてください.
/opt/local/bin/port /sbin/shutdown /usr/sbin/softwareupdate
09/17
09/10
もうそんなに時間が残ってないので着実に進めたい
09/03