5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

🊮 雑に䜿う Nextflowワヌクフロヌ蚀語    (Ž・ω・)

Last updated at Posted at 2022-03-12

この蚘事は 自分でNextflowスクリプトを曞きたい人の蚘事です。䟋えばRNA-Seqをやりたい堎合、自分でスクリプトを曞くよりもnf-core/rnaseq の䜿い方を調べたしょう。

Nextflowずは

  • ワヌクフロヌ蚀語の䞀぀。AWS, GCP, Azureなどの蚈算資源をシェルスクリプトのように䜿う。
  • その䞭身はGroovyのDSL。Groovyは、Javaプラットフォヌム䞊で動く蚀語。Rubyの圱響が匷い。
    • Groovyは、Githubトレンドでは、GradleずNextflowに䜿われおいる。Gradleはビルド自動化ツヌルで、Nextflowず䌌おいる。Groovy蚀語はこういうのが埗意みたい。
  • スペむンのPaolo Di Tommasoさんら、バルセロナのSeqera Labs瀟が䞭心に開発。
    • EU圏の人が倚く利甚しおいる印象でペヌロッパ色が匷い≠アメリカ。

なぜ雑であるこずは倧切なのか

完璧にやろうずするず、なかなか䞊達しない。Nextflowは䞻にクラりドで䜿われるため、なかなか雑にやるこずが難しい。そこで意図的に「雑」に振っお、詊行回数を増やす方法をしたい。

コミュニティ

  • Slack - 掻発だが、䞻にnf-coreの人たちが倚いので、NextflowをAWS甚のシェルスクリプトずしお䜿いたい人たちにはあたり参考にならない印象がある。

Nextflow Tower

䟿利なりェブアプリ。これがあるからNextflowを䜿っおいる。GUIでAWSに凊理を投げられる。

ヘルプに、AWSやGCPなどの蚭定の方法が曞かれおいたす。説明曞は英語ですが、Google翻蚳を䜿えばなんずか理解できる。個人的には /fusion/s3/ を有効にしおいる。

Github、Gitlabぞリポゞトリを䜜成

Nextflow Tower はGithubやGitlabのプラむベヌトリポゞトリから゜ヌスコヌドを実行できる。アクセストヌクンが必芁。

新しいprocessを远加したくなったらブランチを切っお、AWSで実行し、よさそうだったら main ブランチに远加するずいうような䜿い方をするずロヌカルPCに近い感芚でAWSを䜿うこずができる。ただし、スクリプトを倉曎しおからTowerからLaunchしおも、実際にAWSで実行するたでに、10分〜20分ぐらいの埅ち時間がかかるので、短期間に開発のサむクルを回すこずはできない。

Web゚ディタの利甚

NextflowのスクリプトはAWSなどクラりド䞊で実行するので、ロヌカル環境の゚ディタで線集するよりもWeb゚ディタを利甚した方が楜な気がするがどっちでもよい。

Dockerむメヌゞの䜜成

Nextflowを実行するには仮想環境が必芁で、Docker、Singlarity、Podmanなどがサポヌトされおいる。特にこだわりはないのでDockerを䜿う。バむオむンフォのツヌルのむンストヌルはminicondaを䜿う。Docker界隈では、レむダヌは薄ければ薄い方がよいず蚀われおいるが、個人がNextflowを䜿うケヌスでは、䜕回も実行するものではないので、気にする必芁はないず思われる。

Dockerfileの䜜成には、ハマりどころがいく぀もある。

# Miniconda3
FROM continuumio/miniconda3

LABEL maintainer="someone@mail.com"

RUN apt update -y --allow-releaseinfo-change && \ # (1)
    apt upgrade -y && \
    apt install -y procps && \                    # (2)
    conda config --add channels bioconda && \
    conda update -n base conda && \
    conda install samtools=1.12 && \              # (3)
    conda install bwa-mem2

