AWS ParallelCluster で Apptainer を利用して Trinity を実行してみた

2024.04.22

RNA-Seq データのアセンブルで有名な Trinity を AWS ParallelCluster 上で Apptainer を用いて Trinity コンテナを実行する方法を紹介します。

Trinity コンテナイメージはどちらを使うか

Trinity のセットアップは、公式に提供されているコンテナイメージを利用して手間取る環境構築を省略する方針とします。 現在、Trinity のコンテナイメージは OCI 形式と SIF 形式 の 2 種類提供されています。

  • OCI 形式はコンテナ技術の標準化を目指す Open Container Initiative (OCI) が定義したコンテナイメージのファイル形式です。
  • SIF 形式 (Singularity Image Format): Apptainer (旧 Singularity) で使用されるコンテナイメージのファイル形式です。

Trinity では SIF 形式が推奨されているようです。

Singularity is easier and safer to use than Docker, and is our preferred method for running Trinity.

Trinity in Docker · trinityrnaseq/trinityrnaseq Wiki

Appitainer は OCI 形式のイメージを SIF 形式に変換して実行できるため、Docker Hub からイメージを取得しても Apptainer で実行可能です。ですが、実行の都度コンテナイメージの変換に多少なりともオーバヘッドが発生します。今回は SIF 形式のイメージを利用します。コンテナイメージは Broad Institute の Web サイトで公開されています。

Apptainer の実行環境構築

Apptainer on ParallelCluster の環境構築は以下の記事を参照ください。

Trinity を実行してみる

コンピューティング環境は Appitainer on ParallelCluster を利用して、Trinity コンテナを実行します。

準備

コンピュートノード上で Trinity コンテナを実行するにあたり、もろもろの検証を兼ねて以下の構成を用意します。

Trinity イメージのダウンロード

Appitainer のイメージはローカルに保存可能なファイル(拡張子は.simg)です。公式のリポジトリからダウンロードしてきたイメージファイルを EFS に保存しました。EFS はコンピュートノードにマウントする設定としているため、コンピュートノードからも読み書きが可能です。

/mnt/efsディレクトリは ParallelCluster にマウントしてある EFS です。

wget -P /mnt/efs/image/ https://data.broadinstitute.org/Trinity/TRINITY_SINGULARITY/trinityrnaseq.v2.15.1.simg

サンプルのリードファイルのダウンロード

Trinity の実行用のテストファイルをダウンロードし、ヘッドノードの EBS に保存しました。ヘッドノードのローカルディスクはコンピュートノードに自動マウントされるため、コンピュートノードからも読み書き可能です。

wget -P ~/work/ https://github.com/trinityrnaseq/trinityrnaseq/raw/master/Docker/test_data/reads.left.fq.gz
wget -P ~/work/ https://github.com/trinityrnaseq/trinityrnaseq/raw/master/Docker/test_data/reads.right.fq.gz

コンピュートノードの確認

私の検証環境では Apptainer の実行環境をセットアップする設定が入っているのはpartition2です。Trinity の実行はこちらのパーティションを利用して、コンピュートノードを起動します。

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
test1*       up   infinite     20  idle~ test1-dy-test1-[1-20]
queue1       up   infinite     10  idle~ queue1-dy-queue1-[1-10]
partiton2    up   infinite     10  idle~ partiton2-dy-p2-[1-10]

Trinity 実行

Trinity を実行するために、以下のようなスクリプト trinity.sh を作成しました。このスクリプトでは、EFS に保存した Trinity のコンテナイメージを指定し、ヘッドノードのホームディレクトリに配置したサンプルのリードファイルを入力として使用します。また、出力結果の保存先はコンピュートノードのホームディレクトリ配下を指定しています。

#! /bin/bash

#SBATCH -p partiton2
#SBATCH -N 1

MOUNT_PATH="/mnt"
IMAGE_PATH="/mnt/efs/images"

apptainer exec --bind ${MOUNT_PATH}:/mnt \
      -e ${IMAGE_PATH}/trinityrnaseq.v2.15.1.simg Trinity \
          --seqType fq \
          --left $HOME/work/reads.left.fq.gz \
          --right $HOME/work/reads.right.fq.gz \
          --NO_SEQTK \
          --max_memory 12G --CPU 2 \
          --output $HOME/work/result_trinity/$(date +"%Y%m%d")/trinity_out_dir

このスクリプトをジョブとしてサブミットすることで、Trinity の解析処理が開始されます。

$ sbatch trinity.sh

