明日使える超高速 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万件の学習(一周)に24時間
 – 計算量が O(W^2)!
 – Rubyの範囲での最適化はやりつくしたつもり
   • もちろん Ruby1.9
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               #   出力
そうは言っても、速さは正義
• 少なくとも何百回とか学習が必要
 – パラメータを変えながら交差検定とかしたい


• やっぱりC++で実装するか……
 – Rubyの100倍~1000倍違うし
  • 24時間/100 = 15分
 – Rubyのお手軽さは捨てがたくもある
  • C++はいちいちコンパイル
 – C++に逃げたらなんか負けた気がする
  • naoya_tさん曰く「リニアに速くなるだけでしょ?」
Rubyのままで
速くなる方法は
 ないのか?
RubyでXbyak
Xbyak(カイビャック)
• 実行バイナリ(ネイティブコード)を動的に生
  成するC++ライブラリ
• つまり JIT (Just in Time compiler)
• C++より速い
 – C++のライブラリなのに!?
 – もちろんRubyなんかメじゃない


• 光成さん(サイボウズ・ラボ)開発
 – http://homepage1.nifty.com/herumi/soft/xbyak.html
JITってなんだ?
JIT=MSXべーしっ君
要するに
「めっっちゃ速い」
Ruby で
Xbyak が使えたら
 いいんじゃね?
RXbyak (Xbyak for Ruby)
• Xbyakを使えるRuby拡張
• Xbyak のネイティブコード生成機能を Ruby
  からそのまま利用可能に
