はじめての環境DNA
研究室から現場まで、実践で使える知識を!
データの解析方法

1coreしか使ってくれないclassify-consensus-blastを並列実行して早くする

お題の通り、1coreしか使ってくれないQIIME2のconsensus BLASTをスピードアップするために並行実行するように工夫したよ。という記事です。

使用コア数次第ですが、24スレッドで7倍ほどスピードアップできました。

はじめに

2023.2リリースのqiime2には、いくつかの相同性検索法が搭載されています。

世界的に見て最も一般的な相同性検索はBLASTといっても過言ではありませんし、QIIME2にも相同性検索ツールとしてBLAST検索ができるclassify-consensus-blastが提供されています。

BLAST+に実装されているBlastnとは動作が異なります。解析をする上で影響が大きいのは1コアでしか動作しないことです。

ツールのissueによると、fastaファイルをそのままデータベースに使用するBLAST+のsubjectオプションが元凶のようです。

以下はQIIME2のBlastn実行コマンドの部分

https://github.com/qiime2/q2-feature-classifier/blob/2a86cf43a4290fd96784dca83bd55af5db574826/q2_feature_classifier/_blast.py#L62-L65

遅いなら外せばいいのでは?とも思いますが、subjectオプションがQIIME2で使われているのは理由があります。Qiime2では独自データ保存形式としてqzaを使用しています。

解析用データとメタデータが組み合わせたような構造を持つこの独自ファイル形式は、もちろんですがblastdbには対応しておらず、同梱できる配列データは基本的にFastaのみです。

そのため、QIIME2ではデータベースファイルもfasts として使用する必要があり、subjectオプションの使用が必須となるため、classify-consensus-blastは1core使用に限定されているというのが現状です

Blast検索だけQIIME2外でBlast+を使用して、解析を進めることもできますが、冗長性・互換性、後続の解析などを考慮すると、可能な限りQIIME2内でデータ処理するのが望ましいと思い、並列実行が可能な方法を模索しました。

全体の流れ

アプローチは至って簡単です。1coreでしか動作しないのであれば、使用可能コアの分だけデータを分割した後に結果を結合すれば並列処理したのと同じだろうという考えで進めています。

以下のステップで、こちらのgithubリポジトリに用意したDemoデータを用いて説明していきます。•••のマークからダウンロードして以下に説明するフォルダに配置して下さい。

  1. query配列の変換 qza -> fasta
  2. seqkitによる分割 split
  3. qiime importによる変換 fasta -> qza
  4. reference データベースファイルの変換 fasta, tsv -> qza
  5. parallelを用いたclassify-consensus-blast
  6. Blast結果の変換 -> 結合 -> 変換 qza -> tsv -> qza

GitHubリポジトリにあるリファレンスデータはこちらの記事で作成したものです。

準備と用意するもの

以下の3データを用意します。

  • Denoisngまたはclustering後のquery配列 : (qza)
  • Referenceとなる配列データ : (qza or fasta)
  • Referenceとなるtaxonomyデータ : (qza or tsv)

使用したソフトウェアは以下の通り

  • seqkit (Version: 2.3.0 or later)
  • qiime2 (2022.11 or later)
  • parallel (20221122 or later)

qiime2用の仮想環境は用意しておきましょう(以下の記事のqiime2 core 2022.11 distributionをcondaの仮想環境にインストールまでを参照)。

q2reformatフォルダをデスクトップ上のbioinfoフォルダ内に作成します。その後、デスクトップ上でコマンドラインを開いて以下のように入力。

次に出力フォルダ等を作成

q2reformatをベースとして、01outputのqza, qzv, 02refフォルダにデータを出力していきます。

Referenceとなる2つのデータファイルは、解凍済みの状態で02refフォルダに、query配列ファイルは01output/qzaに配置します。

ここの段階で以下のようなフォルダ構造になっていればOK。

query配列の変換 qza -> fasta

Blastnを並列実行できるように配列データを分割していきます。seqkitで分割できる形式にするために、qzaファイルをfastaファイルへ変換します。

otherフォルダにdna-sequences.fastaファイルが出力されればOKです。