コンピュートノードが起動し、スクリプトが実行されると標準出力をモニタリングしていると進行状況を確認できます。ジョブの出力結果関連のオプションは未指定でジョブをサブミットしたため、ヘッドノードのホームディレクトリに.outのファイルが保存されたファイルを開きました。

     ______  ____   ____  ____   ____  ______  __ __
    |      ||    \ |    ||    \ |    ||      ||  |  |
    |      ||  D  ) |  | |  _  | |  | |      ||  |  |
    |_|  |_||    /  |  | |  |  | |  | |_|  |_||  ~  |
      |  |  |    \  |  | |  |  | |  |   |  |  |___, |
      |  |  |  .  \ |  | |  |  | |  |   |  |  |     |
      |__|  |__|\_||____||__|__||____|  |__|  |____/

    Trinity-v2.15.1



Left read files: $VAR1 = [
          '/home/ubuntu/work/reads.left.fq.gz'
        ];
Right read files: $VAR1 = [
          '/home/ubuntu/work/reads.right.fq.gz'
        ];
Trinity version: Trinity-v2.15.1
-currently using the latest production release of Trinity.

Monday, April 15, 2024: 09:53:21    CMD: java -Xmx64m -XX:ParallelGCThreads=2  -jar /usr/local/bin/util/support_scripts/ExitTester.jar 0
Monday, April 15, 2024: 09:53:21    CMD: java -Xmx4g -XX:ParallelGCThreads=2  -jar /usr/local/bin/util/support_scripts/ExitTester.jar 1
Monday, April 15, 2024: 09:53:21    CMD: mkdir -p /home/ubuntu/work/result_trinity/20240415/trinity_out_dir
Monday, April 15, 2024: 09:53:21    CMD: mkdir -p /home/ubuntu/work/result_trinity/20240415/trinity_out_dir/chrysalis


----------------------------------------------------------------------------------
-------------- Trinity Phase 1: Clustering of RNA-Seq Reads  ---------------------
----------------------------------------------------------------------------------

---------------------------------------------------------------
------------ In silico Read Normalization ---------------------
-- (Removing Excess Reads Beyond 200 Coverage --
---------------------------------------------------------------

# running normalization on reads: $VAR1 = [
          [
            '/home/ubuntu/work/reads.left.fq.gz'
          ],
          [
            '/home/ubuntu/work/reads.right.fq.gz'
          ]
        ];
--- 省略 ---

3 分ほどで問題なく完了しました。

--- 省略 ---
succeeded(39)   100% completed.

All commands completed successfully. :-)



** Harvesting all assembled transcripts into a single multi-fasta file...

Monday, April 15, 2024: 09:55:22    CMD: find /home/ubuntu/work/result_trinity/20240415/trinity_out_dir/read_partitions/ -name '*inity.fasta'  | /usr/local/bin/util/support_scripts/partitioned_trinity_aggregator.pl --token_prefix TRINITY_DN --output_prefix /home/ubuntu/work/result_trinity/20240415/trinity_out_dir/Trinity.tmp
* [Mon Apr 15 09:55:23 2024] Running CMD: /usr/local/bin/util/support_scripts/salmon_runner.pl Trinity.tmp.fasta /home/ubuntu/work/result_trinity/20240415/trinity_out_dir/both.fa 2
* [Mon Apr 15 09:55:26 2024] Running CMD: /usr/local/bin/util/support_scripts/filter_transcripts_require_min_cov.pl Trinity.tmp.fasta /home/ubuntu/work/result_trinity/20240415/trinity_out_dir/both.fa salmon_outdir/quant.sf 2 > /home/ubuntu/work/result_trinity/20240415/trinity_out_dir.Trinity.fasta
Monday, April 15, 2024: 09:55:26    CMD: /usr/local/bin/util/support_scripts/get_Trinity_gene_to_trans_map.pl /home/ubuntu/work/result_trinity/20240415/trinity_out_dir.Trinity.fasta > /home/ubuntu/work/result_trinity/20240415/trinity_out_dir.Trinity.fasta.gene_trans_map


#############################################################################
Finished.  Final Trinity assemblies are written to /home/ubuntu/work/result_trinity/20240415/trinity_out_dir.Trinity.fasta
#############################################################################

Trinity の実行結果を確認してみる

Trinity の実行結果はコンピュートノードのホームディレクトリに保存する指定をしていました。ヘッドノードのホームディレクトリを確認すると、Trinity の実行結果を確認できます。--outputオプションの指定が適当故に生成された FASTA ファイルの名前がイマイチになりました。