• 生成したコードをRubyから呼び出す
 – 実装率低め
 – 明日まだ使えない!(><


 http://github.com/shuyo/cpp/tree/master/rxbyak/
ひとことで
 いうと
RXbyak とは
Rubyで
アセンブラが
 書ける
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
    ※このサンプルに使われている命令しかまだ実装されていません。
機械学習を
  RXbyak で書いたら
「××倍速くなったよ!」
まにあわんかった
  すまん(汗
(参考) Python vs Xbyak




http://labs.cybozu.co.jp/blog/mitsunari/2007/08/ll2007.html
何に使えるの?
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命
     令で!
                                     ※使用者の感想であり、
                                効用を約束するものではありません。
本日Mitaka.rb に
参加した皆さんは
これでもう
「RXbyak で
高速Rubyコード
書いちゃうぞ~」
明日から
     ビュンビュン
     ですね!
                           ※2009/10/22現在、
mov(代入) と mul(掛け算) と ret しか実装されていません。
ありがとう
ございました

More Related Content

PDF
Lisp meetup #29 cl-online-learningの紹介
PDF
Lispmeetup #45 Common Lispで音声合成
PDF
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
PDF
二階堂愛と二階堂藍の違いについて
PDF
NetworkXによる語彙ネットワークの可視化
PPTX
ぼくの実装した最弱のディープラーニング
PPTX
クリスマス?
PDF
111015 tokyo scipy2_ディスカッション
Lisp meetup #29 cl-online-learningの紹介
Lispmeetup #45 Common Lispで音声合成
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
二階堂愛と二階堂藍の違いについて
NetworkXによる語彙ネットワークの可視化
ぼくの実装した最弱のディープラーニング
クリスマス?
111015 tokyo scipy2_ディスカッション

What's hot (20)

PDF
Kaggle の Titanic チュートリアルに挑戦した話
PDF
Numpy scipy matplotlibの紹介
PDF
Chainer入門と最近の機能
PPTX
Tfug#4
PDF
Introduction to Chainer and CuPy
PDF
Immutable List Gem (KLab ALM版)
PDF
Study session#2
PDF
CVPR2015読み会 "Joint Tracking and Segmentation of Multiple Targets"
PDF
詳解! Decimal
PDF
量子コンピュータでニューラルネットワークな論文紹介
PDF
TFUG_yuma_matsuoka__distributed_GPU
PDF
Kaggleのテクニック
PDF
CuPy解説
PDF
ICFP2009-いかにして我々は戦ったか
PDF
Python vs ruby
PDF
最適化超入門
PDF
NumPyが物足りない人へのCython入門
PDF
自作GPUへの道
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PDF
リテラル文字列型までの道
Kaggle の Titanic チュートリアルに挑戦した話
Numpy scipy matplotlibの紹介
Chainer入門と最近の機能
Tfug#4
Introduction to Chainer and CuPy
Immutable List Gem (KLab ALM版)
Study session#2
CVPR2015読み会 "Joint Tracking and Segmentation of Multiple Targets"
詳解! Decimal
量子コンピュータでニューラルネットワークな論文紹介
TFUG_yuma_matsuoka__distributed_GPU
Kaggleのテクニック
CuPy解説
ICFP2009-いかにして我々は戦ったか
Python vs ruby
最適化超入門
NumPyが物足りない人へのCython入門
自作GPUへの道
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
リテラル文字列型までの道
Ad

Viewers also liked (7)

PDF
Rubyによるデータ解析
PPTX
PRML第6章「カーネル法」
PDF
パターン認識と機械学習6章(カーネル法)
ZIP
今さら聞けないカーネル法とサポートベクターマシン
PDF
ロジスティック回帰の考え方・使い方 - TokyoR #33
PDF
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
PPTX
TensorFlowで会話AIを作ってみた。
Rubyによるデータ解析
PRML第6章「カーネル法」
パターン認識と機械学習6章(カーネル法)
今さら聞けないカーネル法とサポートベクターマシン
ロジスティック回帰の考え方・使い方 - TokyoR #33
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlowで会話AIを作ってみた。
Ad

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

PDF
RubyKaigi2014: Just in Time compiler for CRuby
PDF
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
PDF
ET2017資料: 開発言語mruby・mruby/cが開く新たなIoTプラットフォーム
PDF
Ruby で高速なプログラムを書く
PDF
PDF
Ruby 2.5
PDF
組込み向けRuby処理系mrubyの可能性
ODP
kpfx07 LT ruby-processingでイケメンになりたい
PDF
Ruby でつくる型付き Ruby
PDF
VimとRubyのアツい関係
PDF
Summary of Ruby
PDF
grep ruby
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
PDF
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
PDF
MobiRubyでiOSアプリをつくろう
PDF
マニアックなRuby 2.7新機能紹介
PDF
RubyのGC改善による私のエコライフ
PDF
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
PPTX
Perlと出会い、Perlを作る
PPSX
ここまで来た開発言語 mruby・mruby/cの最新情報 “本当に使える”IoTプラットフォーム
RubyKaigi2014: Just in Time compiler for CRuby
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2017資料: 開発言語mruby・mruby/cが開く新たなIoTプラットフォーム
Ruby で高速なプログラムを書く
Ruby 2.5
組込み向けRuby処理系mrubyの可能性
kpfx07 LT ruby-processingでイケメンになりたい
Ruby でつくる型付き Ruby
VimとRubyのアツい関係
Summary of Ruby
grep ruby
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
MobiRubyでiOSアプリをつくろう
マニアックなRuby 2.7新機能紹介
RubyのGC改善による私のエコライフ
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
Perlと出会い、Perlを作る
ここまで来た開発言語 mruby・mruby/cの最新情報 “本当に使える”IoTプラットフォーム

More from Shuyo Nakatani (20)

PDF
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
PDF
Generative adversarial networks
PDF
無限関係モデル (続・わかりやすいパターン認識 13章)
PDF
Memory Networks (End-to-End Memory Networks の Chainer 実装)
PDF
人工知能と機械学習の違いって?
PDF
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
PDF
ドラえもんでわかる統計的因果推論 #TokyoR
PDF
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
PDF
星野「調査観察データの統計科学」第3章
PDF
星野「調査観察データの統計科学」第1&2章
PDF
言語処理するのに Python でいいの? #PyDataTokyo
PDF
Zipf? (ジップ則のひみつ?) #DSIRNLP
PDF
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
PDF
ソーシャルメディアの多言語判定 #SoC2014
PDF
猫に教えてもらうルベーグ可測
PDF
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
PDF
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
PDF
Active Learning 入門
PDF
数式を綺麗にプログラミングするコツ #spro2013
PDF
ノンパラベイズ入門の入門
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
Generative adversarial networks
無限関係モデル (続・わかりやすいパターン認識 13章)
Memory Networks (End-to-End Memory Networks の Chainer 実装)
人工知能と機械学習の違いって?
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoR
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第1&2章
言語処理するのに Python でいいの? #PyDataTokyo
Zipf? (ジップ則のひみつ?) #DSIRNLP
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ソーシャルメディアの多言語判定 #SoC2014
猫に教えてもらうルベーグ可測
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
Active Learning 入門
数式を綺麗にプログラミングするコツ #spro2013
ノンパラベイズ入門の入門

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