🐓

CWL の requirements 一巡り: SoftwareRequirement

2020/12/09に公開

この記事は CWL Advent Calendar 2020 の9日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている SoftwareRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

準拠度テストには SoftwareRequirement を使用したテストが存在しないため、User Guide の例を紹介します。

User Guide: Specifying Software Requirements: custom-types.cwl

cwlVersion: v1.0
class: CommandLineTool

label: "InterProScan: protein sequence classifier"

doc: |
      Version 5.21-60 can be downloaded here:
      https://github.com/ebi-pf-team/interproscan/wiki/HowToDownload

      Documentation on how to run InterProScan 5 can be found here:
      https://github.com/ebi-pf-team/interproscan/wiki/HowToRun

requirements:
  ResourceRequirement:
    ramMin: 10240
    coresMin: 3
  SchemaDefRequirement:
    types:
      - $import: InterProScan-apps.yml

hints:
  SoftwareRequirement:
    packages:
      interproscan:
        specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ]
        version: [ "5.21-60" ]

inputs:
  proteinFile:
    type: File
    inputBinding:
      prefix: --input
  applications:
    type: InterProScan-apps.yml#apps[]?
    inputBinding:
      itemSeparator: ','
      prefix: --applications

baseCommand: interproscan.sh

arguments:
 - valueFrom: $(inputs.proteinFile.nameroot).i5_annotations
   prefix: --outfile
 - valueFrom: TSV
   prefix: --formats
 - --disable-precalc
 - --goterms
 - --pathways
 - valueFrom: $(runtime.tmpdir)
   prefix: --tempdir


outputs:
  i5Annotations:
    type: File
    format: iana:text/tab-separated-values
    outputBinding:
      glob: $(inputs.proteinFile.nameroot).i5_annotations

$namespaces:
 iana: https://www.iana.org/assignments/media-types/
 s: https://schema.org/
$schemas:
 - http://schema.org/version/9.0/schemaorg-current-http.rdf

s:license: https://spdx.org/licenses/Apache-2.0
s:copyrightHolder: "EMBL - European Bioinformatics Institute"

それなりに大きな CWL ファイルですが、今回の説明に必要なのは以下の部分だけです。

hints:
  SoftwareRequirement:
    packages:
      interproscan:
        specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ]
        version: [ "5.21-60" ]

SoftwareRequirement にツールの情報を記述することで、実行処理系の実行前に自動的にソフトウェアをインストールさせることが可能になります。上の例の場合、ツール実行に必要なのは InterProScan というツールのバージョン 5.21-60 であることがわかります。

CWL のリファレンス実装である cwltool の場合、--beta-dependency-resolvers-configuration--beta-conda-dependencies オプションを使用することで、SoftwareRequirement に書かれたパッケージやモジュールのインストールや有効可が行われます[2]

重要なのは、上記オプションを用いた場合、パッケージのインストールやモジュールの有効化という破壊的変更が実行環境に対して行われることです。そのため、実行前に動いていた別のソフトウェアが動かなくなる可能性があります(他のツールの動作に必要なパッケージも依存関係に巻き込まれてアップデートされる可能性があるため)。この挙動は再現性という点では望ましくないため、通常は DockerRequirement などのコンテナを使ったツール実行をおすすめします。

SoftwareRequirement の使い所

多くの場合、SoftwareRequirement を使ってツールを破壊的にインストールするよりも、DockerRequirement を使ってコンテナ上でツールを動かすほうが適切です。

一方で SoftwareRequirement でなければ対応できない状況もあります。具体的には以下の状況です。

  • コンテナを利用したツール実行ができない
    • dockerpodmansingularity などのコンテナランタイムの実行が制限された環境、ということです。
  • 「あらかじめ必要なツールをインストールしたマシンを用意し、そこでワークフローを実行する」という手段も取れず、ワークフロー実行時に必要なツールもインストールする必要がある

例えば、コンテナがサポートされていない計算機クラスター(スパコンなど)にワークフローを動かすジョブを投入する、という状況がこれに該当します。この場合、SoftwareRequirement に必要なツール情報を記述しておくことで、ワークフロー実行に必要なツールのインストール等のスクリプトを自分で書く必要がなくなり、また同一クラスターでのワークフローの再現性を確保することが容易になります。

脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎

  2. 詳細は cwltool のドキュメントを確認してください。 ↩︎

Discussion