今年は久々にRubyKaigiに参加しました。場所は仙台。参加費は会社から出してもらえるのでありがたい〜。とても刺激を受けた3日間でした。
戻ってきて早速、社内報告会を行いました。ただし、英語力が乏しいのと、Ruby自体の実装とかCの話とかは本当によくわからないので、めちゃくちゃざっくりとした報告に…。 とりあえず、自分が面白かったと思った話題について。
ちなみに、今回の聞く方針としては、
- 機械学習系のやつを聞いて、詳しくないなりに、社内にフィードバックする
- Rubocopの話とか押さえたい
- 自分たちの手で高速化できそうな話を聞く
という感じで考えてました。
TruffleRubyすごい
3日目のキーノートで話されたTruffleRubyに驚きました。TruffleRubyは、Oracle Labsが開発しているGraalVM上で動くRubyです。
GraalVMは多言語に対応した仮想マシンです。
上記のページに、
とあるので、そこからTruffleRubyという名前がついてるのでしょう。ちなみに、「トリュフ」だそうです。
7倍速い!
Rubyは現在、3x3 Rubyを目標として、Ruby 3はRuby 2の頃よりも3倍速くなることを目指しています。キーノートでは、Rubyのベンチマークで使われるOptCarrot(Rubyで作られたファミコンのエミュレータ)を使って、パフォーマンスの計測をしていました。
3倍速いどころではなく、7倍速いのにびっくりです。JITコンパイラがめちゃめちゃ効いてるからということでした。そのため、最初は遅いと。どういうふうに最適化が行われているかという話がありましたが、だんだん話についていけなくなり…。わかったのは、まだ実用的ではなさそうなことでした。ただ、もう少ししたらrbenvとかで試せるようにする、ということでした。Webアプリケーションでの恩恵がどの程度になるのかはわかりませんが、期待大だなと思いました!
DeepLearning
深層学習はRubyは弱いというイメージがありましたが、だいぶRubyだけで完結できる世界が近づいてるという印象を受けました。全くの門外漢なので、ChainerとTensorflowという名前だけは聞いたことがある…という程度なのですが、MXNetというApacheプロジェクトのものがあるのを知ることができました。
話は基本的にはmxnet.rbと、Red Chainer(ChainerをRubyでポーティングしたもの)でした。
MXNet
MXNetは多言語サポートをしていて将来的にはRubyもサポートされること、多くの企業・大学がサポートしていること(Amazon、MS、MIT、カーネギーメロン大学など)、利点が多いことなどをあげられていました。Apacheプロジェクトということで、他のデータサイエンス系のApacheプロジェクトのメジャーツールとの連携が期待できることや、ONNXをサポートしていることなどが挙げられていました。ONNXは、ツール間で学習内容の交換ができる形式のようでした。
現在、mxnet.rbを開発中で、開発者を募集中とのことでした。
Red Chainer
Red ChainerはPython製のChainerをポーティングしたものだそうです。開発者を募集していて、gitterで意見交換をしたり、speeeさんのところで毎月イベントをされてるそうです。
Rubyらしく書けるのが特徴ということでしたので、自分がもし深層学習やってみる場合はこの辺りから手をつけてみようかなと思いました。
Cumo
Cumoは、深層学習用のミドルウェアのようでした。CumoのCの字は、CUDAからきています。Ruby/Numoとの互換性を高く置いていて、NumoをCumoと1文字変えるだけで動くことを目指しているとか。
Cumoが必要になった背景は、GPUで演算するRubyのやつがなかったので、作り始めたとか。なぜGPUが使いたいかというところの話で、やはり圧倒的にパフォーマンスが違うようでした。CPUで30日かかる処理が、GPUだと4日程度。その理由はGPUの圧倒的なコア数。
Red ChainerはまだGPUが使えないのですが、Cumoを使うようにすると、パフォーマンスが75倍速くなったとか…。圧倒的すぎる…。
まだまだ課題はあるとのことでしたが、Rubyで機械学習・深層学習が身近になりそうな話題でした。
メモリ・GC
Rubyはメモリ消費が多いので、省メモリの話とかも多かったです。アーロンの話では、Ruby2.5から2.6に変えると、Railsの起動時のメモリ消費は4%改善するとか。Rubyをバージョンアップするだけでいいので、これは期待大です。
先に、話に出ていたgemとかを並べときます。
- allocation_tracer
- env_mem
あと、Linux環境においてですが、jemallocを使うようにRubyをコンパイルするときのconfigureオプションで設定すると、10〜12%くらい速くなったとか。
スピードアップまとめ
- フラグメンテーションがおきないようにする
- malloc bytesやSlotサイズを設定できる環境変数を適切に設定する
- jemallocを使おう
- 最新のRubyを使おう
その他
あとはDDD用のWebフレームワークのhanamiの話を聞きに行ったりもしたのですが、正直あんまりよくはわかりませんでした…。英語力のなさと、hanamiの事前情報のインプットくらいはしておけばよかったなと思いました。
AnyCableというActionCableの代替の話も、パフォーマンスの違いとか聞けて興味深かったです。自分はまだActionCableを使ったことがないので、サンプル程度でも作ってみようという気になりました。
あとはJRubyの話とか。GraalVMが出てきたので、JRubyどうなってしまうんやろ?という感じはありますが…。
今年はRubocopの話が多めだったなぁという印象でした。弊社でもLint系のものは使っていきたいよねという話は時々しているので、Rubocopの中の話とかが聞けて参考になりました。先人の踏み抜いた知見がフィードバックされて自動コードレビューが行われていくというのは、ありがたいことだと思うので、早めに入れていきたいと思います。
その他、開発したくなる〜!という刺激をたくさん受けるキーノートやセッションが盛りだくさんでした!
会社の報告会では、上記のような話と、Matzのキーノートについてと、ノベルティ配布会を行いました。
来年は福岡で開催なので、弊社からも大勢行けるようにしていこうと思います。
RubyKaigiのスタッフのみなさま、スポンサーのみなさま、ありがとうございました!