遺伝研スパコン

https://sc.ddbj.nig.ac.jp/

ログイン

ユーザーアカウントを発行したら、 ssh 接続の設定をする。

~/.ssh/config
Host ddbj
  IdentityFile ~/.ssh/id_ed25519
  Hostname gw.ddbj.nig.ac.jp
  RequestTTY yes
  User yukimatsu

ssh 接続後はゲートウェイノードにいる。 ここで作業をしてはいけない。 qlogin してログインノードへ移動:

ssh ddbj
qlogin

-l s_vmem, -l mem_req でログインノードのメモリ量を指定できる。 デフォルトは 4GB で、96GB まで指定可能。

qlogin -l s_vmem=16G -l mem_req=16G  # 16GB でログイン

インタラクティブジョブ

https://sc.ddbj.nig.ac.jp/software/grid_engine/interactive_jobs

手元のターミナルと同じように、Linux コマンドやスクリプトの実行が可能:

$ pwd
/home/yukimatsu
$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print(1+2)
3

バッチジョブ

https://sc.ddbj.nig.ac.jp/software/grid_engine/batch_jobs

簡単なジョブであればインタラクティブジョブでよいが、 時間のかかるジョブやリソースを食うジョブ、繰り返し行うジョブを実行する場合は ジョブスクリプトを書いて計算ノードにやらせる。

ジョブスクリプトはシェルスクリプトまたは Python スクリプトで書くことができる。

sample.sh
#!/bin/bash

#$ -S /bin/bash
#$ -cwd
#$ -V
#$ -l short
#$ -l d_rt=00:10:00
#$ -l s_rt=00:10:00
#$ -l s_vmem=4G
#$ -l mem_req=4G

echo "HOME: " ${HOME}
echo "USER: " ${USER}
sample.py
#!/usr/bin/python3

#$ -S /usr/bin/python3
#$ -V
#$ -l d_rt=00:10:00
#$ -l s_rt=00:10:00

import os
print("HOME: ", os.environ["HOME"])
print("USER: ", os.environ["USER"])

qsub コマンドでジョブスクリプトを計算ノードに投げる:

qsub sample.sh
qsub sample.py -cwd -l short -l s_vmem=4G -l mem_req=4G

オプションはジョブスクリプト内で #$ に続けて渡してもいいし、 qsub するときのコマンドライン引数として渡してもいい。

-cwd
バッチジョブをカレントディレクトリ上で実行する。デフォルトは $HOME
-V
qsub を実行した際の環境変数を全て計算ノードに引き継ぐ。
-l short
計算ノードのキューの指定。 epyc, intel, gpu, short, medium がある。 (Grid Engineキューの種類)
-l d_rt=00:10:00, s_rt=00:10:00
ジョブの実行上限時間。デフォルトは 72:00:00 (=3日間)
-l s_vmem=4G, -l mem_req=4G
使用するメモリ量の指定。単位は G, M, K
-N example
ジョブ名の指定。指定しなければはジョブスクリプトのファイル名になる。
-S /bin/bash
インタープリタの指定
-o, -e
標準出力/標準エラーファイルの出力先
デフォルトではカレントディレクトリに {ジョブ名}.o{ジョブID}, {ジョブ名}.e{ジョブID} で出力される。

パラレルジョブ

https://sc.ddbj.nig.ac.jp/software/grid_engine/parallel_jobs/

CPU コアを複数同時に使用するジョブ。 例えば OrthoFinder であれば -a N で N スレッドの並列解析を指定する。 これを遺伝研上で投げるときは、下のようにする:

# 例
#$ -S /bin/bash
#$ -pe def_slot 5
#$ -cwd

orthofinder -f ExampleData -a 5

スレッド数の指定にはいくつか方法がある:

-pe def_slot N
同一計算ノード上に N 個の CPU コアを確保する。
-pe mpi N
複数の計算ノードにわたって、 なるべく多数のノードに散るように N 個の CPU コアを確保する。
-pe mpi-fillup N
複数の計算ノードにわたって、 なるべく少数のノードに N 個の CPU コアを確保する。

