SlideShare una empresa de Scribd logo
1 de 92
Descargar para leer sin conexión
Ruby科学データ処理ツールの開発
      NArrayとPwrake
                 田中昌宏
           筑波大学 計算科学研究センター



2011-7-4         東大本郷        1
内容
• 多次元数値配列 NArray
      – リリース版
      – 開発版
• プロットツール
• 並列分散ワークフローシステム Pwrake




2011-7-4        東大本郷      2
注意書き
• これまで考えたことの、まとまりのない話
• HPC的とか、学術的な話ではありません
• Ruby言語、Rubyオブジェクトの内部構造(C言
  語)に関しての知識が前提




2011-7-4    東大本郷              3
開発動機
• データ解析のためのツール
• 自分が必要だと思う機能を入れたい
• フリーがいい




2011-7-4    東大本郷     4
NArrayの手本
• IDL (Interactive Data Language)
• Yorick
• Python Numeric

• あまり知らないもの
      – MATLAB, Octave, Scilab
      –R
      – PDL
2011-7-4                   東大本郷     5
IDL
• 1970年代からあるらしい
• 商用 (Linux版1ライセンス25万円, 年間保守7万円)
• 機能
      –    便利な多次元配列
      –    数値計算ライブラリが豊富
      –    可視化・グラフィックライブラリが豊富
      –    プラットホーム非依存のGUI
      –    天文データ計算ライブラリが公開
• 言語仕様が古い
      – フラットネームスペース
      – 変数スコープ
           • ローカルまたはcommon宣言で共有
      – あとづけオブジェクト指向

2011-7-4                 東大本郷      6
IDLで作ったツール




                        Cross-platform GUI
                        の作成が容易




2011-7-4       東大本郷                     7
Yorick
• フリーソフト
• C言語に似た言語
• 独特の多次元配列操作記法
      – ベクトルの外積:    x*y(-,)
      – 行列積:        A(,+)*B(+,)
• あまり性能はよくなかった
• あまり使われていない

2011-7-4            東大本郷          8
NumPy
• Numeric → NumArray → NumPy と変遷
• 最近
      – 初期にに比べていろいろ改善
      – グラフィックライブラリもできた: matplotlib
      – コミュニティが増えた
      – 実際に幅広く使われている
           • 天文データ



2011-7-4              東大本郷            9
Scientific Ruby に必要なもの

• プログラムが書ける                – Ruby
• インタラクティブ                 – irb
• データ配列操作                  – NArray
• 数値計算ライブラリ                – Lapack, FFTW, GSL
                            等のwrapper
• グラフ表示機能                  – ?

2011-7-4            東大本郷                     10
Ruby/NArray
• 多次元数値配列
      – Numerical N-dimensional Array
• http://narray.rubyforge.org
• http://github.com/masa16/narray




2011-7-4                   東大本郷         11
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
NArray 構成要素 (基本部分)

• rank
      – 次元数
• shape
      – 配列の「形」
• type
      – 要素の型
• memory block
      – データを格納するメモリーブロック

2011-7-4           東大本郷         13
メモリーブロック
• 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
NArray(リリース版)のデータ型
                   (ビルトイン)
• 整数                        • 複素数
      – BYTE (8bit)             – SCOMPLEX (64bit)
      – SINT (16bit)            – DCOMPLEX (128bit)
      – INT (32bit)         • Rubyオブジェクト
• 浮動小数点数                        – ROBJECT
      – SFLOAT (32bit)
      – DFLOAT (64bit)



2011-7-4                 東大本郷                         15
配列の形: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
多次元データの順序
• 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
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
配列のスライス
• 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
部分代入
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,*] = 99

2011-7-4       東大本郷         20
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 module

2011-7-4                          東大本郷                                         21
coerce
• a+b
• レシーバ a が b の型を知らない
• coerce で型変換してから演算
  a,b = b.coerce(a,b)