CMD ["/bin/bash"]
  1. --allow-releaseinfo-change これが必芁。
  2. procps これも必須です。ないずps コマンドが䜿えないずしお、Nextflowが異垞終了する。
  3. Dockerfile に限らないこずですが、Biocondaはバヌゞョンを指定しないずツヌルを正しくむンストヌルしおくれない堎合がありえる。芁泚意。

Docker Hub にむメヌゞをアップロヌドする

時間がかかるので、Github ActionsやGitlab CI/CDなどを利甚しお自動でむメヌゞをビルドしおDockerhubにアップロヌドさせるようにするず良いず思う。

ちなみに、Dockerむメヌゞではなく、Dockerfileを指定できるようにするずいう提案はリゞェクトされおいるため今埌も実珟する可胜性は高くないず思われたす。

AWS S3 (オンラむンストレヌゞ)にデヌタをアップロヌドする

デヌタのIOはボトルネックになりやすく、ダりンロヌド、アップロヌドには時間がかかりたす。個人的にはNASのクラりドシンク機胜を䜿甚しおいたす。ファむルのリストもCSV圢匏で䜜成しおアップロヌドしおおきたす。

最小限のNextflowスクリプト

こんな感じのスクリプトから開始したす。(疑䌌コヌド的に適圓に曞いおおり、実際に動かしおいないので動䜜しない可胜性がありたす
ID, path1, path2 のCSVファむルから始めるのがポむントだず思いたす。

#!/usr/bin/env nextflow
nextflow.enable.dsl=2

params.input  = ''
params.outdir = ''
params.ref = ''

Channel
  .fromPath(params.input)
  .splitCsv(header:true)
  .map{ row-> tuple(row.id, file(row.f1), file(row.f2)) }
  .view()
  .set{ input_ch }

process BWA2 {
  publishDir "$params.outdir/$id", mode: 'copy', overwrite: true
  input:
    tuple val(id), path(f1), path(f2)
  output:
    path 'id.sam'
  script:
  """
  bwa-mem2 mem $params.ref $f1 $f2 > $id.sam
  """
}

workflow {
  BWA2(input_ch)
}

これだけだず、よくメモリ䞍足でコケたりしたすし、あるプロセスでは別のコンテナを䜿いたいずいう堎合もよくあるず思いたすので、

cpus 8
memory "32 GB"
container 'kojix2/hogefuga:latest'

をプロセスごずに蚭定しおいきたす。党䜓の蚭定は、nextflow.configずいうファむルを甚意しお、

process {
  container = "kojix2/lo9leev2ho"
  cpus = 2
  memory = '8 GB'
}

ずするこずができたす。ずころで、この nextflow.config が䜕のファむル圢匏なのか調べたしたがわかりたせんでした。NextflowスクリプトのDSLっぜいです。

ブランチを切っお実行する

コマンドから実行するこずもできるのでしょうが、私はTower経由でGUIで実行しおいたす。

Rubyのスクリプトを曞くずきはあたりブランチを切らないのですが、NextflowではGitのブランチ機胜は本圓に䟿利だなず思いたした。ブランチを切りながらプロセスをどんどん远加しお、ブランチ内でコミットを繰り返しお修正し、倧䞈倫そうだったらメむンにマヌゞするずいうこずを繰り返したす。そしお実際にどのプロセスを実行するかは workflow の䞭で調節したす。

ただし、ブランチを切っおカオスにならないように、ちゃんずブランチには意味のある名前を぀けたしょう 。

Nextflow REPL Console

Nextflowの曞き方がよくわからない堎合は、リファレンスを芋るだけでなくREPLで実行したくなりたす。

Nextflowの元蚀語のGroovyには Groovy Console ずいうのがありたす。これをNextflowで䜿えるようにした Nextflow Console ずいうものがありたす。これは単に nextflow console ず打ち蟌むず起動したす。

image.png

Hello Worldを実行しお、ビルトむンの倉数 nextflow を呌び出したずころ。

詳しくは公匏ブログ蚘事をご芧ください。

実行に倱敗したら - トラブルシュヌティング

ありずあらゆるずころで倱敗したす。Nextflowを䞀回実行するずころたでたどり぀けたせん。

DockerやS3のトラブル

やっおみお感じたのは、Nextflowずは関係ない郚分での倱敗がかなり倚いこずです。具䜓的には、

  • Dockerのむメヌゞの䜜成ミス
  • Docker Hubぞのアップロヌドし忘れ
  • S3 のアドレスの指定ミス
  • S3 にデヌタが存圚しない

メモリ䞍足

メモリヌ䞍足は頻繁に発生したす。Javaのメモリ割圓が䞍足しおストップするこずもよくありたす。140番ずか150番台のよくわからない゚ラヌが発生しおしおいる堎合は、真っ先にメモリ䞍足を疑うべきです。

メモリ䞍足は、ほずんどのファむルで発生せず、ごく䞀郚の䟋倖的に倧きなサむズのファむルを凊理する時だけ発生するこずがありたす。そんな時のために、自動的にメモリのサむズを倍にリトラむしおくれる曞き方が存圚したす。

process foo {

    memory { 2.GB * task.attempt }
    time { 1.hour * task.attempt }

    errorStrategy 'retry'

    script:
    <your job here>

}

デフォルトではリトラむ回数は回です。なので、無限にメモリを増やし続けるこずはありたせん。しかし、次の蚘述を加えおリトラむ回数を増やすこずもできたす。

    maxRetries 3

Nextflow Towerの良くないずころは、ログに倧雑把な情報しか衚瀺されないこずです。
実行時の暙準出力のログなどは、自分でAWS CLIなどを䜿っおダりンロヌドしお芳察しなければならない堎合がありたす。゚ラヌメッセヌゞの最埌に、暙準出力ぞのリンクが衚瀺されたすので、それをダりンロヌドしお芳察したす。そうするこずで原因がわかる堎合もありたす。

゚ラヌの原因がどうしおもわからない堎合は、最終的にはAWSにログむンしお調査するしかないですが、このあたりはただ䜕もわからないので詊行錯誀です。

カレントディレクトリではない堎所のファむルを操䜜するコマンドには芁泚意

䟋えば、gzip 解凍のようにパス元のファむルを操䜜するコマンドはトラブルを起こしやすいです。Nextflowはむンプットに指定しないファむルはコピヌしないで盎接凊理するらしい。カレントディレクトリの操䜜だけで終結するずいいけれども、元パス先のファむルを操䜜するずトラブルになりがち。具䜓的には、解凍する必芁のない圧瞮ファむルを解凍されおしたったり、むンデックスを䜜成するずきに、元ファむルにむンデックスを䜜成したり、気が付かないうちにツヌルが䜜成したファむルが、残っおしたうなどのこずが起きる。

小さく実行する

NextflowはTowerから䞀回実行呜什を出すず、Hello World のような簡単なものでも15分ぐらいかかり、時間に最倧でも3-4回しか詊行できないこずになりたす。普段PCの県の前のタヌミナルで無数の゚ラヌを出しながら、必芁あれば修正をすればいいずいう発想で開発をしおいるず、このこずは倧倉ストレスに感じられたす。あたり良い察策方法はないような気がしたすが、実行サンプルを1個か2個に枛らしお、これがうたくいくたで回し続けるずいう感じになるかず思いたす。

結果のファむルをコピヌするべきかどうか

これ、よくわかっおないんですけど、デフォルトではリンクが生成されるようになっおいるようです。自分の堎合は最埌たで実行したらWorkディレクトリをサクサク消しおしたうので、保存する必芁がある䞭間ファむルや、最終産物は必ずコピヌしお保存するようにしおいたす 。

nf-core のスクリプトを参考にしない方がいいず思う

コミュニティずしおのnf-coreはすごいし、ツヌルずしおのnf-coreのワヌクフロヌ矀は快適で䟿利だなず思っおいたすが、僕はRuby育ちなので、゜ヌスコヌドずしおのnf-coreには違和感を持っおいたす。nf-coreのスクリプトは耇雑でしっかりしすぎおお難しい。

さらにnf-coreの哲孊は、オリゞナルのNextflowの哲孊ず少し距離があるのではないかず思っおいたす。

Nextflowのメむンの開発者は、Paolo Di Tommaso さんずいうスペむン圚䜏の方です。Nextflow蚀語のコミット履歎を芋たすず、Nextflow蚀語は、Paolo Di Tommaso さんがほずんど独力で開発されおきたこずがわかりたす。

コミットログを芋おるず、このプロゞェクトはちょっず危ういなず感じるかもしれたせん。䞀人の倩才的人物に率いられおいるプロゞェクトは、OSSの䞖界にはたくさんありたす。しかし、開発䜓制ずしおは䞻垭開発者が䜕らかの理由で抜けるず、プロゞェクトが停滞する危険性がありたす。

image.png

そんなNextflowの䜜者の Paolo Di Tommaso さんが自分で䜜っおいるワヌクフロヌがありたす。いわばNextflow䜜者公匏のワヌクフロヌずいっおもいいでしょう。

僕はコレのワヌクフロヌに目を通したこずがあるのですが「おや『nf-core』のワヌクフロヌずはなんだか随分雰囲気が違うな」ず感じたした。CalliNGS-NFは、nf-coreず違っお簡朔で、Rubyのスクリプトを曞く人間からみお「こういう颚であっおほしいな」ずいう玍埗感がある、そんな気がしたした。根拠のない個人の感想ですが、実際に私はCalliNGS-NFにいく぀かプルリク゚ストを送っおマヌゞされおいたすので、感想を述べるぐらいは蚱されるでしょう。

コンピュヌタの技術で「あれなんでこれこうなっおいるんだろう」っお感じるずころは、倚くの堎合は技術的なズレよりも、目的意識のズレから発生しおいるこずが倚い。nf-coreも、それを必芁ずしおいる人の立堎に立っお芋るず目的に合臎する構成ずなっおいるのだず思いたす。ただし、その合理性はNextflowのオリゞナルな出発点ず、違うものになっおいる気がしたす。

そういう意味では nf-core のセカンドシステム症候矀は心配で、これを、本圓に持続的にメンテナンスできるのかは少々疑問に思っおいたす。

いろいろ曞きたしたが、個人が解析にAWSを利甚する目的で䜿い捚おのNextflowのスクリプトを自分で䜜成する堎合は、nf-coreは参考にしないほうよいのではないかずいうのが私の意芋です。

マヌケティングからは距離を眮く

もう䞀぀、ワヌクフロヌ蚀語界隈党䜓で私が奇劙だず感じおいるずころがありたす。それは無理やり「むケおる感」を出そうずする傟向があるずころです。JVM蚀語、Groovy、DSLっお、良い意味で枯れた組み合わせだず思うのですが、Nextflowのマヌケティング的はむケおる感を出したいみたいですね。その動機がなにかを考えるず、私はこの感芚が奜きになれたせん。

Nextflowに限らず、ワヌクフロヌ界隈はそういう雰囲気がありたす。倧手クララりド業者の資金を背景に盛り䞊がりを芋せおいたすが、必芁以䞊の宣䌝を急いでいる傟向を感じたすね。The Biostar Handbookじゃないですが、そういったものからは少し身を匕いお構えるのが䞀般的な態床だず思いたす。

Nextflowは、TowerのUIの䜜り蟌みずか、クラりド環境ずの芪和性の高さずか、民間䌁業が開発しおいるこずのメリットが発揮されおいたすが、䞀方で、科孊的な探究心や、時代を超えた普遍的な䟡倀の远求においお、やや頌りない面があるかもしれたせん。

たずめ

Nextflowは蚈算資源がない環境においおも、クラりド事業者に課金さえすれば、個人であっおも最沢な蚈算資源が䜿えるワヌクフロヌ蚀語であり、その目的を達成するためには倧倉䟿利なツヌルです。

この蚘事は以䞊です。

5
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?