🙆‍♀️

toilを使ってジョブスケジューラになげるときについて

2023/05/13に公開

jobStoreの指定をしないと、エラーになる。
writeLogsを指定すると、かくノードでの結果的なものが出力されるので、デバッグしやすい。ただしwriteLogsで指定するディレクトリは予め作っておく必要があるだろう。

outdirで指定したところに、出力ファイルがあるときは、上書きがされないようなので、古いままのデータになっていることがある。なので、その部分の確認は必要。

cwltoolでうまく動き、toil-cwl-runnerのローカルで動いて、
さてジョブスケジューラでなげようとして
--batchSystem Slurm
を、つけたら動かないというようなケースでは、jobStoreを忘れていないかチェックする。

うまく動くと、jobStoreは消えるのがデフォルトのため、実行後は見つからないと思われる。
また、同じjobStoreを共有することはできないので、同じものを指定してもエラーになることだろう。
ただし1度実行した後、何個か失敗したときなどは、--restartをつける。このときは、最初に実行したときに指定した、jobStoreを指定する必要がある。このjobStoreにどこまで実行したかの情報あり。

あと、ジョブスケジューラを使うときに、ノードごとにログが/tmpに出力されると、確認が大変なので、そのそきは、writeLogsを使ってディレクトリをつくっておくとよさそうである。
投げ先で出たエラーがまとまってでてくるので、デバッグに役立つ。
また、ファイル名から、どのパラメータのとき、また、Workflowであれば、どのステップのときに発生したエラーなのかが特定しやすい

シェルスクリプトを実行するcwlファイル

cwlVersion: v1.2
class: CommandLineTool
baseCommand: /bin/bash
#arguments:
#  - valueFrom: $(inputs.sleep_seconds)
inputs:
  sleep_seconds:
    type: int
    inputBinding:
      position: 2
  exec_script:
    type: File
    default:
      class: File
      location: ./sleepcwl.sh
    inputBinding:
      position: 1
outputs:
  output:
    type: stdout

cwlで実行するシェルスクリプト

確認したいことをスクリプト内に書く。
配置は同じディレクトリにする

(venv) [manabu@at044 20230511-cwltool-behavior-check]$ cat sleepcwl.sh 
#!/bin/bash
SLEEPTIME=$1

date
hostname
echo "[Start sleep ${SLEEPTIME}]"
/usr/bin/sleep ${SLEEPTIME}
echo "[End sleep ${SLEEPTIME}]"
date

1つ目のジョブ

TOIL_CHECK_ENV は、venv作った環境内の toil-cwl-runner を実行するときに必要。

TOIL_CHECK_ENV=true toil-cwl-runner --logFile log1.txt \
--disableCaching --batchSystem grid_engine --debugWorker \
--logDebug --writeLogs $PWD/w1 --jobStore my_jobStore1 \
--workDir `pwd` --outdir `pwd`/outdir1   sleepsh.cwl

2つ目のジョブ

TOIL_CHECK_ENV=true toil-cwl-runner --logFile log2.txt \
--disableCaching --batchSystem grid_engine --debugWorker \
--logDebug --writeLogs $PWD/w2 --jobStore my_jobStore2 \
--workDir `pwd` --outdir `pwd`/outdir2   sleepsh.cwl

実行中のログについて

--logDebug をつけて実行すると(ついてなくてもよいかは今後確認)
投げたあと、以下のようなログがでてくる。
このなかで、どの程度進行しているかをみるには、toil.leaderでgrepしてあげるとよい。
また、このtoil.leaderのログは、以下をみると1時間に1度だが、パラメータで調整可能なようである。

このログは標準出力にでるものか、logFileにでるものかは今後確認する

[2023-05-26T19:30:21+0900] [MainThread] [I] [toil.leader] 64 jobs are running, 1936 jobs are issued and waiting to run
[2023-05-27T06:30:35+0900] [MainThread] [I] [toil.leader] 14 jobs are running, 629 jobs are issued and waiting to run
[2023-05-27T07:30:36+0900] [MainThread] [I] [toil.leader] 64 jobs are running, 421 jobs are issued and waiting to run
[2023-05-27T08:30:37+0900] [MainThread] [I] [toil.leader] 64 jobs are running, 338 jobs are issued and waiting to run
[2023-05-27T09:30:37+0900] [MainThread] [I] [toil.leader] 64 jobs are running, 229 jobs are issued and waiting to run
[2023-05-27T10:30:38+0900] [MainThread] [I] [toil.leader] 64 jobs are running, 116 jobs are issued and waiting to run

以下のような種類がある

  • toil.leader
  • toil.worker
  • toil.job
  • toil
  • cwltool

共有ファイルシステムなどのファイルをtailするとき

共有ファイルシステム上のファイルをtailするときは、ただしく、データがとれているかを確認することが必要な時がある。
特に、排他制御は他でやっていて、単独でみるようなファイルだと気づかないことがあるが
期待と違う結果になることがある。
例えば行が途中できれるとか、途中からはじまるなど。

このようなときは、期待する行かどうかをチェックするということがあってもよいかもしれない。
行の先頭や末尾に出てくる単語がわかっていて、それが他の部分にはでてこなさそうなときは、フォーマットがそろっているもののみtailとして正しく取得できたなど。

accountingをtailしているときとか。

cwltoolを使ってデバッグするとき

ディレクトリ

toilでジョブスケジューラになげるとエラーになるから、cwltoolで試してみようというときのTIPS

カレントディレクトリに大量のファイルがあると起動までに時間がかかる
どうも、ディレクトリの中も関係があるようなので、そういうときは、空のディレクトリを作ってそこから実行してみるとよいときもある。

取りたい項目

メモリの使用量がとれるならとったほうがよいだろう。

Discussion