Heavy Watal

遺伝研スパコン

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

利用開始

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

  1. 利用規定等を熟読。
  2. 手元のコンピュータでSSH鍵ペアを生成しておく。 既にある場合は作り直す必要なし。 公式ドキュメント に従ってRSA 3072にするのが無難だが、Ed25519やEDCSAを登録することも可能。
  3. 利用登録申請のフォームを埋める。
    • 申請者
    • 所属機関
    • アカウント: 作っておいたSSH公開鍵をここでコピペ。
    • 責任者
  4. 申請者と責任者にメールが届くので、それに従って誓約書PDFを管理者に送信。
  5. アカウント登録証が手元に届く。
  6. 手元の ~/.ssh/config に設定を追加:
    Host *.ddbj.nig.ac.jp
      RequestTTY yes
      User heavywatal
      IdentityFile ~/.ssh/id_ed25519
    
    ユーザ名と鍵ファイル名は適宜調整。 これでsshコマンドを短く済ませられる。
  7. ゲートウェイノードにSSH接続し、ログインノードに qlogin:
    ssh gw.ddbj.nig.ac.jp qlogin
    # which is equivalent to (thanks to ~/.ssh/config)
    ssh -t -f ~/.ssh/id_ed25519 heavywatal@gw.ddbj.nig.ac.jp qlogin
    

ファイルの送受信

公式「システムへのファイル転送方法」 にはsftpかAsperaを使えと書かれてるけど、 rsync を使うのが簡単。

# send
rsync -auv ~/input/ gw.ddbj.nig.ac.jp:~/input/

# receive
rsync -auv gw.ddbj.nig.ac.jp:~/output/ ~/output/

ソースコードは当然Gitで管理。

環境整備

ジョブ投入、管理

qsub

遺伝研ウェブサイトにはスクリプトを書いてから渡す方法しか書いてないが、 簡単なタスクならコマンド引数として直接渡すのもあり。

## スクリプトを書いてから渡す
qsub test.sh

## コマンドライン引数として直接渡す
qsub -l short -b y -shell n -cwd -N test "pwd; sleep 5; ls >ls.txt"
-l ***
実行時間や計算ノードなどの要求を伝える。 管理者が定義したキューから選んで指定する。 例えば、1時間以内に終わる軽いものなら -l short、 2か月かかるものなら -l epyc、 メモリが多めに必要なら -l medium、など。 qstat -g c でキューの一覧とそれぞれの負荷を確認できるので空いてるところを探す。
1コアあたりのRAM上限(デフォルト8GB)もこのオプションから -l s_vmem=16G -l mem_req=16G のように変更できる。
-pe def_slot 8
parallel environment: 並列処理で使用するCPUコア数を指定。
MPIによる並列化の場合はまた違うオプションがある。
-cwd
カレントディレクトリでジョブ実行。 デフォルトでは ${HOME}
-N ***
ジョブに名前をつける。 デフォルトではスクリプト名が採用される。
-o ***, -e ***
標準出力・標準エラー出力の書き出し先。 デフォルトではワーキングディレクトリ以下に {JOBNAME}.o{JOBID}, {JOBNAME}.e{JOBID} という名前で書き出される(空っぽでさえ)。 不要な出力は /dev/null に流し込むべし。
-S /bin/sh
インタープリタを指定。 指定しないと csh が利用されるせいか、 標準出力で Warning: no access to tty と怒られる。
-t 1-M
M個のタスクを持つアレイジョブとして投入する。 タスクごとにパラメータを変えてプログラムを走らせたい場合は、 スクリプトの中で環境変数 SGE_TASK_ID を拾ってどうにかする。 qsub コマンドを生成して何回も呼ぶほうが圧倒的に楽だけど、 アレイジョブのほうがクラスタ側の負荷が小さいらしい。ほんとかな。
-tc MAX_RUNNING_TASKS
アレイジョブで同時実行するタスク数の上限を指定。 システムからユーザーに与えられた上限は qquota コマンドで確認できる。 いまのところ500らしい。
-v VARIABLE=value
環境変数を定義してジョブに引き継ぐ。
大文字 -V で全ての環境変数が渡される。
-b y
計算ノードにバイナリがあるものとしてジョブを投げる。 これを指定しない場合はスクリプト扱いになり、 投入ノードから計算ノードへのコピーなど余計なプロセスが挟まるらしい。
-shell n
環境変数の解決など、 プログラムの呼び出しにシェルを介す必要がない場合は これを指定することで多少コスト削減できる。 当然 -b y のときのみ有効。

qsub スクリプト

#$ で始まる行は qsub へのオプションと見なされる。

ジョブスクリプト内で参照可能な特殊環境変数をプリントしてみるジョブの例:

#!/bin/sh
#$ -S /bin/sh
#$ -l short
#$ -cwd
#$ -t 1-2
echo HOME: $HOME
echo USER: $USER
echo JOB_ID: $JOB_ID
echo JOB_NAME: $JOB_NAME
echo HOSTNAME: $HOSTNAME
echo SGE_TASK_ID: $SGE_TASK_ID
echo SGE_TASK_FIRST:$SGE_TASK_FIRST
echo SGE_TASK_LAST: $SGE_TASK_LAST
echo SGE_TASK_STEPSIZE: $SGE_TASK_STEPSIZE
pwd
ls

スクリプトはPythonでもいい。 インタープリタを -S /usr/bin/env python で指定できないのは残念。

#!/usr/bin/env python
#$ -S $HOME/.pyenv/shims/python
#$ -l short
#$ -cwd
#$ -t 1-2
import os
print("SGE_TASK_ID: " + os.environ["SGE_TASK_ID"])

補助コマンド

qstat
現在実行中のジョブ一覧。 ステータスは1文字に省略されて E(rror), r(unning), R(estarted), s(uspended) のように表示される。 詳しくは man qstat を参照。
qstat -g c
クラスタで定義されているキューの一覧と、それぞれの負荷を表示
qstat -f | less
全ノードの状況をfullに表示
qstat -u '*' | less
全ユーザのジョブを表示。 -s p でpending中のみに絞ったり、 -l medium でキューの種類を絞ったりできる。
qstat -j JOBID
ジョブの詳細表示
qacct -j JOBID
ジョブ実行後にリソース消費を確認
qdel JOBID
ジョブ削除
qquota
ユーザーに与えられたリソースを表示

Apptainer (Singularity)

/usr/local/biotools/ 以下に各種ソフトウェアが用意されている。 BioContainers のものをほぼそのまま置いているらしい。

利用可能なソフトウェアとバージョンを探す:

find /usr/local/biotools/ -name 'blast*' | sort

イメージとプログラム名を指定して実行:

apptainer exec -e /usr/local/biotools/f/fastp:0.23.4--hadf994f_2 fastp --help

そこらに落ちてるイメージを拾ってきて使うこともできる。 例えばTrinityの公式最新版を使いたい場合:

find /usr/local/biotools/ -name 'trinity*' | sort
mkdir -p ~/image
wget -P ~/image/ https://data.broadinstitute.org/Trinity/TRINITY_SINGULARITY/trinityrnaseq.v2.11.0.simg
apptainer exec -e ~/image/trinityrnaseq.v2.11.0.simg Trinity --help

R

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

apptainer R

find /usr/local/biotools/ -name 'r-base:*' | sort
apptainer exec -e /usr/local/biotools/r/r-base:4.2.1 R