Ruby科学データ処理ツールの開発 NArrayとPwrake

  • 6,431 views
Uploaded on

 

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,431
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
26
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Ruby科学データ処理ツールの開発 NArrayとPwrake 田中昌宏 筑波大学 計算科学研究センター2011-7-4 東大本郷 1
  • 2. 内容• 多次元数値配列 NArray – リリース版 – 開発版• プロットツール• 並列分散ワークフローシステム Pwrake2011-7-4 東大本郷 2
  • 3. 注意書き• これまで考えたことの、まとまりのない話• HPC的とか、学術的な話ではありません• Ruby言語、Rubyオブジェクトの内部構造(C言 語)に関しての知識が前提2011-7-4 東大本郷 3
  • 4. 開発動機• データ解析のためのツール• 自分が必要だと思う機能を入れたい• フリーがいい2011-7-4 東大本郷 4
  • 5. NArrayの手本• IDL (Interactive Data Language)• Yorick• Python Numeric• あまり知らないもの – MATLAB, Octave, Scilab –R – PDL2011-7-4 東大本郷 5
  • 6. IDL• 1970年代からあるらしい• 商用 (Linux版1ライセンス25万円, 年間保守7万円)• 機能 – 便利な多次元配列 – 数値計算ライブラリが豊富 – 可視化・グラフィックライブラリが豊富 – プラットホーム非依存のGUI – 天文データ計算ライブラリが公開• 言語仕様が古い – フラットネームスペース – 変数スコープ • ローカルまたはcommon宣言で共有 – あとづけオブジェクト指向2011-7-4 東大本郷 6
  • 7. IDLで作ったツール Cross-platform GUI の作成が容易2011-7-4 東大本郷 7
  • 8. Yorick• フリーソフト• C言語に似た言語• 独特の多次元配列操作記法 – ベクトルの外積: x*y(-,) – 行列積: A(,+)*B(+,)• あまり性能はよくなかった• あまり使われていない2011-7-4 東大本郷 8
  • 9. NumPy• Numeric → NumArray → NumPy と変遷• 最近 – 初期にに比べていろいろ改善 – グラフィックライブラリもできた: matplotlib – コミュニティが増えた – 実際に幅広く使われている • 天文データ2011-7-4 東大本郷 9
  • 10. Scientific Ruby に必要なもの• プログラムが書ける – Ruby• インタラクティブ – irb• データ配列操作 – NArray• 数値計算ライブラリ – Lapack, FFTW, GSL 等のwrapper• グラフ表示機能 – ?2011-7-4 東大本郷 10
  • 11. Ruby/NArray• 多次元数値配列 – Numerical N-dimensional Array• http://narray.rubyforge.org• http://github.com/masa16/narray2011-7-4 東大本郷 11
  • 12. NArrayバージョン• 0.3.0 – 1999• 0.5.0 – 2000• 0.5.9p9 – 2010 (リリース版) – 次 0.6.0 ?• 0.7.1 – 2007 (開発版1)• 0.9? – 2011 (開発版2)2011-7-4 東大本郷 12
  • 13. NArray 構成要素 (基本部分)• rank – 次元数• shape – 配列の「形」• type – 要素の型• memory block – データを格納するメモリーブロック2011-7-4 東大本郷 13
  • 14. メモリーブロック• Ruby Array : – VALUE *ptr; → value[0] value[1] value[2] value[3] … struct RVALUE { … }• NArray – void *ptr; → double[0] double[1] double[2] double[3] … – or int[0] int[1] int[2] int[3] …2011-7-4 東大本郷 14
  • 15. NArray(リリース版)のデータ型 (ビルトイン)• 整数 • 複素数 – BYTE (8bit) – SCOMPLEX (64bit) – SINT (16bit) – DCOMPLEX (128bit) – INT (32bit) • Rubyオブジェクト• 浮動小数点数 – ROBJECT – SFLOAT (32bit) – DFLOAT (64bit)2011-7-4 東大本郷 15
  • 16. 配列の形:shape• shape = [4] • shape = [4,4,4] – 1次元配列 – 3次元配列 a[0] a[1] a[2] a[3]• shape = [4,4] a[0,0,0] a[1,0,0] a[2,0,0] a[3,0,0] – 2次元配列 a[0,1,0] a[1,1,0] a[2,1,0] a[3,1,0] a[0,0] a[1,0] a[2,0] a[3,0] a[0,2,0] a[1,2,0] a[2,2,0] a[3,2,0] a[0,1] a[1,1] a[2,1] a[3,1] a[0,3,0] a[1,3,0] a[2,3,0] a[3,3,0] a[0,2] a[1,2] a[2,2] a[3,2] a[0,3] a[1,3] a[2,3] a[3,3]2011-7-4 東大本郷 16
  • 17. 多次元データの順序• a[i,j] データが連続する順番• 左の次元(i)が早く回る a[0,0] a[1,0] a[2,0] a[3,0] – Fortran-order 、または – Row-major order a[0,1] a[1,1] a[2,1] a[3,1]• 多次元配列を1次元でアクセス a[0,2] a[1,2] a[2,2] a[3,2]shape=[m,n]のとき、 a[0,3] a[1,3] a[2,3] a[3,3] a[i,j] == a[i+j*m]• Rubyの配列: a[j][i]2011-7-4 東大本郷 17
  • 18. NArrayの生成NArray.float(3,2) NArray[[1,2,3],[4,5,6]]=> NArray.float(3,2): => NArray.int(3,2):[ [ 0.0, 0.0, 0.0 ], [ [ 1, 2, 3 ], [ 0.0, 0.0, 0.0 ] ] [ 4, 5, 6 ] ]NArray.float(3,2).indgen! NArray[1..10]=> NArray.float(3,2): => NArray.int(10):[ [ 0.0, 1.0, 2.0 ], [ 1, 2, 3, 4, 5, 6, 7, 8, [ 3.0, 4.0, 5.0 ] ] 9, 10 ]2011-7-4 東大本郷 18
  • 19. 配列のスライス• a[1] a[0] a[1] a[2] a[3] – 要素参照• a[1..2] a[0] a[1] a[2] a[3] – 範囲参照• a[[1,3]] a[0] a[1] a[2] a[3] – インデックス配列参照2011-7-4 東大本郷 19
  • 20. 部分代入a = NArray[[0,1],[2,3]]a[1,true] = [11,22] => NArray[[0,11],[2,22]]a[1,true] = 99 => NArray[[0,99],[2,99]]• できれば記号を使いたいa[1,*] = 992011-7-4 東大本郷 20
  • 21. NArrayの演算• 演算は要素ごと (element-wise)• 演算 a*b= a[0]*b[0] a[1]*b[1] a[2]*b[2] a[3]*b[3] – 四則演算 • +, -, *, /, %, ** – 統計・ソート • min, max, sum, mean, stddev, rms, rmsdev, median, sort – 数学関数演算 • NMath module2011-7-4 東大本郷 21
  • 22. coerce• a+b• レシーバ a が b の型を知らない• coerce で型変換してから演算 a,b = b.coerce(a,b)• a が Numeric → NArrayScalar• NArray同士では、coerce は使わない – 巨大な配列の場合、型変換のコストが大きい – 行列が絡むと、さらにややこしい2011-7-4 東大本郷 22
  • 23. upcast• NArrayの演算は、(基本的に)同じ型同士• 型が異なる場合:UPCASTテーブルに基づい て型変換する• DFLOAT + SFLOAT の場合、後者を DFLOAT に 変換してから演算• a = NArray.sfloat(n) のとき、• 0.5 * a が返す型は? – 配列の型を優先:単精度で返す2011-7-4 東大本郷 23
  • 24. サイズ1の繰り返しルール• 2つの配列が絡む場合 – 演算やスライス代入• ある次元のサイズが、n対1の場合、• サイズ1の次元で、データがn回繰り返す• 例: a = [1,2,3,4] – a[0..2] = 1 → a[0..2] = [1,1,1] –a*2 → a * [2,2,2,2]2011-7-4 東大本郷 24
  • 25. 繰り返しルールの応用:クロス演算• x = [[1,2,3]] (shape=[n,1])• y = [[4],[5]] (shape=[1,m])• x * y = [[4,8,12],[5,10,15]] x[0,0] x[1,0] x[2,0] y[0,0] x[0,0]*y[0,0] x[1,0]*y[0,0] x[2,0]*y[0,0] y[0,1] x[0,0]*y[0,1] x[1,0]*y[0,1] x[2,0]*y[0,1]• 例: 原点からの距離のグリッドデータを作る場合• NMath.sqrt( x**2 + y**2 ) ↑ ここの’+’で2次元に展開2011-7-4 東大本郷 25
  • 26. 条件演算• 0 or 1 を含むバイト型NArrayを返す a.eq(b) # ==が使えない… ne, gt(>), lt(<), ge(>=), le(<=)• whereメソッド: 非ゼロのインデックスを返す (a.gt b).where – 多次元の場合は、1次元のインデックス• ゼロ未満の部分に0を代入 – a[(a.lt 0).where] = 0 – a[a.lt 0] = 02011-7-4 東大本郷 26
  • 27. マンデルブロ(普通の計算方法) 複素数配列 実部→ 2. 配列についてループ 虚 -2.0-1.0i -1.9-1.0i … 1.0-1.0i 部 -2.0-0.9i -1.9-0.9i 1.0-0.9i ↓ … … -2.0+1.0i -1.9+1.0i … 1.0+1.0i 1. 要素ごとに漸化式ループ def mandel_pix(cr, ci) limit = 30 c = Complex(cr,ci) z = Complex(0.0,0.0) for i in 1..limit z = z**2 + c # 漸化式 return i if z.abs>2 # 条件式 end return limit end2011-7-4 東大本郷 27
  • 28. マンデルブロ(NArrayでの計算方法)def mandel_narray(c) for ループの途中経過: limit = 30 (白い部分が計算途中) w,h = c.shape z = NArray.dcomplex(w,h) a = NArray.int(w,h) i=6 idx = NArray.int(w,h).indgen! for i in 1..limit z = z**2 + c # 漸化式 (配列ループ) idx_t,idx_f = (z.abs>2).where2 # 条件式 a[idx[idx_t]] = i idx = idx[idx_f] i=12 z = z[idx_f] c = c[idx_f] end a[idx] = limit return a NArrayの使い方のコツ: i=18end 1. ループの順序を入れ替える 2. 条件分岐にwhere を使う 2011-7-4 東大本郷 i=30 28
  • 29. NArray speed• Float Array with 106 elements• Ruby 1.9.2 : (0...n).map{|i| a[i]*b[i]} – elapsed time : 180 ms• NArray with Ruby 1.9.2 : a*b – elapsed time : 6.4 ms• NArray is ~ 28 times faster2011-7-4 東大本郷 29
  • 30. マンデルブロの計算速度 60 50 Speedup factor 40 30 20 Speedup by NArray 10 0 0.E+00 2.E+05 4.E+05 6.E+05 8.E+05 1.E+06 data size2011-7-4 東大本郷 30
  • 31. Benchmark (2005年)•CPU: Pentium 4 Prescott, 2.8GHz•OS: Linux 2.6.14-1.1644_FC4 elapsed time (sec) array array matrix matrix add mul dot solve 10^6 elm * 100 500x500 elm * 3 times tiems Ruby NArray 1.56 1.52 2.10 6.54 1.8.2 0.5.8 Python numarray 5.08 5.06 2.10 3.05 2.4.1 1.5.0 Python Numeric 5.58 5.61 5.34 6.15 2.4.1 23.7-2 Octave 2.1.72 1.43 1.39 2.12 2.96 (i686-pc-linux-gnu)2011-7-4 東大本郷 31
  • 32. バイナリデータとして• NArrayのメモリーデータを Stringと相互変換• NArray → String – narray.to_s• String → NArray – NArray.to_na( string, NArray::DFLOAT, nx, ny )• バイトオーダ変換メソッド – hton, ntoh, vtoh, htov2011-7-4 東大本郷 32
  • 33. NArray開発状況• リリース版: – 0.5.9.9 最新版• 開発版 – 0.7.0.1 非互換の変更(2007年) – 0.9 ? 0.7 からさらに仕様変更2011-7-4 東大本郷 33
  • 34. 次版の開発動機• すでにNumPyより大きく出遅れている• 配列の基本機能として、NumPy で可能なこと はすべて可能にしたい• +αの機能• 周辺機能(行列演算、FFT等)は追々。。。2011-7-4 東大本郷 34
  • 35. 開発版の変更点• 次元順序の変更• 64bit対応• データ型が追加可能• 配列スライスのとき、コピーを作らない• NMatrix, NVector は廃止 – 行列積の記法以外にメリットがない – クラス変換とかcoerceで複雑になる – dot メソッドで代用2011-7-4 東大本郷 35
  • 36. 開発版の新機能• inplace 演算• ビット配列• 構造体データ型• mmap2011-7-4 東大本郷 36
  • 37. 次元の順序 データが連続する順番• リリース版: – a[i,j] a[0,0] a[1,0] a[2,0] a[3,0] – 左の次元(i)がはやく回る a[0,1] a[1,1] a[2,1] a[3,1] – 画像や科学データはこちら a[0,2] a[1,2] a[2,2] a[3,2]• Rubyのネスト配列と逆: – a[j][i] a[0,3] a[1,3] a[2,3] a[3,3]• 開発版: Rubyと同じ順序に変更 – a[j,i] – 説明が省けて混乱しにくい – フラグによって、オブジェクトごとに次元順序が変えられる2011-7-4 東大本郷 37
  • 38. 64bit対応• リリース版 – データ位置のデータ型: int32_t – 配列サイズ: 最大2GB• 開発版 – NArrayに Int64 型を追加 – データ位置のデータ型: sizt_t – where が返すデータ型: • 配列サイズによって、Int32 または Int642011-7-4 東大本郷 38
  • 39. データ型• リリース版 – NArrayクラスの内部属性 – NArray#typecode で型コードを返す – NArray::DFLOAT :型コード定数 – データ型は固定で、追加不可能• 開発版 – NArrayクラスのサブクラス – クラス名: NArray::DFloat など • 前は Num::DFloat だった。まだ悩み中… – データ型の追加が可能2011-7-4 東大本郷 39
  • 40. データ型一覧• 既存の型 • 新規の型 – NArray::Int8 – NArray::Int64 – NArray::Int16 – NArray::UInt8 – NArray::Int32 – NArray::UInt16 – NArray::DFloat – NArray::UInt32 – NArray::SFloat – NArray::UInt64 – NArray::DComplex – NArray::Bit – NArray::SComplex – NArray::NStruct – NArray::RObject2011-7-4 東大本郷 40
  • 41. 型変換• 演算によって、どの型に変換するか決めたい – float * int => float * float – float ** int => float ** int• coerce は、演算ごとに設定できない• NArrayでは、UPCASTを導入2011-7-4 東大本郷 41
  • 42. UPCAST• 例 a = NArray::Int32[1,2,3] b = NArray::DFloat[4,5,6] c = a + b• 演算の擬似コード tp = NArray::UPCAST[a.class][b.class] • tp は DFloat 2次元ハッシュ c = tp.add(a,b) • a が DFloat にキャストされる• ハッシュ UPCAST は、追加・変更可能2011-7-4 東大本郷 42
  • 43. NumPy配列スライス• 「元の配列の一部分を指す配列」が作られる• データがコピーされない• スライス配列の値を変えると、元の配列も変わる a = b = a[1::2,1::2] = b [0,0] = 99 a[1,1] #=> 992011-7-4 東大本郷 43
  • 44. NumPy オブジェクトtypedef struct PyArrayObject { char *data; int nd; npy_intp *dimensions; /* shapeと同じ */ npy_intp *strides; … char *data strides[1] strides[0]2011-7-4 東大本郷 44
  • 45. リリース版NArray配列スライス• 値をコピーした新しい配列が作られる• スライス配列を書き換えても、元の配列の内 容は変更されない a = b = a[1..2,1..2] = b [0,0] = 99 a[1,1] #=> 02011-7-4 東大本郷 45
  • 46. 配列スライス• NumPy式 – スライス配列を書き換える – スライスだけなら高速 – オブジェクトの構造が複雑• NArray式 – オブジェクトの構造が簡単2011-7-4 東大本郷 46
  • 47. 開発版NArrayの配列スライス• NumPyの参照方式に変更• NArrayでは、インデックスも指定可能• a[1..2] a[0] a[1] a[2] a[3] – 範囲参照• a[[1,3]] a[0] a[1] a[2] a[3] – インデックス配列参照2011-7-4 東大本郷 47
  • 48. 開発版NArray構造体(抜粋){ unsigned char ndim; size_t size; VALUE data size_t *shape; VALUE data; size_t offset; offset stridx_t *stridx; stride[1] … stride[0]2011-7-4 東大本郷 48
  • 49. stridx• 最下位ビットが1: – 1ビット下位にシフトした数を stride とみなす stride = stridx>>1 = 4• 最下位ビットが0: – ポインタとみなし、index配列を指す *stridx = index = [1,2,4,7]2011-7-4 東大本郷 49
  • 50. stridx 実装• インデックスを持つと、実装が複雑に• ループも遅い• 本当に必要か?• まだ悩み中2011-7-4 東大本郷 50
  • 51. inplace• 元の配列に結果を上書き – メモリーを確保しなくて済むので、高速• リリース版 – a.mul!(b).add!(c) – 演算子が使えない – メソッドを作る必要がある2011-7-4 東大本郷 51
  • 52. inplace• 開発版 – inplace フラグが付いたオブジェクトに上書き – Numpy にはない機能• フラグの伝播 – a.inplace * b + c # すべて a に上書き• 左側でも上書き – a + b * c.inplace # すべて c に上書き• 両側ともinplaceのときは、左側に上書き – a.inplace * b + c.inplace * d2011-7-4 東大本郷 52
  • 53. inplace (contd.)• NMath でも上書き – NMath.sin(a.inplace)• スライス配列でも上書き – a[1..2,1..2].inplace + 1 => a[1..2,1..2] += 1 と同じだが、配列は作 らない2011-7-4 東大本郷 53
  • 54. ビット配列• 0 or 1 の配列• 1要素が 1ビット – バイト配列と比べて、サイズが1/8になる• 条件演算の結果として使う – and / or が高速(のはず)• 多次元スライスも可能2011-7-4 東大本郷 54
  • 55. 構造体データ型Foo = NArray::NStruct.new() do int8 :byte float64 :float, [2,2] dcomplex :complendz = Foo.new([2,3])z.fill([2,[[1,2],[3,4]],0.123])z.field(:float)z[1,1..2].field(:float)2011-7-4 東大本郷 55
  • 56. mmap• メモリーをファイルにマップ – メモリーに全データをロードできない場合に需要あり• 環境の違いを吸収 – UNIX系 → mmap – Windows → MapViewOfFile• 前は ByteData クラスというメモリークラスを作っ て、そのサブクラスにした• 今は、NArrayでメモリー管理2011-7-4 東大本郷 56
  • 57. メモリー参照の問題• 他のオブジェクトのメモリーを参照 – ポインタが変わらなければ問題はなさそう • 今はそうしている – ポインタが変わる場合 • 配列のサイズを可変にしたい • データを push したいとか需要あり • realloc • 他のオブジェクトでポインタを使っている間に、ポインタ が変わらないような、ロックの仕組みが必要 • Rubyとしての枠組みはないですよね2011-7-4 東大本郷 57
  • 58. NArrayへの協力• Prince lab https://github.com/princelab/narray/wiki – チュートリアル英語版2011-7-4 東大本郷 58
  • 59. プロットツールについて余談2011-7-4 東大本郷 59
  • 60. matplotlib• Pythonプロットツール• MATLABのコマンド体 系がベース• これが出てから、 Numpyが広まったよう な気がする• Rubyにもプロットツー ルがほしい2011-7-4 東大本郷 60
  • 61. 既存のRubyプロットツール• Ruby/PGPLOT – PGPLOTライブラリのラッパー• Ruby/DCL – DCLのラッパー• どちらもFORTRANライブラリで、古い• GNUPLOT みたいに plot x,y と書くだけで、プロットしたい2011-7-4 東大本郷 61
  • 62. 作りかけのプロットライブラリ• グラフィックバックエンド – X11 と Win32 と Postscript に対応• 2次元プロットはできた• 「プロット機能」と「装飾機能」を分離したい – CSS みたいな• 今だと Cairo と WPF に対応しなきゃ?• 自分でできる気がしない2011-7-4 東大本郷 62
  • 63. Scientific Ruby• プログラムが書ける – Ruby• インタラクティブ – irb• データ配列操作 – NArray• 数値計算ライブラリ – FFTW, Lapack, GSL• グラフ表示機能 – ?2011-7-4 東大本郷 63
  • 64. 並列分散ワークフローシステム Pwrake(プレイク) http://github.com/masa16/pwrake2011-7-4 東大本郷 64
  • 65. Pwrake開発動機• Gfarm開発者の建部チームに所属• 研究テーマ – Gfarmを使った天文アプリケーションの性能調査2011-7-4 東大本郷 65
  • 66. Gfarm 広域分散ファイルシステム • 各ノードのストレージを統合 • 統一したディレクトリ空間 • 広域でファイルを共有 • http://datafarm.apgrid.org/ Internet Gfarm File SystemComputer nodes / /dir1 /dir2 Local Local Local Local Local Local Storage Storage Storage Storage Storage Storage file1 file2 file3 file4 2011-7-4 東大本郷 66
  • 67. ローカリティを考慮したタスク実行• Gfarmでは、計算ノードがとストレージノードを兼ねる• ファイルが存在するノードで処理すれば、性能が向上• タスク実行は、ワークフローシステムが行う Slow Task for Task for File 1 File 3 Local Local Fast Local Local Storage Storage Storage file3 Storage file4 file1 file22011-7-4 東大本郷 67
  • 68. ワークフローツール• GXP – 東大田浦さんらが開発したツール – Python で記述 – クラスターの各ノードで、一斉にコマンド実行• GXP make : GNU make の機能 – 始めは GXP make を使用 – ローカリティを考慮した機能がない – 拡張しようにも、Python なのでよくわからない• Rakeを拡張しよう2011-7-4 東大本郷 68
  • 69. Rakefile におけるタスク記述 タスク定義 依存関係 (Rubyメソッド) 自身のタスク名 => 依存タスク名file “prog” => [“a.o”, “b.o”] do sh “cc –o prog a.o b.o”end Ruby コードブロックタスクのアクションをRuby言語で記述2011-7-4 東大本郷 69
  • 70. Rakeを拡張しよう• Rake の並列実行 multitask “out” => [“in1”, “in2”, “in3”]• in1..in3 についてスレッドを起動して、タスクを 並列実行• タスクの数だけスレッドを立ち上げる – 並列度を制御できない• 当初の目標: – 並列度制御、リモート実行機能2011-7-4 東大本郷 70
  • 71. 最初のPwrake• multitask => pw_multitask – スレッドプールを作り、指定の並列数でタスクを実行• Sshクラス – ssh コマンドでリモート接続• sh => t.rsh – Rake::Task クラスのメソッド – 実行ノードを知る必要があるため• これでは互換性がない – Pwrake用に書いたRakefileが、Rakeで動かない – Rake用に書いたRakefileが、Pwrakeで並列に走らない2011-7-4 東大本郷 71
  • 72. 改良したPwrake• タスク並列性 – Drake を参考にした • 毎回タスクの依存性を辿って、キューに入れる – Drake は、1回の探索でタスク1個取得 – Pwrake は、1回の探索で実行可能なタスク全て取得• sh における接続情報の取得 – Thread.current[:connection] で接続先を渡す• Rakeで動くRakefileが、Pwrakeで並列分散実行2011-7-4 東大本郷 72
  • 73. Pwrake ホストキュー PwMultitask class SSH connection Prerequisite HostQueue Thread pool Tasks for remote enqueue Queue dequeue executions Task1 for host1 worker remote push pop thread1 host1 Queue Task2 for host2 worker remote Queue thread2 host2 Task3 for host3 worker thread3 remote host3 … 入力ファイル保存ノード 自分ノードのキューが空の のキューに入れる とき、他のキューから盗む2011-7-4 東大本郷 73
  • 74. ワークフロー記述言語としての Rakefile• 科学ワークフローは、Makefileのルールに収 まらないことが多い• Rakefileは、Rubyの内部DSLなので、プログラ ムが書ける2011-7-4 東大本郷 74
  • 75. 依存関係がファイルに書かれている 場合• File dependency is given as a list written in a file: $ cat depend_list dif_1_2.fits image1.fits image2.fits dif_1_3.fits image1.fits image3.fits dif_2_3.fits image2.fits image3.fits ... image1 image2 image3 … dif_1_2 dif_1_3 dif_2_3 …•2011-7-4 東大本郷 75
  • 76. Dependency is given as a file list• Make: – 依存関係を記述したファイルから、Makefile を作 成するプログラムが必要• Rake: ファイルを読み、タスクを定義 open("depend_list") { |f| f.readlines.each { |line| name, file1, file2 = line.split file name => [file1,file2] do |t| sh “prog #{t.prerequisites.join( )} #{t.name}" end } }2011-7-4 東大本郷 76
  • 77. 動的なワークフローの生成• タスクを実行した結果により、それ以降のファ イル・タスクが定義できる Task file1 file2 file3 Task Task File2011-7-4 東大本郷 77
  • 78. Makefileの動的生成• make実行中にMakefileを生成• Makefile だけではワークフローを定義できない Makefile Makefile.sub: prerequisite create awk –f hoge.awk $< > $@ Makefile.sub target: Makefile.sub target1: source1 make -f $< target2: source2 invoke …2011-7-4 東大本郷 78
  • 79. Rakeにおける動的タスク生成(失敗)task :A do • task A の実行中に task :B do task B を生成 puts “B” • しかし task B は実行さ end れない – task B が生成される前end に、すでに依存関係がtask :default => :A 決定2011-7-4 東大本郷 79
  • 80. Rakeにおける動的タスク生成(成功)task :A do • 変数 b に、Taskオブ b = task :B do ジェクトを格納 puts “B” • invoke メソッドにより、 end 明示的に実行 b.invoke • Rake により、動的な ワークフローが実現endtask :default => :A2011-7-4 東大本郷 80
  • 81. 天文データ処理の例• Montage – software for producing a custom mosaic image from multiple shots of images. – http://montage.ipac.caltech.edu/2011-7-4 東大本郷 81
  • 82. Montage Workflow Input images • 処理内容: mProjectPP – 座標変換 – 明るさ補正 – 足し合わせ mDiff mBackground • 1 image : 1 process mFitplane mAdd a1x+b1y+c1=0 a2x+b2y+c2=0 mBgModel m1 = a1x+b1y+c1 m2 = a2x+b2y+c2 Final image2011-7-4 東大本郷 82
  • 83. Montageワークフローのグラフ flow Input Output files file2011-7-4 東大本郷 83
  • 84. Montage Workflow 性能評価• ワークフローを Input images Rakefileとして記述 mProjectPP mDiff mBackground mFitplane mAdd a1x+b1y+c1=0 a2x+b2y+c2=0 mBgModel m1 = a1x+b1y+c1 m2 = a2x+b2y+c2 Final image2011-7-4 東大本郷 84
  • 85. Montage Workflow の実行時間 1 node 4 cores 2 nodes 8 cores 4 nodes 16 cores 2 sites 筑波大+ 16 nodes 48 cores 産総研の 8 nodes 計算機 1-site 32 cores クラスタ 筑波大の計算機クラスタ2011-7-4 東大本郷 85
  • 86. Montage Workflow の実行時間 NFS 1 node 4 cores 並列度を上げ 2 nodes ても処理時間 8 cores が減らない 4 nodes 16 cores 2 sites 16 nodes 8 nodes 48 cores 1-site 32 cores2011-7-4 東大本郷 86
  • 87. Montage Workflow の実行時間 Gfarm 1拠点で スケーラブル 1 node 4 cores 2 nodes 8 cores 4 nodes 16 cores 2 sites 16 nodes 8 nodes 48 cores 1-site 32 cores ファイルやジョブ の配置により 約20%性能向上2011-7-4 東大本郷 87
  • 88. Montage Workflow の実行時間 1 node 4 cores Gfarmは 2 nodes 8 cores NFSの約10倍 NFS 倍 の性能向上 4 nodes 16 cores 2 sites 16 nodes 8 nodes 48 cores 1-site 32 cores2011-7-4 東大本郷 88
  • 89. Montage Workflow の実行時間 Gfarm 2拠点でもス ケーラブル 1 node 4 cores 2 nodes 8 cores 4 nodes 16 cores 2 sites 16 nodes 8 nodes 48 cores 1-site 32 cores2011-7-4 東大本郷 89
  • 90. Pwrake 今後の予定• 大規模なワークフローの実行 – 100万並列 – 自律分散システム• 障害対策 – 障害情報の取得 – タスクの再試行 – 故障ノードの判別• 可用性 – 実行状況の可視化、プロファイリング2011-7-4 東大本郷 90
  • 91. 階層的自律分散システム 現状 将来 接続ごとに Pwrake Pwrake Threadが起動 プロセス プロセス DAGを渡して 自律処理 クラスタ クラスタ クラスタ クラスタ 計算 Pwrake Pwrake 計算プロセス プロセス プロセス プロセス 計算 計算 プロセス プロセス 計算 計算 プロセス 計算 計算 プロセス プロセス プロセス
  • 92. Pwrakeまとめ• ワークフロー記述言語として、Rakeを採用• 並列分散ワークフロー処理システムPwarkeを 開発 – URL: http://github.com/masa16/pwrake• 分散ファイルシステムGfarmを用いることによ り、スケーラブルな性能向上を達成2011-7-4 東大本郷 92