seqkitによる分割 : split

query配列を分割していきます。分割する数は多いほうが同時に多くのデータを並列処理できるので自身のPCのthread数に応じて適宜変更してください。

otherフォルダ下にsep_seqというフォルダが生成され、その中にdna-sequences.part_0XX.fastaという24個のfastaファイルが生成されていればOKです。

qiime importによる変換 : fasta -> qza

分割したfastaファイルをQIIME2で扱えるように、importします。

otherフォルダ下のsep_seqフォルダ内にdna-sequences.part_0XX.qzaというファイルが生成されていればOKです。

reference データベースファイルの変換 : fasta, tsv -> qza

fasta形式のreference 配列データベースファイルをqzaファイルに変換します。

識別子と系統分類情報が対応する形になっているtsvファイルをqzaファイルに変換します。

02refフォルダ下に16S_ribosomal_RNA_seq_acc.qza16S_ribosomal_RNA_qiime2-form.qzaが生成されていればOKです。

parallelを用いたclassify-consensus-blast

並列実行するためにGNU parallelを使用してclassify-consensus-blastを実行します。並行実行数は分割したfastaファイルの数としておきます。

blast_resフォルダ下にdna-sequences.part_0XX.qzaというフォルダが、qzaフォルダ下にはBlasted_res_dna-sequences.part_0XX.qzaファイルが生成されていればOKです。7分程度で終了しました。

Blast結果の変換 -> 結合 -> 変換 : qza -> tsv -> qza

QIIME2 classify-consensus-blastの出力formatはblastnの-outfmt 6と同じでヘッダーなしタブ区切りテキストです。

そのため、出力結果をcatで結合した後にqza形式に変換すれば1つのquery配列データに対してBlastnを実行したのと同じ結果が得られるはずです。

まず、Blastnの出力結果qzaファイルをtsv形式に変換します。

次に、分割されているblastnの結果ファイルをcatで結合していきます。

出力結果を確認してみます。

ちゃんと検索はかかっていそうです。

最後にcatで結合したtsvファイルをqza形式に変換します。

qzaフォルダにblast_results.qzaというファイルが生成されていればOKです。

単一ファイルでclassify-consensus-blastを実行すると

ちなみに、seqkitでqueryファイルを分割せずにclassify-consensus-blastを実行すると87分かかりました。

classify-consensus-blastについて

通常のBLASTnは1つのquery配列に対して、e-valueやBitスコアに応じた分類情報が得られます。

一方、consensusメソッドを採用した分類法はBlastnで得られた結果の分類階級を、実行したコマンドパラメーターに応じて調整し、最終的には1系統の情報にして結果を出力します。

この論文によると、

  1. perc_identityに指定した類似度でクエリ配列と一致した参照配列をmaxacceptsで指定した数まで出力
  2. 少なくともmin_consensusで指定した値で一致する分類学的系統を決定

します。

この時、min_consensusパラメーターが最終結果に大きくかかわってきます。

例えば、maxaccepts = 3、min_consensus = 0.51(default)で分類された以下のようなトップヒットの結果あった場合、

  • k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__brevis
  • k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__brevis
  • k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__delbrueckii

最終的に割り当てられる分類学的系統は以下の通り。

  • k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__brevis

ただし、min_consensus = 0.99とした場合には種レベルの同定ではコンセンサスが取れないので、属レベルまで分類階級を下げた以下の結果が最終的な系統分類の結果になります。

  • k__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus

どれとも断言できないなら、保守的に同定しようという考え方ですね。

まとめコード

q2formatフォルダにqiime2-blast.shファイルを配置して、bash qiime2-blast.shで実行可能なはずです(実行時間10分程度)。

免責事項

本記事の情報・内容については可能な限り十分注意は払っていますが、正確性や完全性、妥当性および公平性について保証するものではありません。本記事の利用や閲覧によって生じたいかなる損害について責任を負いません。また、本記事の情報は予告なく変更される場合がありますので、ご理解くださいますようお願い申し上げます。

ABOUT ME
しばた
分析・データ解析なんでもします。環境DNA使って研究したい方、気軽に相談ください。