-l s_vmem=4G, -l mem_req=4G でメモリ量を指定する場合、×スレッド数 だけメモリを要求する。例えば qsub -pe def_slot 16 -l s_vmem=4G -l mem_req=4G であれば 4×16=64G を使うことになる。

アレイジョブ

https://sc.ddbj.nig.ac.jp/software/grid_engine/array_jobs

多数のジョブを同時に、あるいは順次に実行していくジョブ。

例えば6個の SRA データを同時に取得する場合:

#$ -S /bin/bash
#$ -t 1-6:1
#$ -tc 3
#$ -cwd

seq_ids=(SRR030253 SRR030254 SRR030255 SRR030256 SRR030257 SRR030258)
seq_id=${seq_ids[$SGE_TASK_ID-1]}

prefetch ${seq_id}
-t 1-N
N個のタスクを持つアレイジョブとして投入する。
計算機が空いていれば同時に実行される。そうでなくても空き次第順次導入される。
-tc M
一度に実行されるアレイジョブのタスク数の上限を指定。 これをやらないとユーザーに割り振られた計算機数をオーバーしてしまうことがある。
qquota でリソースを確認できる。2023/11/30時点で300。

ファイルの中身を seq_ids に流し込む

10,000遺伝子の並列など、seq_ids が長くなるとジョブスクリプトの可読性が落ちる。 先に seq_ids の中身をテキストファイルに書き出して それをジョブスクリプトに読み込む場合、以下のようにする:

array10000.sh
#$ /bin/bash
#$ -t 1-10000:1
#$ -cwd

seq_ids=()
while read -r x; do
    seq_ids+=($x)
done < $1
seq_id=${seq_ids[$SGE_TASK_ID-1]}

echo ${seq_id}
genes.txt
Gene_1
Gene_2
Gene_3

Gene_10000

genes.txt を引数にして qsub:

qsub array10000.sh genes.txt

cat genes.txt | while read -r x で直接読もうとすると想定した挙動をしない。

その他のコマンド

qstat
ジョブの投入状況の確認
r: 実行中, qw: 投入待機中, t: 計算ノードへ転送中, E: エラー, d: 削除中
qstat -g c
計算・ログイン含む全ノードの混雑状況をみる。
qdel jobID
ジョブの削除

Apptainer (Singularity)

https://sc.ddbj.nig.ac.jp/software/Apptainer

バイオインフォマティクスでよく使われる解析ツールは各ソフトウェアの頭文字ごとに /usr/local/biotools/ に配置されており、 インストール不要で使うことができる。

服すバージョン用意されている場合もある。 どんなツールが使えるか見てみる。たとえば BLAST:

ls /usr/local/biotools/b/blast*

使用例:

apptainer exec /usr/local/biotools/b/blast:2.6.0--boost1.60_0 blastp -help
# singularity exec /usr/local/biotools/b/blast:2.6.0--boost1.60_0 blastp -help

パッケージ管理

guix

2023/11/30 の OS アップデートと同時にドキュメントがアーカイブされた。 もうすぐ使われなくなるかもしれない。

ユーザー権限で利用できるパッケージマネージャで、最初から使えるようになっている。

前準備:

~/.bashrc に以下を追記:

export GUIX_DAEMON_SOCKET=guix://at111
export GUIX_PROFILE="$HOME/.guix-profile"
source "$GUIX_PROFILE/etc/profile"
guix search, guix package --search
利用可能なパッケージの検索。標準出力だと見切れるので less に渡す。
(例) guix search paml | less
guix install, guix package --install
パッケージのインストール
上記のように設定した場合のデフォルトのインストールパスは $HOME/.guix-profile/bin/ になる。
guix pull
guix 本体を最新版に更新する。
guix update, guix package --update
インストールしたパッケージを最新版に更新する。 正規表現でパッケージを指定可。
guic remove, guix package --remove
パッケージのアンインストール

バイオインフォマティクス関連のパッケージ: