Nabe International | Takeru Boost >> Takeruを回せ! >>

CWL workflow on Toil with Univa Grid Engine

ゲノム解析に限らず、データ解析は1つのソフトウェアを実行して終わりということはまずありません。前処理からクオリティチェック、フィルタリング、1次解析、2次解析とワークフローを実行していき最後に目的の結果を可視化するという流れがほとんどでしょう。しかし、公刊論文と同じ解析方法を使いたい、共同研究者と解析内容を共有したいと思いワークフローを作ってみても、データの種類、使用ツールとバージョン、入力パラメータと要素が増えていくと、同じ結果にならなかったり実行環境を移植するのが大変だったりと苦労がつきものです。このような再現性やポータビリティについてさまざまな議論がなされるなか、ワークフロー記述フォーマットを統一しようと始まったプロジェクトがCWL(Common Workflow Language)です。 https://www.commonwl.org

CWLとは

CWL自体はワークフローの記述フォーマットを指しており、それを読んで実行するためのエンジンがいくつか開発されています。CWLのワークフローを実行するには、2つのファイルが必要です。
  • コマンドラインツールもしくはワークフローを記述したcwlファイル
  • 入力パラメータを記述したyamlもしくはJSONファイル
この2つをCWLのエンジンに渡して実行します。ワークフローのCWLファイルでは、コマンドラインツールのCWLファイルを組み合わせて実行することができます。具体的なワークフロー記述方法は開発元のUser Guideをご覧ください。 https://www.commonwl.org/user_guide/ CWLはDocker,Singularityに対応しており、アプリケーションをコンテナで実行することができます。コンテナ使用時のコマンドオプションを自動で付加してくれるので、DockerやSingularityに慣れていなくても簡単に使えると思います。User Guide 7にDockerを使用する場合の記述方法があります。 https://www.commonwl.org/user_guide/07-containers/index.html singularityでもCWLファイル側の記述は共通で、CWLエンジンに渡す時のオプションで指定します。

Toil x Univa Grid Engine

CWLのUser Guideで使われているエンジンcwltoolは最もシンプルなレファレンス実装であり、ローカル実行のみとなります。ほかにも開発元webサイトにエンジンのリストがあり、自分の環境に適したものを探すことができます。そのうちの1つToilはもともとpythonのワークフロー実行ツールですが、CWLで書かれたものも読むことができます。 http://toil.ucsc-cgl.org Toilはジョブスケジューラに対応しており、CWLのワークフローをクラスター構成の計算ノードで実行可能です。今回はTakeru標準のジョブスケジューラUniva Grid Engine(以下UGE)と組み合わせた実行例をご紹介します。

Toilの基本的な実行方法

前項に書いたようにcwlファイルと入力パラメータのファイルをToilの実行コマンドcwltoilに渡して実行します。以下はペアエンドのfastqファイルに対しfastqc,trimmomatic,bwa,samtoolsを実行しBAM形式で出力するワークフローの記述例です。

$ cat smallworkflow.cwl

#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: Workflow

inputs:                   //ワークフロー全体のinput パラメータファイルから渡される
  fastq1:
    type: File
    format: edam:format_1930
  fastq2:
    type: File
    format: edam:format_1930
  ref:
    type: File
    secondaryFiles:
      - .amb
      - .ann
      - .bwt
      - .pac
      - .sa
      - .fai
outputs:                          //ワークフローの最終的なoutput
  qc_fastq1:
    type: File  
    outputSource: fastqc1/fastqc  //step名とoutputを指定 
  qc_fastq2:
    type: File
    outputSource: fastqc2/fastqc
  trimed_paired1:
    type: File
    outputSource: trimmomaticPE/paired1
  trimed_paired2:
    type: File
    outputSource: trimmomaticPE/paired2
  mapped_bam:
    type: File
    outputSource: sam-bam/mapped_bam
