3
1

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 3 years have passed since last update.

nextflowで暗黙的な変数cpusを設定するやり方について

Last updated at Posted at 2021-08-20

はじめに

たとえば、ここにpiyo.nfというファイルがあったとします。

piyo.nf
process PIYO {
  """
  echo $task.cpus > cpus.txt
  """
}

piyo(ピヨ) これはnextflowスクリプトなので、次のように実行することができます。

nextflow run piyo.nf

何もしないと task.cpus は1にされてしまうでねえか

このスクリプトは、task.cpus の結果をcpus.txtに保存するものです。
実行結果を見てみましょう。(どこに保存されているのかわからないのでfindで検索)

find -name cpus.txt | xargs cat

どうでしょうか?おそらく1になっているはずです。Nextflowで書かれたスクリプトは何も考えずに実行すると自動的にいくつCPUを使えるか捕捉してくれるのかな?と思ったんですが、必ずしもそうじゃないみたいなんです。

たとえば次のようなSTARを実行するスクリプトを書いたとき、

  STAR --genomeDir $genomeDir \
       --readFilesIn $reads \
       --runThreadN $task.cpus \ ←ココ

何も考えずに実行すると、--runThreadN 1 で実行されてしまいますよね。
いくつCPUのコアがあっても、1つしか使ってくれない。これでは悲しすぎますね。そうならないためにはどうすればいいのでしょうか?

task.cpusってそもそも何よ?

すみません。僕も正直よくわかっていません。NextflowはGroovy言語のDSLだと思われ、Groovy言語をある程度しっかり理解しないと本当のところはわからないと思うんですよ。

なんで、本当のところはわかっていないんですが、Nextflowのリファレンスをみると、ディレクティブという項目があって、次のように書けばよいことがわかります。

方法1 ディレクティブとして直接プロセス定義に書き込む

piyo2.nf
process PIYO2 {
  cpus 2

  """
  echo $task.cpus > cpus.txt
  """
}

実行します。

nxtflow run piyo2.nf

ピヨ

結果を確認してみましょう。

find -name cpus.txt | xargs cat

さきほどの1に加えて、今度は2という結果も表示されるはずです。

公式リファレンス参照: https://www.nextflow.io/docs/latest/process.html#cpus

方法2 configurationファイルに記述する

しかし、process内に直接CPUのコア数を定義したくないですよね。別の環境で実行することを考えられると、process内でコア数を定義するのは避けた方が良さそうな気がします。なので設定ファイルを作成して、そこに記録しておくというのが良さそうです。ファイル名は nextflow.config として、ワークフローと同じディレクトリに配置します。

nextflow.config
process {
    cpus = 3
}

実行します

nextflow run piyo.nf

ピヨ

結果確認

find -name cpus.txt | xargs cat

先程の1,2だけでなく、3も表示されているはずです。
うまくいかない場合は、ディレクティブで指定したcpusが残っていないか確認してください。

下記のようにすると特定の名前のプロセスだけ設定することもできるようです。

process {
    withName: PIYO {
        cpus = 3
    }
}

公式リファレンス参照:https://www.nextflow.io/docs/latest/config.html#process-selectors

方法3 コマンドライン引数で指定する

でも、結局さっさとためしにコマンドを実行する時に、わざわざ構成ファイルを編集していたら面倒くさいと思います。そこで、1番手軽な方法は、コマンドライン引数でなんとかする方法だと思います。

実行します。

nextflow run piyo.nf -process.cpus=4

ピヨ

結果を確認します。

find -name cpus.txt | xargs cat

1,2,3 だけでなく4も表示されていると思います。コマンドラインオプションは最優先されるので、nextfflow.config を書き換える必要はありません。

--process ではなく -process なのは、これがnextflow runコマンド一般に対するオプションであって、ワークフロー piyo.nf に関するオプションではないからですね。より詳しくは nextflow run -help とするとヘルプが表示されます。ここでも--help ではなく -help であることにご注意ください。

この記事は以上です。
image.png

3
1
0

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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?