Nextflow Basic Training の Simple RNA-Seq workflow を Amazon EC2 で実行してみた

2023.09.17

Nextflow Basic Training で公開されているSimple RNA-Seq workflowを EC2 上で実行環境を構築がなかなか大変でした。環境構築にあたりハマった箇所を備忘録として残しておきます。

ワークフローの実行内容

  1. Salmon … ペアエンドリードファイル(.fasta)を読んでインデックスを付ける
  2. Slamon … 定量
  3. fastqc … クオリティチェック
    • 実行環境構築に断念
  4. MultiQC … レポート作成
    • Conda 環境だとうまくいかなく pip install で代用

ワークフロー定義は以下のリンクを参考にしています。

Simple RNA-Seq workflow - training.nextflow.io

ハマった箇所

Ubuntu 22.04 LTS の EC2 上に Bioconda 環境を整え、Simple RNA-Seq workflow を実行可能な環境を構築していました。その中で以下の箇所がハマり時間を溶かしました。

  1. fastqc の実行失敗
  2. multiqc のインストール失敗

fastqc の実行失敗

conda install でインストールしたfastqcが以下のエラーで実行に失敗しました。

Exception in thread "Thread-1" java.lang.UnsatisfiedLinkError: no fontmanager in system library path: /home/ubuntu/miniconda/envs/nextflow/lib/jvm/lib
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2403)
	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818)

切り分けのためfastqcのバイナリファイルをダウンロードし、fastqcコマンドはバイナリファイルから実行しました。

切り分け結果

Java ランタイム環境に依存した問題でした。

  • Conda 環境の Java ランタイム環境(openjdk=17.0.7.4)ではコマンド実行に失敗
    • Conda 環境をアクティベート状態
  • ホスト(EC2)にインストールした Java ランタイム環境(19)は成功
    • Conda 環境は非アクティベート

Nextflow のワークフロー実行時、バイナリファイルのfastqcを実行しようと思うも Conda 環境がアクティベートする都合、Java ランタイム環境が Conda 環境のバージョンになり、fastqcの実行に失敗します。 結果、Conda 環境の Java ランタイム環境のバージョンを成功実績のあるバージョンへ入れ替えようがうまくいきませんでした。

openjdk version "17.0.7" 2023-04-18
OpenJDK Runtime Environment GraalVM CE 17.0.7+4.1 (build 17.0.7+4-jvmci-23.0-b10)
OpenJDK 64-Bit Server VM GraalVM CE 17.0.7+4.1 (build 17.0.7+4-jvmci-23.0-b10, mixed mode, sharing)

今回のワークフロー上、クリティカルな処理でないクオリティチェックの実行だったためfastqcの実行はスキップしました。

multiqc のインストール失敗

Bioconda 用のチャネル設定済みです。

$ conda config --get channels                                                                                                                                        (nextflow)
--add channels 'defaults'   # lowest priority
--add channels 'bioconda'
--add channels 'conda-forge'   # highest priority

multiqcのインストールはできませんでした。

$ conda install multiqc                                                                                                                                                  (nextflow)
Retrieving notices: ...working... done
Collecting package metadata (current_repodata.json): -

Conda 環境で必要なアプリケーションをインストールしていたのですが、諦めてpipでインストールしました。

$ pip3 install multiqc                                                                                                                                                   (nextflow)

注意事項としてはpipでインストールしたことにより、Nextflow からmultiqcコマンドを実行するためには明示的にパスを指定することになりました。

process MULTIQC {
    publishDir params.outdir, mode:'copy'

    input:
    path '*'

    output:
    path 'multiqc_report.html'

    script:
    """
    /home/ubuntu/.local/bin/multiqc .
    """
}

multiqcだけは Conda で管理できない実行環境となってしまいました。

最終的に実行できた設定

EC2 上で手直したした Simple RNA-Seq workflow を実行できたときのワークフロー定義などを紹介します。

Conda 環境

環境情報を出力した結果を載せます。

> conda env export -n nextflow > env_nextflow.yml
出力結果が長いため折りたたみ

env_nextflow.yml