• a が Numeric → NArrayScalar
• NArray同士では、coerce は使わない
      – 巨大な配列の場合、型変換のコストが大きい
      – 行列が絡むと、さらにややこしい

2011-7-4        東大本郷           22
upcast
• NArrayの演算は、(基本的に)同じ型同士
• 型が異なる場合:UPCASTテーブルに基づい
  て型変換する
• DFLOAT + SFLOAT の場合、後者を DFLOAT に
  変換してから演算
• a = NArray.sfloat(n) のとき、
• 0.5 * a が返す型は?
      – 配列の型を優先:単精度で返す

2011-7-4        東大本郷                 23
サイズ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
繰り返しルールの応用:クロス演算
• 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
条件演算
• 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] = 0

2011-7-4                        東大本郷     26
マンデルブロ(普通の計算方法)
 複素数配列
    実部→
                                                 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
           end
2011-7-4                                  東大本郷                  27
マンデルブロ(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=18
end
                   1. ループの順序を入れ替える
                   2. 条件分岐にwhere を使う

  2011-7-4                        東大本郷
                                                  i=30   28
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 faster

2011-7-4                        東大本郷         29
マンデルブロの計算速度
                  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 size


2011-7-4                                            東大本郷                                30
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
バイナリデータとして
• NArrayのメモリーデータを Stringと相互変換
• NArray → String
      – narray.to_s
• String → NArray
      – NArray.to_na( string, NArray::DFLOAT, nx, ny )


• バイトオーダ変換メソッド
      – hton, ntoh, vtoh, htov
2011-7-4                    東大本郷                         32
NArray開発状況
• リリース版:
      – 0.5.9.9    最新版


• 開発版
      – 0.7.0.1    非互換の変更(2007年)
      – 0.9 ?      0.7 からさらに仕様変更




2011-7-4              東大本郷         33
次版の開発動機
• すでにNumPyより大きく出遅れている
• 配列の基本機能として、NumPy で可能なこと
  はすべて可能にしたい
• +αの機能
• 周辺機能(行列演算、FFT等)は追々。。。




2011-7-4     東大本郷       34
開発版の変更点
•   次元順序の変更
•   64bit対応
•   データ型が追加可能
•   配列スライスのとき、コピーを作らない
•   NMatrix, NVector は廃止
      – 行列積の記法以外にメリットがない
      – クラス変換とかcoerceで複雑になる
      – dot メソッドで代用
2011-7-4          東大本郷        35
開発版の新機能
•   inplace 演算
•   ビット配列
•   構造体データ型
•   mmap




2011-7-4         東大本郷   36
次元の順序
                                 データが連続する順番
• リリース版:
      – 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
64bit対応
• リリース版
      – データ位置のデータ型:             int32_t
      – 配列サイズ: 最大2GB
• 開発版
      – NArrayに Int64 型を追加
      – データ位置のデータ型: sizt_t
      – where が返すデータ型:
           • 配列サイズによって、Int32 または Int64


2011-7-4                 東大本郷             38
データ型
• リリース版
      –    NArrayクラスの内部属性
      –    NArray#typecode で型コードを返す
      –    NArray::DFLOAT :型コード定数
      –    データ型は固定で、追加不可能
• 開発版
      – NArrayクラスのサブクラス
      – クラス名: NArray::DFloat など
           • 前は Num::DFloat だった。まだ悩み中…
      – データ型の追加が可能

2011-7-4                   東大本郷          39
データ型一覧
• 既存の型                           • 新規の型
      –    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::RObject


2011-7-4                      東大本郷                         40
型変換
• 演算によって、どの型に変換するか決めたい
      – float * int => float * float
      – float ** int => float ** int
• coerce は、演算ごとに設定できない
• NArrayでは、UPCASTを導入




2011-7-4                      東大本郷     41
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
NumPy配列スライス
• 「元の配列の一部分を指す配列」が作られる
• データがコピーされない
• スライス配列の値を変えると、元の配列も変わる

                 a =




   b = a[1::2,1::2] =
                               b [0,0] = 99
                               a[1,1] #=> 99
2011-7-4                東大本郷                   43
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
リリース版NArray配列スライス
• 値をコピーした新しい配列が作られる
• スライス配列を書き換えても、元の配列の内
  容は変更されない
                 a =




   b = a[1..2,1..2] =          b [0,0] = 99
                               a[1,1] #=> 0
2011-7-4                東大本郷                  45
配列スライス
• NumPy式
      – スライス配列を書き換える
      – スライスだけなら高速
      – オブジェクトの構造が複雑
• NArray式
      – オブジェクトの構造が簡単




2011-7-4        東大本郷   46
開発版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
開発版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
stridx
• 最下位ビットが1:
      – 1ビット下位にシフトした数を stride とみなす
      stride = stridx>>1 = 4


• 最下位ビットが0:
      – ポインタとみなし、index配列を指す
      *stridx = index = [1,2,4,7]


2011-7-4              東大本郷           49
stridx 実装
•   インデックスを持つと、実装が複雑に
•   ループも遅い
•   本当に必要か?
•   まだ悩み中




2011-7-4      東大本郷      50
inplace
• 元の配列に結果を上書き
      – メモリーを確保しなくて済むので、高速
• リリース版
      – a.mul!(b).add!(c)
      – 演算子が使えない
      – メソッドを作る必要がある




2011-7-4             東大本郷    51
inplace
• 開発版
      – inplace フラグが付いたオブジェクトに上書き
      – Numpy にはない機能
• フラグの伝播
      – a.inplace * b + c    # すべて a に上書き
• 左側でも上書き
      – a + b * c.inplace    # すべて c に上書き
• 両側ともinplaceのときは、左側に上書き
      – a.inplace * b + c.inplace * d

2011-7-4              東大本郷                  52
inplace (contd.)
• NMath でも上書き
      – NMath.sin(a.inplace)
• スライス配列でも上書き
      – a[1..2,1..2].inplace + 1
      => a[1..2,1..2] += 1 と同じだが、配列は作
        らない




2011-7-4             東大本郷           53
ビット配列
• 0 or 1 の配列
• 1要素が 1ビット
      – バイト配列と比べて、サイズが1/8になる
• 条件演算の結果として使う
      – and / or が高速(のはず)
• 多次元スライスも可能



2011-7-4             東大本郷      54
構造体データ型
Foo = NArray::NStruct.new() do
  int8 :byte
  float64 :float, [2,2]
  dcomplex :compl
end
z = 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
mmap
• メモリーをファイルにマップ
      – メモリーに全データをロードできない場合に需要あり
• 環境の違いを吸収
      – UNIX系 → mmap
      – Windows → MapViewOfFile


• 前は ByteData クラスというメモリークラスを作っ
  て、そのサブクラスにした
• 今は、NArrayでメモリー管理

2011-7-4                  東大本郷     56
メモリー参照の問題
• 他のオブジェクトのメモリーを参照
      – ポインタが変わらなければ問題はなさそう
           • 今はそうしている
      – ポインタが変わる場合
           • 配列のサイズを可変にしたい
           • データを push したいとか需要あり
           • realloc
           • 他のオブジェクトでポインタを使っている間に、ポインタ
             が変わらないような、ロックの仕組みが必要
           • Rubyとしての枠組みはないですよね

2011-7-4                東大本郷          57
NArrayへの協力
• Prince lab https://github.com/princelab/narray/wiki
      – チュートリアル英語版




2011-7-4                   東大本郷                         58
プロットツールについて余談




2011-7-4        東大本郷       59
matplotlib
• Pythonプロットツール
• MATLABのコマンド体
  系がベース
• これが出てから、
  Numpyが広まったよう
  な気がする
• Rubyにもプロットツー
  ルがほしい

2011-7-4      東大本郷      60
既存のRubyプロットツール
• Ruby/PGPLOT
      – PGPLOTライブラリのラッパー
• Ruby/DCL
      – DCLのラッパー
• どちらもFORTRANライブラリで、古い
• GNUPLOT みたいに
    plot x,y
    と書くだけで、プロットしたい
2011-7-4           東大本郷     61
作りかけのプロットライブラリ
• グラフィックバックエンド
      – X11 と Win32 と Postscript に対応
• 2次元プロットはできた
• 「プロット機能」と「装飾機能」を分離したい
      – CSS みたいな
• 今だと Cairo と WPF に対応しなきゃ?
• 自分でできる気がしない

2011-7-4                東大本郷           62
Scientific Ruby

• プログラムが書ける             – Ruby
• インタラクティブ              – irb
• データ配列操作               – NArray
• 数値計算ライブラリ             – FFTW, Lapack, GSL
• グラフ表示機能               – ?



2011-7-4         東大本郷                     63
並列分散ワークフローシステム
        Pwrake(プレイク)
           http://github.com/masa16/pwrake




2011-7-4               東大本郷                  64
Pwrake開発動機
• Gfarm開発者の建部チームに所属
• 研究テーマ
      – Gfarmを使った天文アプリケーションの性能調査




2011-7-4         東大本郷              65
Gfarm 広域分散ファイルシステム
  •        各ノードのストレージを統合
  •        統一したディレクトリ空間
  •        広域でファイルを共有
  •        http://datafarm.apgrid.org/

                               Internet
                                                                        Gfarm File System
Computer nodes                                                                         /
                                                                             /dir1          /dir2
 Local     Local     Local                Local     Local     Local
 Storage   Storage   Storage              Storage   Storage   Storage
                                                                         file1 file2       file3 file4
  2011-7-4                                                    東大本郷                                  66
ローカリティを考慮したタスク実行
• Gfarmでは、計算ノードがとストレージノードを兼ねる
• ファイルが存在するノードで処理すれば、性能が向上
• タスク実行は、ワークフローシステムが行う


                                         Slow


           Task for         Task for
            File 1           File 3
               Local     Local                  Fast    Local      Local
               Storage   Storage                        Storage
                                                       file3       Storage
                                                                  file4
              file1      file2

2011-7-4                               東大本郷                                  67
ワークフローツール
• GXP
      – 東大田浦さんらが開発したツール
      – Python で記述
      – クラスターの各ノードで、一斉にコマンド実行
• GXP make : GNU make の機能
      – 始めは GXP make を使用
      – ローカリティを考慮した機能がない
      – 拡張しようにも、Python なのでよくわからない
• Rakeを拡張しよう
2011-7-4          東大本郷              68
Rakefile におけるタスク記述
    タスク定義                  依存関係
   (Rubyメソッド)         自身のタスク名 => 依存タスク名


file “prog” => [“a.o”, “b.o”] do
  sh “cc –o prog a.o b.o”
end
       Ruby コードブロック
タスクのアクションをRuby言語で記述




2011-7-4                 東大本郷             69
Rakeを拡張しよう
• Rake の並列実行
  multitask “out” => [“in1”, “in2”, “in3”]
• in1..in3 についてスレッドを起動して、タスクを
  並列実行
• タスクの数だけスレッドを立ち上げる
      – 並列度を制御できない
• 当初の目標:
      – 並列度制御、リモート実行機能
2011-7-4           東大本郷                  70
最初のPwrake
• multitask => pw_multitask
      – スレッドプールを作り、指定の並列数でタスクを実行
• Sshクラス
      – ssh コマンドでリモート接続
• sh => t.rsh
      – Rake::Task クラスのメソッド
      – 実行ノードを知る必要があるため
• これでは互換性がない
      – Pwrake用に書いたRakefileが、Rakeで動かない
      – Rake用に書いたRakefileが、Pwrakeで並列に走らない

2011-7-4              東大本郷              71
改良したPwrake
• タスク並列性
      – Drake を参考にした
           • 毎回タスクの依存性を辿って、キューに入れる
      – Drake は、1回の探索でタスク1個取得
      – Pwrake は、1回の探索で実行可能なタスク全て取得
• sh における接続情報の取得
      – Thread.current[:connection] で接続先を渡す
• Rakeで動くRakefileが、Pwrakeで並列分散実行


2011-7-4                東大本郷                  72
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
ワークフロー記述言語としての
                Rakefile
• 科学ワークフローは、Makefileのルールに収
  まらないことが多い
• Rakefileは、Rubyの内部DSLなので、プログラ
  ムが書ける




2011-7-4         東大本郷            74
依存関係がファイルに書かれている
           場合
• 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
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
動的なワークフローの生成
• タスクを実行した結果により、それ以降のファ
  イル・タスクが定義できる
                        Task


                file1   file2     file3

                    Task      Task

                           File
2011-7-4        東大本郷                      77
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
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
Rakeにおける動的タスク生成(成功)
task :A do          • 変数 b に、Taskオブ
  b = task :B do      ジェクトを格納
    puts “B”        • invoke メソッドにより、
  end                 明示的に実行
  b.invoke          • Rake により、動的な
                      ワークフローが実現
end
task :default => :A



2011-7-4         東大本郷               80
天文データ処理の例
• Montage
      – software for producing a custom mosaic image
        from multiple shots of images.
      – http://montage.ipac.caltech.edu/




2011-7-4                   東大本郷                        81
Montage Workflow
             Input images                            • 処理内容:
             mProjectPP
                                                          – 座標変換
                                                          – 明るさ補正
                                                          – 足し合わせ
                 mDiff               mBackground

                                                     • 1 image : 1 process
              mFitplane                 mAdd

       a1x+b1y+c1=0   a2x+b2y+c2=0


               mBgModel


            m1 = a'1x+b'1y+c'1
            m2 = a'2x+b'2y+c'2

                                     Final image
2011-7-4                                           東大本郷                      82
Montageワークフローのグラフ
                   flow




           Input
                            Output
           files
                            file




2011-7-4             東大本郷            83
Montage Workflow 性能評価
• ワークフローを                       Input images
  Rakefileとして記述
                                mProjectPP




                                     mDiff             mBackground




                                  mFitplane               mAdd

                           a1x+b1y+c1=0 a2x+b2y+c2=0


                                  mBgModel


                                m1 = a'1x+b'1y+c'1
                                m2 = a'2x+b'2y+c'2

                                                       Final image
2011-7-4            東大本郷                                             84
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
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 cores




2011-7-4                         東大本郷                              86
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
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 cores




2011-7-4                         東大本郷                              88
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 cores




2011-7-4                         東大本郷                              89
Pwrake 今後の予定
• 大規模なワークフローの実行
      – 100万並列
      – 自律分散システム
• 障害対策
      – 障害情報の取得
      – タスクの再試行
      – 故障ノードの判別
• 可用性
      – 実行状況の可視化、プロファイリング
2011-7-4           東大本郷     90
階層的自律分散システム
 現状                            将来
                  接続ごとに
         Pwrake                          Pwrake
                  Threadが起動
         プロセス                            プロセス

                                                  DAGを渡して
                                                  自律処理

  クラスタ            クラスタ          クラスタ               クラスタ

 計算                             Pwrake             Pwrake
                       計算
プロセス                            プロセス               プロセス
                      プロセス
        計算     計算
       プロセス   プロセス
                               計算
                                                       計算
                              プロセス    計算       計算     プロセス
                                     プロセス     プロセス
Pwrakeまとめ
• ワークフロー記述言語として、Rakeを採用
• 並列分散ワークフロー処理システムPwarkeを
  開発
      – URL: http://github.com/masa16/pwrake
• 分散ファイルシステムGfarmを用いることによ
  り、スケーラブルな性能向上を達成



2011-7-4                  東大本郷                 92

Más contenido relacionado

La actualidad más candente

条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたMITSUNARI Shigeo
 
SSDとTokyoTyrantやMySQLの性能検証
SSDとTokyoTyrantやMySQLの性能検証SSDとTokyoTyrantやMySQLの性能検証
SSDとTokyoTyrantやMySQLの性能検証勲 國府田
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化 sakura-mike
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイドTakahiro Itagaki
 
プログラマのための文書推薦入門
プログラマのための文書推薦入門プログラマのための文書推薦入門
プログラマのための文書推薦入門y-uti
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門Shintaro Fukushima
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)Satoshi Yamada
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Makoto Kawano
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Etsuji Nakai
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)Shuyo Nakatani
 
