遺伝研スパコン
利用開始
-
責任者にメールが届くので、それに従って誓約書PDFを管理者に送信
-
アカウント登録証が手元に届く
-
手元のマシンでSSH公開鍵を生成し、 サーバーに登録。 ドキュメントの例ではRSAが使われてるけどECDSAのほうが安全で軽い。 ほんとはed25519のほうが良いけどウェブ登録ではなぜか拒否される。
ssh-keygen -t ecdsa -b 521 -N '' -C 'heavywatal@nig.ac.jp' -f ~/.ssh/id_ecdsa_nig
-
手元の
~/.ssh/config
に設定を追加:Host *.ddbj.nig.ac.jp User heavywatal RequestTTY yes IdentityFile ~/.ssh/id_ecdsa_nig
sshコマンドでユーザ名と
-t
オプションを省略できるようになる。 -
ゲートウェイノードにSSH接続し、ログインノードに
qlogin
:ssh 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で管理。
環境整備
ジョブ投入、管理
- https://sc.ddbj.nig.ac.jp/general_analysis_division/ga_introduction
- https://sc.ddbj.nig.ac.jp/software/univa_grid_engine
- Univa Grid Engine (UGE)
- http://gridengine.eu/grid-engine-documentation
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
- ユーザーに与えられたリソースを表示
Singularity
/usr/local/biotools/
以下に各種ソフトウェアが用意されている。
BioContainers のものをほぼそのまま置いているらしい。
利用可能なソフトウェアとバージョンを探す:
find /usr/local/biotools/ -name 'blast*' | sort
イメージとプログラム名を指定して実行:
singularity exec -e /usr/local/biotools/f/fastp:0.20.0--hdbcaa40_0 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
singularity exec -e ~/image/trinityrnaseq.v2.11.0.simg Trinity --help
R
Homebrew R
Homebrew on Linux における標準GCCがついに新しくなったので
brew install r
で使えるRが入るようになった。
ライブラリが古かったりして途中でエラーになることもあるので
brew install --force-bottle gcc
のような感じでやり過ごす。
ただし古い gcc@5 まわりでまだ問題が残っているようなので要注意。
singularity R
find /usr/local/biotools/ -name 'r-base:*' | sort
最新が3.5.1と古い上にエラーで起動しない:
singularity exec -e /usr/local/biotools/r/r-base:3.5.1 R
WARNING: Skipping mount /opt/pkg/singularity/3.7.1/var/singularity/mnt/session/etc/resolv.conf [files]: /etc/resolv.conf doesn't exist in container
[1] 100279 segmentation fault singularity exec -e /usr/local/biotools/r/r-base:3.5.1 R
module R
https://sc.ddbj.nig.ac.jp/ja/guide/software/r
module load r/3.5.2
そのものが古い上に、
古いコンパイラ(おそらく /usr/bin/gcc
4.8.5)でビルドされているため
RcppでC++11までしか使えない。
また、各パッケージも同じく古いコンパイラでビルドしなければならない。
module load gcc
などで新しいgcc/g++がPATH上に乗っていると、
Rcppインストール時などに
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found
と怒られる。
Source R
/opt/pkg/r/*/lib64/R/etc/Makeconf
を参考に新しいコンパイラで自前ビルドを試みる:
wget -O- https://cran.r-project.org/src/base/R-3/R-3.5.2.tar.gz | tar xz
cd R-3.5.2/
./configure -h | less
./configure --prefix=${HOME}/R --disable-openmp --disable-java '--enable-R-shlib' '--enable-shared' '--with-tcl-config=/usr/lib64/tclConfig.sh' '--with-tk-config=/usr/lib64/tkConfig.sh' 'PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/cm/local/apps/curl/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig' 'CFLAGS=-I/usr/local/include:/usr/include/X11:/cm/local/apps/curl/include' 'CPPFLAGS=-I/usr/local/include:/usr/include/X11:/cm/local/apps/curl/include' 'CXXFLAGS=-I/usr/local/include:/usr/include/X11:/cm/local/apps/curl/include' 'FFLAGS=-I/usr/local/include:/usr/include/X11:/cm/local/apps/curl/include' 'FCFLAGS=-I/usr/local/include:/usr/include/X11:/cm/local/apps/curl/include' 'LDFLAGS=-L/usr/local/lib64 -L/usr/lib64 -L/usr/lib -L/cm/local/apps/curl/lib'
make -j2
make install
configure: error: libcurl >= 7.22.0 library and headers are required with support for https
古いcurlは入ってないように見えるのに、なぜ?