Weitere ähnliche Inhalte Ähnlich wie 生物データベース論(並列分散計算フレームワーク) (20) 生物データベース論(並列分散計算フレームワーク)2. 公開版作成にあたって
• 以下の事項は仕様です。
– 音声はありません。
– 授業中に判明した typo 等は修正しました。
一部、加筆・修正しています。
– 字が細かいのは、この資料単独で自習できるように
授業中はスライドに書かず喋った部分などを追加し
ているからです。
– アニメーションを解除するために、パラパラ漫画的な
冗長なスライドが増えています。
• 間違い・提案・コメントなどがありましたらメール
やコメント欄で連絡を下さい。歓迎です。
5. 並列計算とは?
• 文字通り並列に計算すること。
– ノード間並列(言語・フレームワーク・その他が混
在;順序は適当)
• MPI, PVM, MapReduce, BSP, Haloop, Pragel, Cilk Plus,
Unified Parallel C, Chapel, X10, High-performance
Fortran, Erlang, Sawzall, Pig, Hive, GXP, MegaScript, PJO,
Prwake, Xcrypt, Taverna, SkeTo
– ノード内並列(言語・フレームワーク・その他が混
在;順序は適当)
• pthread (C/C++/Java/Haskell/OCaml/Go/Scala …),
OpenMP, Intel Thread Building Block, Parallel STL,
PLINQ, Cilk, Axum, HPF, XPFortran, XcalableMP, Fortress,
KL/1, Fortress, SIMD命令, GPGPU
6. “使われている”並列計算
• ほとんどの並列計算言語・フレームワーク・ライブラリ
は実用で使われていません!
• 使われているモノ
– 並列計算フレームワーク
• MPI, MapReduce, BSP
– 言語拡張・並列コンパイラ
• OpenMP, 自動並列化 Fortran など
– OS の機能
• Pthread (C/C++/Java/Haskell/OCaml/Go/Scala …)
• 使われていないモノ
– 並列計算言語
• 新しい言語を覚えるのは敷居が高い、将来生き残るか不明。
• 既存言語拡張と比べ周辺ライブラリなど環境が貧弱になりがち。
• ユーザーが少ない独自言語はバグが残ってたり、使いにくい部分
があったり、最適化が不十分などで困ることも多い
9. 並列化の階層
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
10. 各レベルでの使用例を見てみる
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
11. 機械語命令レベル
例)PADDW 命令 (x86_86環境)
レジスタ
+ + + + + + + +
レジスタ
|| || || || || || || ||
レジスタ
• Smith-Waterman アラインメントの並列化など
– SIMD命令を初めて適用 [Wozniak ’97]
– Query profile で高速化 [Rognes & Seeberg ‘02]
– ストライピングで高速化 [Farrar ’06]
• アラインメントの seed-and-extend ステップを高速化
– mrFAST [Alkan et al ‘09]
– mrsFAST [Hach et al ‘10]
– GASSST [Rizk & Lavenier ’10]
12. 各レベルでの使用例を見てみる
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
13. CPU core レベル
物理CPU 物理CPU
CPU core CPU core CPU core CPU core
CPU core CPU core CPU core CPU core
• 複数のCPUでアラインメント
– bwa [Li & Durbin ‘09]
– Bowtie [Langmead et al ‘
• 複数のCPUでゲノムアセンブリ
– Velvet [Zerbino & Berney ‘08]
– ABySS [Simpson et al ‘09] (複数ノードの)
– Ray [Boisvert ‘10]
– ALLPATHS-LG [Gnerre et al ‘10]
• 複数のCPUでSNV発見
– The Genome Analysis Toolkit [McKenna et al ‘10]
– Unified Genotyper [DePristo et al ‘10]
14. 各レベルでの使用例を見てみる
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
15. プロセスレベル並列
ノード ノード
プロセス1 プロセス3 プロセス5 プロセス6
プロセス2 プロセス4 プロセス7 プロセス8
ノードをまたぐことも。
• 並列でベースコール
– AltaCyclic [Erlich et al ’08]
• 並列でワークフロー
– 特定の論文というわけではないが・・・
• Sun Grid Engine (SGE, N1GE, OGE)/ Load Sharing Facility (LSF)/ Condor など
を用いてソフトを繋ぐ方法はよく用いられる。
• 並列で SNV 発見
– Unified Genotyper [DePristo et al ‘10]
プロセスレベル並列は未だ開発中。
16. 各レベルでの使用例を見てみる
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
17. ノードレベル並列
ノード ノード ノード
プロセス プロセス プロセス プロセス プロセス プロセス
プロセス プロセス プロセス プロセス プロセス プロセス
プロセスレベル並列では、各プロセスが異なるプログラムあるいは異なる
データを処理するのに対して、ノードレベル並列は「1つのアプリケーション」
が複数のノードを活用すること。
• 複数のノードでゲノムアセンブリ
– ABySS [Simpson et al ‘09]
– Ray [Boisvert ‘10]
• 複数のノードでアラインメント
– MPI-BLAST [Thorsen et al ‘07]
• 複数のCPUで構造計算
– GAMESS/DDI [Olson et al ’03 など]
• 複数のノードでタンパク質構造計算
– MARBLE, ProteinDF, etc.
18. 各レベルでの使用例を見てみる
1つの命令で複数の変数(レジスタ等)に
機械語命令レベル
対して演算を行う。
1つのプログラム(プロセス)が複数の
CPU core レベル
CPU コアを同時に使用する。
1つのマシン上で複数のプロセスを
プロセスレベル
動作させる。
1つのクラスター上で複数のノードを
ノードレベル
動作させる。
地理的に離れたサイトにある複数の
世界レベル
マシンを協調させて計算に使う。
19. 世界レベル
中央サーバー
ユーザーの
マシン
ユーザーの
マシン ユーザーの
ユーザーの マシン
マシン
ユーザーの
マシン
世界中のユーザーの空きCPU時間を利用して分散コンピューティング
・ユーザーマシン間の通信はなし(データが小さくて計算が長い場合に有効)
• タンパク質立体構造
– Folding@home [Pande et al ’00~’11]
23. 最近の生物情報科学と
並列計算
• なんといっても次世代DNAシークエンサーの
並列情報処理がホット。
– 出力データ量が膨大。
– ちょっとした計算でも1マシンではすぐ限界に。
• なんでもかんでも並列計算にしてしまえ。
– と言いたいところだけれども、並列計算の
プログラムを書くのは結構めんどくさい作業。
– 皆が工夫が必要であることに気づき始めた
段階。
24. MPI並列プログラムの難しさ
• とにかくプログラム量が増える!ざっと2~3倍。
– 例)台形公式による積分プログラム
• matsu© http://www.fireproject.jp/pc_cluster/mpi/intro/daikei.html
MPI並列バージョン
Int main (int argc, char **argv)
{
非並列バージョン int my_rank;
int p_num;
/* 自分のプロセスランク */
/* プロセッサ数 */
float x_min = X_MIN; /* 全体の閾値の最小値 */
float x_max = X_MAX; /* 全体の閾値の最大値 */
int div_num = DIV_NUM; /* 全体の閾値の分割数 */
float result; /* 全体の積分値 */
float h;
float local_x_min; /* プロセッサ毎の閾値の最小値 */
float local_x_max; /* プロセッサ毎の閾値の最大値 */
int local_n; /* プロセッサ毎の閾値の分割数 */
float float local_result; /* プロセッサ毎の積分値 */
int source;
daikei_integral (float (*function) (float), float x_min, float x_max, int n) int dest = 0;
int tag = 0;
MPI_Status status;
{ MPI_Init (&argc, &argv);
float integral, h, x; MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
MPI_Comm_size (MPI_COMM_WORLD, &p_num);
int i; /* プロセス毎の閾値の算出 */
assign (p_num, my_rank, x_min, x_max, div_num, &local_x_min, &local_x_max,
&local_n);
/* プロセス毎に積分 */
local_result =
h = (x_max - x_min) / n; daikei_integral (function, local_x_min, local_x_max, local_n);
integral = ((function (x_min)) + (function (x_max))) / 2.0; /* 各プロセッサの積分結果を収集 */
if (my_rank == 0) /* プロセス0は全ての他プロセスから結果を受信 */
x = x_min; {
fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n", 0,
for (i = 1; i <= n - 1; i++) { local_x_min, local_x_max, local_n, local_result);
result = local_result;
for (source = 1; source < p_num; source++)
x += h; {
MPI_Recv (&local_result, 1, MPI_FLOAT, source, tag,
integral += (function (x)); MPI_COMM_WORLD, &status);
/* プロセス毎の結果出力 */
} assign (p_num, source, x_min, x_max, div_num, &local_x_min,
&local_x_max, &local_n);
integral *= h; fprintf (stdout, "P%d :: x = [%f,%f] : n = %d : s = %f¥n",
source, local_x_min, local_x_max, local_n,
local_result);
return integral; result += local_result;
} }
}
else /* プロセス0以外はプロセス0へ結果を送信 */
{
MPI_Send (&local_result, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);
デバッグの時間まで入れると非並列版と比べて軽く
}
if (my_rank == 0)
{
10倍は開発に時間がかかると見て良い。
fprintf (stdout, "TOTAL :: x = [%f,%f] : n = %d : S = %f¥n", X_MIN,
X_MAX, DIV_NUM, result);
}
MPI_Finalize ();
}
25. Code Size (C/C++ only)
一流IT企業でシニアプログラマが1年間に書くコード量でやっと 1,000KB程度
MPI並列 • ABySS 449KB (v1.2.3)
MPI並列 • Ray 344KB (v0.0.7)
SMP並列 • SOAPdenovo N/A
非並列 • Velvet 731KB (v1.0.13)
非並列 • EULER-SR 1,136KB (v1.1.2)
非並列(一部並列) • ALLPATH3 6,395KB (build34923)
非並列(一部並列) • RAMEN 1,278KB (v2, Sanger版)
非並列 • Phrap 711KB (v0.990319)
ノード並列 • Celera 6,951KB (v7.1)
SMP並列 • bwa 330KB (v0.5.8c)
SMP並列 • BLAST+ 7,190KB (v2.2.24)
※プログラムの複雑度をサイズで These numbers do not include external scripts, but may include materials not
測るのはとても良くない習慣! directly related to the core algorithms.
26. 生物情報科学で今
研究するべき並列化技術1
• 並列計算プログラムを簡単に書く技術。
– 実行効率・計算効率はほどほどでいい。
並列計算効率の良いハードウェア・
並列計算効率の良いアルゴリズム・
従来型の研究 並列計算効率の良いプログラミング言語・
並列計算効率の良い計算フレームワーク
プログラミング効率の良い
これからの研究
並列計算
27. なぜプログラミング効率か?
数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。
従来型の研究 一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。
数値解析的アプリ:
流体解析、構造シミュレー プログラミング 実行 実行 実行 実行 実行
ション、衝突解析、金融計
算、天文シミュレーション、
気象予測、・・・
ここが支配的
これからの研究 データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス
ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回
離散計算中心のアプリ: しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを
ゲノムインフォマティクス、 計算する。自然科学の発見は一度きりなのでプログラミング時間が重要。)
自然言語処理、ウェブマイ
ニング、機械学習、・・・
プログラミング 実行
ここが支配的
28. なぜプログラミング効率か?
数式を基にシミュレーションを行う。式は比較的簡潔でプログラムは短い。
従来型の研究 一度書いたプログラムを様々なデータ・パラメータで実行するので実行時間が重要。
数値解析的アプリ:
流体解析、構造シミュレー 実行時間を短くする
プログラミング
実行 実行 実行 実行 実行
ション、衝突解析、金融計
算、天文シミュレーション、
気象予測、・・・
並列計算の研究
ここが支配的
これからの研究 データの性質を調べながら試行錯誤してアルゴリズムを開発する。ヒューリス
ティクスを多用し、例外ケース処理が多いのでプログラムは長くなりがち。一回
「プログラミング時間+実行時間」を
離散計算中心のアプリ:
ゲノムインフォマティクス、
しか実行しないプログラムも多い。(例:メダカとニワトリの染色体シンテニーを
計算する。)
短くする並列計算の研究
自然言語処理、ウェブマイ
ニング、機械学習、・・・
プログラミング 実行
ここが支配的
29. 生物情報科学で今
研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
– 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
パイプラインシステム
– いろいろな環境で動かしたい
• ファイル I/O を最適化する並列計算
フレームワーク
– 無駄なデータのやり取りを抑えて並列計算を
したい
30. 生物情報科学で今
研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
– 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
パイプラインシステム
– いろいろな環境で動かしたい
• ファイル I/O を最適化する並列計算
フレームワーク
– 無駄なデータのやり取りを抑えて並列計算を
したい
31. スケルトンプログラミング
(Skeleton programming)
• Skeletal parallelism を利用したプログラミング。
• 発想
– 以下のような部分はいろいろな並列プログラミン
グで共有して使用されるパターン。ならばこの部
分だけライブラリにして使いまわしてしまえ。
穴埋め問題的にプログラミングをしてもらおう。
• データの分割
• ロードバランシング
• データの転送 (データの圧縮)
• ハードウェアエラーへの対処
• ソフトウェアエラーへの対処
33. MapReduce
• Map 関数と Reduce 関数を定義すればそれだけ
で並列処理が行えるフレームワーク
ユーザー定義
入力データ
入力1 入力2 入力3 ・・・・・ 入力N
map map map map map
k, v k, v k, v k, v
k, v k, v k, v ・・・・・ k, v
k, v k, v k, v k, v
shuffle
(k ごとにまとめる)
v, v, v, v v, v, v v, v, v, v, v, v, v, v v ・・・・・ v, v
reduce reduce reduce reduce reduce reduce
出力データ
34. MapReduce の例
• 問題
– 数兆単語を含むテキストファイルで、単語の出現頻度を
カウントする。
void map(list<String> words):
for word in words:
emit(word, 1)
list<int> reduce(string word, list<int> freq):
sum := 0
for f in freq:
sum += f
return list<int>(sum) // sum 1要素からなるリストを返す
OSDI'04: Sixth Symposium on Operating System Design and
Implementation, San Francisco, CA, December, 2004
35. MapReduce の例
• 問題
– 数億 web ページについて、各ページからリンクしている URL のリスト
が与えられている
– すべての web ページについて、そのページにリンクしている web
ページの URL リストを求める
void map(list<URL, URL> links):
for link in links:
emit(link.toURL, link.fromURL)
list<URL> reduce(URL base, list<URL> linkingPages):
return linkingPages
OSDI'04: Sixth Symposium on Operating System Design and
Implementation, San Francisco, CA, December, 2004
36. MapReduce の例
• 問題
– 数十億本の short read について、bwa でヒトゲノムにアラインメント
した結果を返す
void map(list<Read> shortReads):
for read in shortReads: // 実際にはある程度まとめてバッチで処理
bwaを起動してアラインメント
emit(アラインした染色体名, 結果)
list<Alignment> reduce(string chromName, list<Alignment> result):
return result
OSDI'04: Sixth Symposium on Operating System Design and
Implementation, San Francisco, CA, December, 2004
37. MapReduce の凄いところ
• map と reduce のたった2つの関数を定義すれば並列
計算ができるところ・・・
– ・・・・ではありません。
• ここが凄い(便利だ)よ!
– ロードバランシングが自動。空いている CPU に仕事を振り
分けてくれる。
– Google File System (GFS) で入力ファイルのレプリカがなる
べく近いノードに map を振りわける。
– ラスト数%の Job は色々な原因で遅い(他のJobと干渉)・
止まっている(ノード故障等)可能性があるので、投機的
に再実行して早いほうを採用している。
– エラーが出る入力レコードを自動スキップしてくれる。
– 分散ソート (shuffle) が自動で行われる。
並列分散計算はかなり色々な細かいところに気をつかうが、細かいところは
全てフレームワークに任せて本質的な問題に集中できることが重要!
39. ゲノム計算で頻出のパターンを
スケルトン化する
– 単純な分割パターン
• ヒトゲノムへのリードマッピングの場合、
「分割」「マッピング」と「マージ」だけユーザーが書く
– オーバーラップ付き分割
• 例)
Human ゲノムに mRNA-seq のショットガンデータを
アラインメントすることを考える。Intron を考えると
1つの染色体を単純に分割することはできない。
Intron 最大長を 1Mb と仮定すると、1Mb ずつ
オーバーラップさせてヒトゲノムを100 分割し、
並列に処理することができる。
オーバーラップ分を reduce (?) する処理は別途
ユーザーが書いて与える。
40. 生物情報科学で今
研究するべき並列化技術
• 並列計算プログラムを簡単に短く書く技術
– 実行効率・計算効率はほどほどでいい
• 移植性のある並列計算プログラム・
パイプラインシステム 時間が足りない
– いろいろな環境で動かしたい ので今回はカット
• ファイル I/O を最適化する並列計算
フレームワーク
– 無駄なデータのやり取りを抑えて並列計算を
したい 最後駆け足で
すみません・・・。