Python vs ruby
Python vs rubyPython vs ruby
Python vs rubyosamunmun
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Kotaro Nakayama
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 

La actualidad más candente (20)

条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
SSDとTokyoTyrantやMySQLの性能検証
SSDとTokyoTyrantやMySQLの性能検証SSDとTokyoTyrantやMySQLの性能検証
SSDとTokyoTyrantやMySQLの性能検証
 
並列化による高速化
並列化による高速化 並列化による高速化
並列化による高速化
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイド
 
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
プログラマのための文書推薦入門
プログラマのための文書推薦入門プログラマのための文書推薦入門
プログラマのための文書推薦入門
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
 
Python vs ruby
Python vs rubyPython vs ruby
Python vs ruby
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 

Destacado

多次元配列機能比較
多次元配列機能比較多次元配列機能比較
多次元配列機能比較Masahiro Tanaka
 
Rubyと機械学習の現状
Rubyと機械学習の現状Rubyと機械学習の現状
Rubyと機械学習の現状Aki Ariga
 
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
RubyエンジニアがPythonをdisるためにPythonを勉強してみたRubyエンジニアがPythonをdisるためにPythonを勉強してみた
RubyエンジニアがPythonをdisるためにPythonを勉強してみたYusuke Kon
 
kintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みkintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みRyo Mitoma
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングSatoshi Kodaira
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書くmametter
 