name: nextflow
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - alsa-lib=1.2.8=h166bdaf_0
  - bzip2=1.0.8=h7f98852_4
  - c-ares=1.19.1=hd590300_0
  - ca-certificates=2023.5.7=hbcca054_0
  - coreutils=9.3=h0b41bf4_0
  - curl=8.1.2=h409715c_0
  - expat=2.5.0=hcb278e6_1
  - fastqc=0.12.1=hdfd78af_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=hab24e00_0
  - fontconfig=2.14.2=h14ed4e7_0
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - freetype=2.12.1=hca18f0e_1
  - gettext=0.21.1=h27087fc_0
  - giflib=5.2.1=h0b41bf4_3
  - graalpy=23.0.0=0_graalvm_native
  - graalpy-graalvm=23.0.0=h4d560db_0
  - graphite2=1.3.13=h58526e2_1001
  - icu=58.2=hf484d3e_1000
  - jemalloc=5.3.0=hcb278e6_0
  - keyutils=1.6.1=h166bdaf_0
  - krb5=1.20.1=h81ceb04_0
  - lcms2=2.15=haa2dc70_1
  - lerc=4.0.0=h27087fc_0
  - libboost=1.73.0=h28710b8_12
  - libcups=2.3.3=h36d4200_3
  - libcurl=8.1.2=h409715c_0
  - libdeflate=1.18=h0b41bf4_0
  - libedit=3.1.20191231=he28a2e2_2
  - libev=4.33=h516909a_1
  - libexpat=2.5.0=hcb278e6_1
  - libffi=3.4.2=h7f98852_5
  - libgcc-ng=13.1.0=he5830b7_0
  - libglib=2.76.3=hebfc3b9_0
  - libgomp=13.1.0=he5830b7_0
  - libiconv=1.17=h166bdaf_0
  - libjemalloc=5.3.0=hcb278e6_0
  - libjpeg-turbo=2.1.5.1=h0b41bf4_0
  - libnghttp2=1.52.0=h61bc06f_0
  - libnsl=2.0.0=h7f98852_0
  - libpng=1.6.39=h753d276_0
  - libssh2=1.11.0=h0841786_0
  - libstdcxx-ng=13.1.0=hfd8a6a1_0
  - libtiff=4.5.1=h8b53f26_0
  - libuuid=2.38.1=h0b41bf4_0
  - libwebp-base=1.3.0=h0b41bf4_0
  - libxcb=1.15=h0b41bf4_0
  - libzlib=1.2.13=hd590300_5
  - ncurses=6.4=hcb278e6_0
  - nextflow=23.04.1=h2a3209d_3
  - openjdk=17.0.7.4=0_graalvm230b10
  - openssl=3.1.1=hd590300_1
  - patch=2.7.6=h7f98852_1002
  - pcre2=10.40=hc3806b6_0
  - perl=5.32.1=2_h7f98852_perl5
  - pixman=0.40.0=h36c2ea0_0
  - pthread-stubs=0.4=h36c2ea0_1001
  - python_abi=3.10=3_graalpy230_310_native
  - salmon=0.13.1=h86b0361_0
  - tbb=2020.2=h4bd325d_4
  - xorg-fixesproto=5.0=h7f98852_1002
  - xorg-inputproto=2.3.2=h7f98852_1002
  - xorg-kbproto=1.0.7=h7f98852_1002
  - xorg-libice=1.1.1=hd590300_0
  - xorg-libsm=1.2.4=h7391055_0
  - xorg-libx11=1.8.6=h8ee46fc_0
  - xorg-libxau=1.0.11=hd590300_0
  - xorg-libxdmcp=1.1.3=h7f98852_0
  - xorg-libxext=1.3.4=h0b41bf4_2
  - xorg-libxfixes=5.0.3=h7f98852_1004
  - xorg-libxi=1.7.10=h7f98852_0
  - xorg-libxrender=0.9.10=h7f98852_1003
  - xorg-libxtst=1.2.3=h7f98852_1002
  - xorg-recordproto=1.14.2=h7f98852_1002
  - xorg-renderproto=0.11.1=h7f98852_1002
  - xorg-xextproto=7.3.0=h0b41bf4_1003
  - xorg-xproto=7.0.31=h7f98852_1007
  - xz=5.2.6=h166bdaf_0
  - zlib=1.2.13=hd590300_5
  - zstd=1.5.2=h3eb15da_6
prefix: /home/ubuntu/miniconda/envs/nextflow

ワークフローの内容

以下のリンクを参考に Bioconda でインストールした Nextflow で動作させるために修正を加えたワークフローの定義です。