ubuntu@ip-10-0-1-235:~/work/result_trinity/20240415$ pwd
/home/ubuntu/work/result_trinity/20240415

ubuntu@ip-10-0-1-235:~/work/result_trinity/20240415$ ll
total 172
drwxrwxr-x 3 ubuntu ubuntu   4096 Apr 15 09:55 ./
drwxrwxr-x 4 ubuntu ubuntu   4096 Apr 15 09:53 ../
drwxrwxr-x 8 ubuntu ubuntu   4096 Apr 15 09:55 trinity_out_dir/
-rw-rw-r-- 1 ubuntu ubuntu 155786 Apr 15 09:55 trinity_out_dir.Trinity.fasta
-rw-rw-r-- 1 ubuntu ubuntu   3028 Apr 15 09:55 trinity_out_dir.Trinity.fasta.gene_trans_map

コンピュートノード上の Apptainer で Trinity コンテナは問題なく実行できました。

ubuntu@ip-10-0-1-235:~/work/result_trinity/20240415$ ll trinity_out_dir
total 40548
drwxrwxr-x 8 ubuntu ubuntu     4096 Apr 15 09:55 ./
drwxrwxr-x 3 ubuntu ubuntu     4096 Apr 15 09:55 ../
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 .iworm.25.asm.ok
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 .iworm_renamed.25.asm.ok
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 .jellyfish_count.25.mincov1.asm.ok
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 .jellyfish_dump.25.mincov1.asm.ok
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 .jellyfish_histo.25.mincov1.asm.ok
-rw-rw-r-- 1 ubuntu ubuntu      764 Apr 15 09:55 Trinity.timing
-rw-rw-r-- 1 ubuntu ubuntu   193846 Apr 15 09:55 Trinity.tmp.fasta
drwxrwxr-x 2 ubuntu ubuntu     4096 Apr 15 09:55 Trinity.tmp.fasta.salmon.idx/
drwxrwxr-x 2 ubuntu ubuntu     4096 Apr 15 09:55 __salmon_filt.chkpts/
-rw-rw-r-- 1 ubuntu ubuntu  6838210 Apr 15 09:53 both.fa
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 both.fa.ok
-rw-rw-r-- 1 ubuntu ubuntu        6 Apr 15 09:53 both.fa.read_count
drwxrwxr-x 2 ubuntu ubuntu     4096 Apr 15 09:53 chrysalis/
-rw-rw-r-- 1 ubuntu ubuntu   215730 Apr 15 09:53 inchworm.DS.fa
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 inchworm.DS.fa.finished
-rw-rw-r-- 1 ubuntu ubuntu        7 Apr 15 09:53 inchworm.kmer_count
drwxrwxr-x 2 ubuntu ubuntu     4096 Apr 15 09:53 insilico_read_normalization/
-rw-rw-r-- 1 ubuntu ubuntu 15075968 Apr 15 09:53 jellyfish.kmers.25.asm.fa
-rw-rw-r-- 1 ubuntu ubuntu     1891 Apr 15 09:53 jellyfish.kmers.25.asm.fa.histo
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 left.fa.ok
-rw-rw-r-- 1 ubuntu ubuntu     4163 Apr 15 09:53 partitioned_reads.files.list
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 partitioned_reads.files.list.ok
-rw-rw-r-- 1 ubuntu ubuntu      396 Apr 15 09:55 pipeliner.24593.cmds
drwxrwxr-x 3 ubuntu ubuntu     4096 Apr 15 09:53 read_partitions/
-rw-rw-r-- 1 ubuntu ubuntu    15658 Apr 15 09:53 recursive_trinity.cmds
-rw-rw-r-- 1 ubuntu ubuntu    15658 Apr 15 09:55 recursive_trinity.cmds.completed
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 recursive_trinity.cmds.ok
-rw-rw-r-- 1 ubuntu ubuntu        0 Apr 15 09:53 right.fa.ok
drwxrwxr-x 5 ubuntu ubuntu     4096 Apr 15 09:55 salmon_outdir/
-rw-rw-r-- 1 ubuntu ubuntu 19094847 Apr 15 09:53 scaffolding_entries.sam

おわりに

Apptainer on ParallelCluster で Trinity 実行を確認しました。 今回は実行確認ということもあり、無難にオンプレスパコンとそう変わりない構成でした。次回はクラウドネイティブな構成でよりクラウドの恩恵を得られる構成を検討してみます。 SIF 形式のイメージの保存先は S3 にし、Moutpoint for Amazon S3 でコンピュートノードにマウントして実行可能かなどを検証する予定です。

参考