Ruby の標準乱数生成器とその改善案
Ruby の標準乱数生成器とその改善案Ruby の標準乱数生成器とその改善案
Ruby の標準乱数生成器とその改善案Kenta Murata
 
Weekly news 4
Weekly news 4Weekly news 4
Weekly news 4ASekhon
 
Classboxes, nested methods, and real private methods
Classboxes, nested methods, and real private methodsClassboxes, nested methods, and real private methods
Classboxes, nested methods, and real private methodsShugo Maeda
 
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015Kosuke Shinoda
 
8つの魔法の習得 -RとRubyによるデータ解析入門より-
8つの魔法の習得 -RとRubyによるデータ解析入門より-8つの魔法の習得 -RとRubyによるデータ解析入門より-
8つの魔法の習得 -RとRubyによるデータ解析入門より-Yuki Shimizu
 
Lean Software Development at ADC2003 Japanese subtitled
Lean Software Development at ADC2003 Japanese subtitledLean Software Development at ADC2003 Japanese subtitled
Lean Software Development at ADC2003 Japanese subtitledKenji Hiranabe
 
巨人の勝率を上げたい (スクレイピングとデータ集計)
巨人の勝率を上げたい (スクレイピングとデータ集計)巨人の勝率を上げたい (スクレイピングとデータ集計)
巨人の勝率を上げたい (スクレイピングとデータ集計)Takuma Hatano
 