Simple RNA-Seq workflow - training.nextflow.io

myTest.nf

/*
 * pipeline input parameters
 */
params.reads = "$projectDir/data/ggal/gut_{1,2}.fq"
params.transcriptome_file = "$projectDir/data/ggal/transcriptome.fa"
params.multiqc = "$projectDir/multiqc"
params.outdir = "results"
log.info """\
    R N A S E Q - N F   P I P E L I N E
    ===================================
    transcriptome: ${params.transcriptome_file}
    reads        : ${params.reads}
    outdir       : ${params.outdir}
    """
    .stripIndent()

/*
 * define the `index` process that creates a binary index
 * given the transcriptome file
 */
process INDEX {
    input:
    path transcriptome

    output:
    path 'salmon_index'

    script:
    """
    salmon index --threads $task.cpus -t $transcriptome -i salmon_index
    """
}

process QUANTIFICATION {
    tag "Salmon on $sample_id"
    publishDir params.outdir, mode:'copy'

    input:
    path salmon_index
    tuple val(sample_id), path(reads)

    output:
    path "$sample_id"

    script:
    """
    salmon quant --threads $task.cpus --libType=U -i $salmon_index -1 ${reads[0]} -2 ${reads[1]} -o $sample_id
    """
}

process FASTQC {
    tag "FASTQC on $sample_id"

    input:
    tuple val(sample_id), path(reads)

    output:
    path "fastqc_${sample_id}_logs"

    script:
    """
    mkdir fastqc_${sample_id}_logs
    fastqc -o fastqc_${sample_id}_logs -f fastq -q ${reads}
    """
}

process MULTIQC {
    publishDir params.outdir, mode:'copy'

    input:
    path '*'

    output:
    path 'multiqc_report.html'

    script:
    """
    /home/ubuntu/.local/bin/multiqc .
    """
}

workflow {
    Channel
        .fromFilePairs(params.reads, checkIfExists: true)
        .set { read_pairs_ch }

    index_ch = INDEX(params.transcriptome_file)
    quant_ch = QUANTIFICATION(index_ch, read_pairs_ch)
    MULTIQC(quant_ch.collect())
}

workflow.onComplete {
    log.info ( workflow.success ? "\nDone! Open the following report in your browser --> $params.outdir/multiqc_report.html\n" : "Oops .. something went wrong" )
}

ワークフローの実行結果

手直ししたワークフロー(myTest.nf)を実行した結果です。

> nextflow run myTest.nf                                      (nextflow)
OpenJDK 64-Bit Server VM warning: -XX:ThreadPriorityPolicy=1 may require system level permission, e.g., being the root user. If the necessary permission is not possessed, changes to priority will be silently ignored.
N E X T F L O W  ~  version 23.04.1
Launching `myTest.nf` [romantic_mandelbrot] DSL2 - revision: 5de9ec0c05
R N A S E Q - N F   P I P E L I N E
===================================
transcriptome: /home/ubuntu/bioconda/training/nf-training/data/ggal/transcriptome.fa
reads        : /home/ubuntu/bioconda/training/nf-training/data/ggal/gut_{1,2}.fq
outdir       : results

executor >  local (3)
[67/e34e3c] process > INDEX                          [100%] 1 of 1 ✔
[43/fc08a4] process > QUANTIFICATION (Salmon on gut) [100%] 1 of 1 ✔
[36/d5ce9b] process > MULTIQC                        [100%] 1 of 1 ✔

Done! Open the following report in your browser --> results/multiqc_report.html

実行結果のmultiqc_report.htmlを Web ブラウザで表示すると以下のレポートを確認できました。EC2 から必要なファイルをローカル PC へダウンロードしてきて Chrome で開いています。

おわりに

Nextflow のワークフロー実行環境を Health Omics へ移行に必要な作業を洗い出すために、検証のファーストステップとして、EC2 上で Nextflow の以下のワークフローが動作する環境を構築しました。Bioconda を使えば必要なアプリケーションのインストール、管理は容易という予想ではじめたのですが、うまくいかなくセットアップだけでも大変で驚きました。Health Omics で実行するために EC2 に構築した環境をコンテナ化しないといけません。Bioconda でセットアップすれば移植も簡単という思惑だったのですが早々に計画が狂いました。

参考