steps:                  //各stepの記述 
  fastqc1:
    run: ../tools/fastqc.cwl  //別に作成したコマンドラインツールのCWLファイルのパス
    in:
      fastq: fastq1          //inputで定義したオブジェクトを指定
    out: [fastqc]
  fastqc2:
    run: ../tools/fastqc.cwl
    in:
      fastq: fastq2
    out: [fastqc]
  trimmomaticPE:
    run: ../tools/trimmomatic.cwl
    in:
      fastq1: fastq1
      fastq2: fastq2
    out: [paired1, paired2]
  bwa:
    run: ../tools/bwa.cwl
    in:
      fastq1: trimmomaticPE/paired1    //前のステップのoutputを指定、
      fastq2: trimmomaticPE/paired2   //trimmomaticPEのstepが終了するまで
      ref: ref                         //bwaのstepは実行されない
    out: [mapped_sam]
  sam-bam:
    run: ../tools/sam-bam.cwl
    in:
      mapped_sam: bwa/mapped_sam
    out: [mapped_bam]

パラメータファイルには入力ファイルを記述します。またbwaで使用するレファレンスデータもここで記述しておきます。

$ cat smallworkflow.yaml
fastq1:
  class: File
  path: ../data/DRR006760-4k_1.fastq 
  format: http://edamontology.org/format_1930
fastq2:
  class: File
  path: ../data/DRR006760-4k_2.fastq 
  format: http://edamontology.org/format_1930  
ref:
  class: File
  path: ../data/human_g1k_v37_decoy.fasta

以下のように実行します。singularityを使う場合はオプション--singularityを付加します。

$ cwltoil --singularity tools/smallworkflow.cwl jobs/smallworkflow.cwl

Univa Grid Engine経由で実行する

UGEを使用する場合はオプション--batchSystem gridengineを付加します。Toilはワークフローのstep(CWLファイル内のstepsに記述されているクラス)ごとにqsubでジョブを投入します。デフォルトでqsubコマンドに渡すオプションをあらかじめ環境変数で設定することができます。

$ export TOIL_GRIDENGINE_PE=‘threads’
$ export TOIL_GRIDENGINE_ARGS='-q node.q’
$ cwltoil --singularity --batchSystem gridentine tools/workflow.cwl jobs/workflow.yaml

依存関係のあるstepは、前のstepが終了してinputとなるファイルが生成された後にqsubされます。依存関係がないstepはUGEのリソースが空いていれば同時に実行されます。

まとめ

一見するとシェルスクリプトなどより複雑そうに見えますが、以下のようなケースはCWLのメリットがありそうです。時間を取って習得する価値があると言えるでしょう。 ・コンテナ対応したい Dockerコンテナを使うとアプリケーション環境のセッティングが不要となり便利ですし、Singularityならrootで実行される問題もないのでさらに扱いやすいです。しかし自分でワークフローをコンテナ対応させようとすると、コンテナ内での一時ファイル・ディレクトリの扱いなどで意外につまずいてしまうものです。冒頭にも書きましたが、CWLのエンジンはDockerやSingularityのオプションを自動で付加するので、コンテナを扱うコマンドに慣れていなくてもワークフロー実行に適した方法で使うことができます。 ・複数の環境で同じ解析をしたい Docker/Singularityの選択やジョブスケジューラの使用はコマンドオプションで指定するようになっているので、これらの実行環境を変えてもCWLファイル側は変わりません。すなわち、ジョブスケジューラを使用する大規模システムであっても手元のパソコンであっても原則として同じワークフローが実行できるということになります。エンジンが別で複数開発されているので、クラウド対応のもの、MacやWindowsのPCに対応したものと自分の環境に合わせて選択できます。 ・正確にワークフローを記述したい CWLはedamontologyに対応していて、使用するファイルのフォーマットを指定することができます。 http://edamontology.org/page fastqファイルひとつを取ってもいくつかのフォーマットがあり、曖昧さが残りがちなゲノミクスパイプラインにおいて、より正確さを期することができます。