指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係Nagi Teramo
 
Awsとrubyで作るビッグデータ解析の裏側
Awsとrubyで作るビッグデータ解析の裏側Awsとrubyで作るビッグデータ解析の裏側
Awsとrubyで作るビッグデータ解析の裏側Shohei Kobayashi
 
「深層学習」第6章 畳込みニューラルネット
「深層学習」第6章 畳込みニューラルネット「深層学習」第6章 畳込みニューラルネット
「深層学習」第6章 畳込みニューラルネットKen'ichi Matsui
 
Libre planet2017 micky
Libre planet2017 mickyLibre planet2017 micky
Libre planet2017 mickyMicky Metts
 
Using Facebook, Twitter & Instagram to build interest in your club
Using Facebook, Twitter & Instagram to build interest in your clubUsing Facebook, Twitter & Instagram to build interest in your club
Using Facebook, Twitter & Instagram to build interest in your clubAndrew Hesselden
 

Destacado (20)

多次元配列機能比較
多次元配列機能比較多次元配列機能比較
多次元配列機能比較
 
Rubyと機械学習の現状
Rubyと機械学習の現状Rubyと機械学習の現状
Rubyと機械学習の現状
 
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
RubyエンジニアがPythonをdisるためにPythonを勉強してみたRubyエンジニアがPythonをdisるためにPythonを勉強してみた
RubyエンジニアがPythonをdisるためにPythonを勉強してみた
 
kintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みkintoneの検索高速化への取り組み
kintoneの検索高速化への取り組み
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
Ruby の標準乱数生成器とその改善案
Ruby の標準乱数生成器とその改善案Ruby の標準乱数生成器とその改善案
Ruby の標準乱数生成器とその改善案
 
Weekly news 4
Weekly news 4Weekly news 4
Weekly news 4
 
Classboxes, nested methods, and real private methods
Classboxes, nested methods, and real private methodsClassboxes, nested methods, and real private methods
Classboxes, nested methods, and real private methods
 
人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015人狼知能プログラミング演習資料2015
人狼知能プログラミング演習資料2015
 
8つの魔法の習得 -RとRubyによるデータ解析入門より-
8つの魔法の習得 -RとRubyによるデータ解析入門より-8つの魔法の習得 -RとRubyによるデータ解析入門より-
8つの魔法の習得 -RとRubyによるデータ解析入門より-
 
Lean Software Development at ADC2003 Japanese subtitled
Lean Software Development at ADC2003 Japanese subtitledLean Software Development at ADC2003 Japanese subtitled
Lean Software Development at ADC2003 Japanese subtitled
 
巨人の勝率を上げたい (スクレイピングとデータ集計)
巨人の勝率を上げたい (スクレイピングとデータ集計)巨人の勝率を上げたい (スクレイピングとデータ集計)
巨人の勝率を上げたい (スクレイピングとデータ集計)
 
