2021 1/4. 1/5 文章修正
あけましておめでとうございます。今年もよろしくお願いします。新年1回目は、年末に購入したZEN3世代CPUの5950xとZEN2世代のRyzenやThreadRipperのWGSデータのマッピングタイムを比較した結果を紹介します。
5950xを購入した動機(*1)は、毎日行う、そこまで重くはないが、そこまで軽くもない類の計算を高速化することにあるのですが、1週間ほど使っているうちに、ZEN2世代のCPUと比較してどのくらい速くなっているのか気になってきました。そこで年末年始の計算機の空き時間を使って簡単なベンチマークを実行した結果を紹介します。1回ずつしか行なっていない上に環境を統一できていないところもあるので、あくまで傾向をラフに探るものだと思って下さい。
使用した計算機
1、Ryzen5950x自作機
- CPU: Ryzen5950x 16コア (合計32スレッド)
- CPUクーラー: TH360 ARGB Sync Snow Edition
- memory: DDR4 3600MHz (CL16) 16B x 4 (合計64 GB)
- GPU: GTX660Ti
- motherboard: MPG B550 GAMING PLUS(MSI)
- storage: Crucial M2 SSD 1TB x1
- PCケース: Fractal Design Define R6
- OS: ubuntu18.04LTS
2、Ryzen3700x自作機
- CPU: Ryzen3700x 8コア (合計16スレッド)
- CPUクーラー: 3700x純正空冷クーラー
- memory: DDR4 2667MHz 16B x 2 (合計32 GB)
- GPU: GTX1080
- motherboard: B450M Steel Legend(ASRock)
- storage: Crucial M2 SSD 1TB x1
- PCケース: 舞黒透 MK-01W
- OS: ubuntu18.04LTS
3、TR3990x自作機
- CPU: Ryzen Threadripper 3990X 64コア (合計128スレッド)
- CPUクーラー: ROG RYUJIN 360
- memory: DDR4 3000MHz 16GB x 8(合計128 GB)
- GPU: GTX 1600
- motherboard: TRX40 Taichi
- storage: Crucial M2 SSD 1TB
- PCケース: Thermaltake Core V51
- OS: ubuntu18.04LTS
4、mac mini 2018上位
- CPU: core i7 8700B 6コア (合計12スレッド)
- memory: DDR4 2667MHz 16GB x 2 (合計32 GB)
- GPU: CPU内蔵グラフィック
- storage: M.2 SSD 512 GB
- OS: OSX mojave
5、xeon platinum自作機
- CPU: xeon E5 platinum 2.1 GHz/ 28コア x 1 (合計56スレッド)
- memory: DDR4 ECC Registered 64GB x 8 (合計512 GB)
- GPU: quadro K4000
- system: drive: SATA3 SSD:1TB
- OS: ubuntu18.04LTS
- PCケース: 1U ラックマウントサーバー
5950xのメモリはマザーボードのデフォルトのXMPプロファイルを使って3600MHz・CL16で動作させた。
計測内容
1、タイムコマンド(macos: /usr/bin/time、ubuntu: /usr/bin/time)の"real time"で、minimap2(バージョン2.17-r941)によるマッピングの時間を測った。minimap2は、condaを使ってbiocondaチャネルから各プラットフォーム向けのバイナリをダンロードした(link)。
conda create -n benchmark python==3.9 -y
conda activate benchmark
conda install -c bioconda -y minimap2
仮想環境をアクティベート後、以下のコマンドを実行した。
time minimap2 -ax sr -t <thread number> ref.fasta R1.fq.gz R2.fq.gz > out.sam
シークエンシングデータとしてSRAのERR2173372(シロイヌナズナのWGSデータ)を使用した。リファレンスゲノムとして、Ensembl PlantからArabidopsis thaliana(TAIR10)のGCA_000001735.1を使用した。
2、unicycler(バージョン0.4.8)を使って、ペアエンドのショートリードとONTのロングリードのハイブリッドアセンブリが完了するまでの時間を計測した。unicyclerは、condaを使ってbiocondaチャネルから各プラットフォーム向けのバイナリをダンロードした(link)。
conda activate benchmark
conda install -c bioconda -y unicycler
仮想環境をアクティベート後、以下のコマンドを実行した。
time unicycler -1 R1.fq.gz -2 R2.fq.gz -l ONT.fq.gz -o outdir -t <thread number> --keep 3
シークエンシングデータとして5Mbバクテリアのシークエンシングデータ(illuminaペアエンドシークエンシングデータ500MBx2、&ONTシークエンシングデータ2GB)を使用した。
unicyclerはdockerの仮想環境でもランした。 イメージは
https://hub.docker.com/r/nanozoo/unicycler/tags?page=1&ordering=last_updated
のTAG: 0.4.8-0--5b04490 を使用。
docker pull nanozoo/unicycler:0.4.8-0--5b04490
unicyclerはアセンブラの複数の工程を統合してできる限り自動化を推し進めたパイプラインであり、内部では、バイオインフォマティクスのツールやスクリプトが順番に、または並列に動作している。いずれも頻繁に利用されるツールである。従って、unicyclerのラインタイムはルーティンで行うコマンドのトータルのランタイムの目安になると考えた。
結果
まずマッピングタイムをまとめました。ランタイムが長かった順に降順で並べると、結果は以下のようになりました。
(n=1)
一番時間がかかったmac mini 12threadsのランタイムを100として、相対値をグラフにしました。
ZEN2世代の3700x 16スレッド指定時のマッピングはmac mini 2018(intelの8700B)の倍速く、半分の時間でSAM出力が完了しました。ZEN3世代の5950x 32スレッド指定はさらに高速で、3700x 16スレッドのさらに半分の時間でマッピングを終えました。mac miniと比較すると1/4の時間でマッピングを終えたことになります。同じスレッド数の比較だと、5950xの8スレッド指定は3700xの8スレッド指定の75%の時間でマッピングを終えました(1.32倍高速)。スレッドの数の違いを見ると、5950xの32スレッドは5950xの8スレッド時の半分のランタイムにしかなっていませんが、5950xはそもそも物理16コアであること、並列化効率は並列数が増えるほど悪くなること、ZEN3はCCDが8コア単位なので32スレッドだとコアまたぎが発生する、等を考慮すれば、32スレッドの効果は十分出ていると思われます。
次にunicyclerのランタイムをまとめました。unicyclerについては同じデータをdocker環境でも実行しました。
(n=1)
マッピングと同じく、相対値にして棒グラフ化します。
上半分がcondaの仮想環境でのラン(パスレベルの仮想環境なのでnative)、下半分がdockerの仮想環境の結果となります。時間の関係で代表的な組み合わせでしかランしてないことに注意して下さい。
まず3990x の128スレッドですが、これはスレッドを増やし過ぎで、32スレッド時の88%にしかタイムは短縮していません。計算機資源を無駄に消費している状態と言えます。一方、3990x の32スレッドは3990x の16 スレッドの51%までランタイムが短縮しており、16=>32スレッドではリニアに伸びていました(n=1で分布は不明)。5950xに目を向けると、5950xの16 スレッドは3990x の32スレッドと同じくらい高速でした。5950xの16 スレッドを同じ16 スレッドで行なった3990x の結果と比較すると、60%のタイム(1.67倍)まで速くなっていました。これはマッピングの時の5950x versus 3700x (両方8スレッド)の 1.32倍よりさらに高速です。同じコア数で比較する限り、ZEN3世代の5950xは、ZEN2世代のCPUよりずっと高速という傾向が出たことになります。
docker環境でのランにも目を向けると、docker環境ではnativeの1.24倍(3990x)から1.7倍(xeon platinum*2)までと、幅がありました。dockerはこれまでの仮想環境プラットフォームより十分に高速ですが、nativeよりはそれなりに遅いことが分かります。最後にWGS2でのランも試しましたが、環境の統一性が疑われる結果が出たので破棄しました。
以上、5950xはZEN2世代のCPUと比べて大幅に高速化できているのが確認できました。CPU周りを考えると大規模な計算には向きませんが、日々繰り返す小さな計算の高速化には十分寄与できると思います。今年の1−3月中にはZEN3世代のEYPC、TRもアナウンスされ、計算のスケールに合わせてより選択肢も広がってくると思います(製造コストの増加で値段は上がる?)。楽しみですね。
何かベンチマークを希望されるツールがあればコメント欄からご連絡下さい。調べて追記します。
引用
Minimap2: pairwise alignment for nucleotide sequences.
Li H
Bioinformatics. 2018 May 10
Unicycler: Resolving bacterial genome assemblies from short and long sequencing reads
Ryan R. Wick , Louise M. Judd, Claire L. Gorrie, Kathryn E. Holt
PLoS Comput Biol. 2017 Jun 8;13(6)
余談ですが、5950xのロジックボードはDefine R6という自由度の高いケースに組み込んでいます。360mmラジエータを内部のフロント側につけ、フロント吸気、ラジエータを冷やしつつ背面排気という風の流れを作りましたが、これが少し失敗で、ケース内部の温度がかなり上がってしまいました。実際初期のファンスピード設定では1時間のランの開始数十分で落ちてしまったので、除去しきれなかった熱がケース内に徐々に溜まっているのだと思います。ファンを初期の静音タイプから高速回転のものに取り替え、ファンスピードを全開近くにしたところシャットダウンは再発しなくなりましたが、マージンはあまりないと思われます。5950xは軽くオーバークロック(OC)するだけで2990WX並みのスコアを出すので、できれば軽いOCを行いたかったのですが、発熱を捌ききれていない現状では電圧を上げるOCは厳しいでしょうね。時間があったらより開放系のケースに変えようかなと思っています。
*1
購入時に5900xの在庫がなかったので5950xにしましたが、電力設計から考えると5900xあたりがバランスがよいのではないでしょうか。
*2
今回は気にせず実行しましたが、xeon platinumのdockerのみ1年半以上前に導入しているため、dockerのバージョン間の差が出た可能性があります。