明日使える超高速 Ruby
  ~ Ruby で Xbyak ~

        2009/10/22
   id:n_shuyo / @shuyo
 中谷 秀洋@サイボウズ・ラボ
最近のマイブーム
機械学習
自然言語処理
なんかこんな本
• Introduction to Information Retreival(IIR)
• パターン認識と機械学習(PRML, ぷるむる)
• とか
なんかこんなやつ
•   ロジスティック回帰
•   パーセプトロン
•   ニューラルネットワーク
•   サポートベクトルマシン(そのうち)
読んでるだけではよくわからない
• めっちゃ数式いっぱい
 – 関数解析/線形代数/確率分布
 – 最適化(プログラムのそれとは違うよ!)
 – ラグランジュ未定乗数法
• よく知らない概念いっぱい
 – ベイズ理論
 – 回帰分析
 – 確率...
実装してみると
  わかる(こともある)
Rubyで実装
• これが間違い(><
Rubyはつらいよ……
MNISTデータセット(手書き数字)
• ニューラルネットワークによる学習
 – 入力 : 28x28(ピクセル)
 – 中間層 : 300
 – 出力 : 10 (0~9 の判別)
 – 枝の本数 W = 27万

• 6万件の学習(一周)に...
Rubyにもいいところはある
• ネットワーク構造をDSL で表現!
    – ネットワークを変えての実験が容易
# units
in_units = [Unit.new("x1"), Unit.new("x2")]
hiddenunits ...
そうは言っても、速さは正義
• 少なくとも何百回とか学習が必要
 – パラメータを変えながら交差検定とかしたい


• やっぱりC++で実装するか……
 – Rubyの100倍~1000倍違うし
  • 24時間/100 = 15分
 – Ru...
Rubyのままで
速くなる方法は
 ないのか?
RubyでXbyak
Xbyak(カイビャック)
• 実行バイナリ(ネイティブコード)を動的に生
  成するC++ライブラリ
• つまり JIT (Just in Time compiler)
• C++より速い
 – C++のライブラリなのに!?
 – もちろんR...
JITってなんだ?
JIT=MSXべーしっ君
要するに
「めっっちゃ速い」
Ruby で
Xbyak が使えたら
 いいんじゃね?
RXbyak (Xbyak for Ruby)
• Xbyakを使えるRuby拡張
• Xbyak のネイティブコード生成機能を Ruby
  からそのまま利用可能に
• 生成したコードをRubyから呼び出す
 – 実装率低め
 – 明日まだ使...
ひとことで
 いうと
RXbyak とは
Rubyで
アセンブラが
 書ける
RXbyak サンプル
• SIMDを使って倍精度の掛け算
   – どこからどうみても Ruby のプログラム。
rx = RXbyak.new
rx.mov :eax, [:esp, 8]    #   mov eax, (esp+8)  ...
機械学習を
  RXbyak で書いたら
「××倍速くなったよ!」
まにあわんかった
  すまん(汗
(参考) Python vs Xbyak




http://labs.cybozu.co.jp/blog/mitsunari/2007/08/ll2007.html
何に使えるの?
RXbyakの応用範囲
• 実行時に処理が決まる場合(JIT)
 – ニューラルネットワークはグラフが与えられれば
 – URI Templates はテンプレートが与えられれば
   • 参考:URI Templates のC++(Xbyak...
本日Mitaka.rb に
参加した皆さんは
これでもう
「RXbyak で
高速Rubyコード
書いちゃうぞ~」
明日から
     ビュンビュン
     ですね!
                           ※2009/10/22現在、
mov(代入) と mul(掛け算) と ret しか実装されていません。
ありがとう
ございました
Upcoming SlideShare
Loading in …5
×

明日使える超高速Ruby - RXbyak (Mitaka.rb #5)

4,538 views

Published on

Rubyのままで速くなる方法

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,538
On SlideShare
0
From Embeds
0
Number of Embeds
609
Actions
Shares
0
Downloads
11
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

明日使える超高速Ruby - RXbyak (Mitaka.rb #5)

  1. 1. 明日使える超高速 Ruby ~ Ruby で Xbyak ~ 2009/10/22 id:n_shuyo / @shuyo 中谷 秀洋@サイボウズ・ラボ
  2. 2. 最近のマイブーム
  3. 3. 機械学習 自然言語処理
  4. 4. なんかこんな本 • Introduction to Information Retreival(IIR) • パターン認識と機械学習(PRML, ぷるむる) • とか
  5. 5. なんかこんなやつ • ロジスティック回帰 • パーセプトロン • ニューラルネットワーク • サポートベクトルマシン(そのうち)
  6. 6. 読んでるだけではよくわからない • めっちゃ数式いっぱい – 関数解析/線形代数/確率分布 – 最適化(プログラムのそれとは違うよ!) – ラグランジュ未定乗数法 • よく知らない概念いっぱい – ベイズ理論 – 回帰分析 – 確率過程 – カーネル法
  7. 7. 実装してみると わかる(こともある)
  8. 8. Rubyで実装 • これが間違い(><
  9. 9. Rubyはつらいよ……
  10. 10. MNISTデータセット(手書き数字) • ニューラルネットワークによる学習 – 入力 : 28x28(ピクセル) – 中間層 : 300 – 出力 : 10 (0~9 の判別) – 枝の本数 W = 27万 • 6万件の学習(一周)に24時間 – 計算量が O(W^2)! – Rubyの範囲での最適化はやりつくしたつもり • もちろん Ruby1.9
  11. 11. Rubyにもいいところはある • ネットワーク構造をDSL で表現! – ネットワークを変えての実験が容易 # units in_units = [Unit.new("x1"), Unit.new("x2")] hiddenunits = (1..6).map{|i| TanhUnit.new("z1#{i}")} out_unit = [SigUnit.new("y1")] # network network = Network.new(:error_func=>ErrorFunction::CrossEntropy) network.in = in_units # 入力 network.link in_units, hiddenunits # 入力 → 隠れユニット network.link hiddenunits, out_unit # 隠れユニット → 出力 network.out = out_unit # 出力
  12. 12. そうは言っても、速さは正義 • 少なくとも何百回とか学習が必要 – パラメータを変えながら交差検定とかしたい • やっぱりC++で実装するか…… – Rubyの100倍~1000倍違うし • 24時間/100 = 15分 – Rubyのお手軽さは捨てがたくもある • C++はいちいちコンパイル – C++に逃げたらなんか負けた気がする • naoya_tさん曰く「リニアに速くなるだけでしょ?」
  13. 13. Rubyのままで 速くなる方法は ないのか?
  14. 14. RubyでXbyak
  15. 15. Xbyak(カイビャック) • 実行バイナリ(ネイティブコード)を動的に生 成するC++ライブラリ • つまり JIT (Just in Time compiler) • C++より速い – C++のライブラリなのに!? – もちろんRubyなんかメじゃない • 光成さん(サイボウズ・ラボ)開発 – http://homepage1.nifty.com/herumi/soft/xbyak.html
  16. 16. JITってなんだ?
  17. 17. JIT=MSXべーしっ君
  18. 18. 要するに 「めっっちゃ速い」
  19. 19. Ruby で Xbyak が使えたら いいんじゃね?
  20. 20. RXbyak (Xbyak for Ruby) • Xbyakを使えるRuby拡張 • Xbyak のネイティブコード生成機能を Ruby からそのまま利用可能に • 生成したコードをRubyから呼び出す – 実装率低め – 明日まだ使えない!(>< http://github.com/shuyo/cpp/tree/master/rxbyak/
  21. 21. ひとことで いうと
  22. 22. RXbyak とは
  23. 23. Rubyで アセンブラが 書ける
  24. 24. RXbyak サンプル • SIMDを使って倍精度の掛け算 – どこからどうみても Ruby のプログラム。 rx = RXbyak.new rx.mov :eax, [:esp, 8] # mov eax, (esp+8) // 第1引数のポインタ rx.movq :xmm0, [:eax] # movq xmm0, (eax) rx.mov :eax, [:esp, 12] # mov eax, (esp+12) // 第2引数のポインタ rx.movq :xmm1, [:eax] # movq xmm1, (eax) rx.mulsd :xmm0, :xmm1 # mulsd xmm0, xmm1 // かけ算 rx.mov :eax, [:esp, 4] # mov eax, (esp+4) // 返値のポインタ rx.movq [:eax], :xmm0 # movq (eax), xmm0 rx.ret # ret puts rx.call(256.0, 256.0) # => 65536.0 puts rx.call(123.45, 678.9) # => 83810.205 ※このサンプルに使われている命令しかまだ実装されていません。
  25. 25. 機械学習を RXbyak で書いたら 「××倍速くなったよ!」
  26. 26. まにあわんかった すまん(汗
  27. 27. (参考) Python vs Xbyak http://labs.cybozu.co.jp/blog/mitsunari/2007/08/ll2007.html
  28. 28. 何に使えるの?
  29. 29. RXbyakの応用範囲 • 実行時に処理が決まる場合(JIT) – ニューラルネットワークはグラフが与えられれば – URI Templates はテンプレートが与えられれば • 参考:URI Templates のC++(Xbyak)実装 • http://labs.cybozu.co.jp/blog/nakatani/2008/07/uri_template_c_xbyak_jit.html – 正規表現 • プロセッサを極限まで使い切る!(アセンブラ) – SIMD(SSE) で浮動小数演算 • 並列演算とか128bit精度とか。SSE4.1 なら内積も1命 令で! ※使用者の感想であり、 効用を約束するものではありません。
  30. 30. 本日Mitaka.rb に 参加した皆さんは
  31. 31. これでもう
  32. 32. 「RXbyak で 高速Rubyコード 書いちゃうぞ~」
  33. 33. 明日から ビュンビュン ですね! ※2009/10/22現在、 mov(代入) と mul(掛け算) と ret しか実装されていません。
  34. 34. ありがとう ございました

×