指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係指数分布とポアソン分布のいけない関係
指数分布とポアソン分布のいけない関係
 
Awsとrubyで作るビッグデータ解析の裏側
Awsとrubyで作るビッグデータ解析の裏側Awsとrubyで作るビッグデータ解析の裏側
Awsとrubyで作るビッグデータ解析の裏側
 
「深層学習」第6章 畳込みニューラルネット
「深層学習」第6章 畳込みニューラルネット「深層学習」第6章 畳込みニューラルネット
「深層学習」第6章 畳込みニューラルネット
 
Memes
MemesMemes
Memes
 
IV Convención CPONET
IV Convención CPONETIV Convención CPONET
IV Convención CPONET
 
Libre planet2017 micky
Libre planet2017 mickyLibre planet2017 micky
Libre planet2017 micky
 
Using Facebook, Twitter & Instagram to build interest in your club
Using Facebook, Twitter & Instagram to build interest in your clubUsing Facebook, Twitter & Instagram to build interest in your club
Using Facebook, Twitter & Instagram to build interest in your club
 

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

NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010Masahiro Tanaka
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20Yasuo Tabei
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料Hiromasa Ohashi
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparsenessybenjo
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Yusaku Kawaguchi
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
HistoPyramid Stream Compaction
HistoPyramid Stream CompactionHistoPyramid Stream Compaction
HistoPyramid Stream Compactiondasyprocta
 
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~ryuz88
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with PythonAtsushi Hayakawa
 
openFrameworks Workshop in Kanazawa v001
openFrameworks Workshop in Kanazawa v001openFrameworks Workshop in Kanazawa v001
openFrameworks Workshop in Kanazawa v001Teruaki Tsubokura
 
Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックスTomoharu ASAMI
 

Similar a Ruby科学データ処理ツールの開発 NArrayとPwrake (20)

NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010NArray and scientific computing with Ruby - RubyKaigi2010
NArray and scientific computing with Ruby - RubyKaigi2010
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparseness
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
Tokyo r47 beginner_2
Tokyo r47 beginner_2Tokyo r47 beginner_2
Tokyo r47 beginner_2
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
HistoPyramid Stream Compaction
HistoPyramid Stream CompactionHistoPyramid Stream Compaction
HistoPyramid Stream Compaction
 
FOSS4G 2012 Osaka
FOSS4G 2012 OsakaFOSS4G 2012 Osaka
FOSS4G 2012 Osaka
 
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Mongodb 紹介
Mongodb 紹介Mongodb 紹介
Mongodb 紹介
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
 
openFrameworks Workshop in Kanazawa v001
openFrameworks Workshop in Kanazawa v001openFrameworks Workshop in Kanazawa v001
openFrameworks Workshop in Kanazawa v001
 
Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックス
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Último (8)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

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

  • 1. Ruby科学データ処理ツールの開発 NArrayとPwrake 田中昌宏 筑波大学 計算科学研究センター 2011-7-4 東大本郷 1
  • 2. 内容 • 多次元数値配列 NArray – リリース版 – 開発版 • プロットツール • 並列分散ワークフローシステム Pwrake 2011-7-4 東大本郷 2
  • 3. 注意書き • これまで考えたことの、まとまりのない話 • HPC的とか、学術的な話ではありません • Ruby言語、Rubyオブジェクトの内部構造(C言 語)に関しての知識が前提 2011-7-4 東大本郷 3
  • 5. NArrayの手本 • IDL (Interactive Data Language) • Yorick • Python Numeric • あまり知らないもの – MATLAB, Octave, Scilab –R – PDL 2011-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/narray 2011-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,*] = 99 2011-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 module 2011-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] = 0 2011-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 end 2011-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=18 end 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 faster 2011-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 size 2011-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, htov 2011-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 演算 • ビット配列 • 構造体データ型 • mmap 2011-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 または Int64 2011-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::RObject 2011-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] #=> 99 2011-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
  • 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 * d 2011-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 :compl end z = 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
  • 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/pwrake 2011-7-4 東大本郷 64
  • 65. Pwrake開発動機 • Gfarm開発者の建部チームに所属 • 研究テーマ – Gfarmを使った天文アプリケーションの性能調査 2011-7-4 東大本郷 65
  • 66. Gfarm 広域分散ファイルシステム • 各ノードのストレージを統合 • 統一したディレクトリ空間 • 広域でファイルを共有 • http://datafarm.apgrid.org/ Internet Gfarm File System Computer 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 file2 2011-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 File 2011-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 により、動的な ワークフローが実現 end task :default => :A 2011-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 = a'1x+b'1y+c'1 m2 = a'2x+b'2y+c'2 Final image 2011-7-4 東大本郷 82
  • 83. Montageワークフローのグラフ flow Input Output files file 2011-7-4 東大本郷 83
  • 84. Montage Workflow 性能評価 • ワークフローを Input images Rakefileとして記述 mProjectPP mDiff mBackground mFitplane mAdd a1x+b1y+c1=0 a2x+b2y+c2=0 mBgModel m1 = a'1x+b'1y+c'1 m2 = a'2x+b'2y+c'2 Final image 2011-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 cores 2011-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 cores 2011-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 cores 2011-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