【Ruby Kaigi 2017レポート】Rubyでデータサイエンスは出来るのか?

Housmart高松です。

2017年9月18-20日の3日間、広島で開催されたRuby Kaigi 2017に参加してきました。Ruby Kaigi自体は去年に引き続き2回目の参加となります。
今年も様々なトピックがありましたが、今回は私が注目しているテーマの1つである “Ruby x データサイエンス” の観点からRuby Kaigiの参加レポートをします。

Rubyコミュニティのデータサイエンスへの取り組み

ここ2-3年で機械学習・ディープラーニングやデータサイエンスを業務で使うことはどんどん普通のことになってきています。
この領域はほとんどがPython/R/Scalaなどで行われており、最近までRubyでデータサイエンスをやるのは実質不可能な状態でした。
ですが、Rubyが言語としてこれらの領域をサポートするかは、Rubyのこれからを考える意味でもとても重要になります。
これらの現状を踏まえた上で、Rubyをデータサイエンスに活用できるようにしようという活動がここ最近Rubyコミュニティ内でも行われてきています。

弊社が提供しているマンション売買サービスのカウルもWebサーバやAPIなど、基本的なコンポーネントはRuby on Railsで作られているのですが、マンションの価格推定機能や画像処理・データ処理の部分に機械学習を導入しており、その部分はPythonでの実装になっています。

Rubyで動いているサービスから機械学習を利用する場合、以前は2つの選択肢がありました。

  1. Rubyで頑張って実装する
  2. 他言語(Pythonなど)でAPIを実装してRubyから呼び出す

Rubyで機械学習のアルゴリズムを実装しようとする場合、現状ではPythonに匹敵する機械学習ライブラリは存在せず、全てを自前で実装していくのは現実的ではありません。

なので、カウルでは2. のパターンでPythonを用いて実装しています。
しかし、同一のDBを複数言語から参照すると双方でスキーマ変更などに追従する必要があったり、別でAPI用のサーバを管理コストが生じるなどの課題を感じています。

PyCallという選択肢

そこで、Rubyコミッターであるむらけんさん@mrknが2016年のRuby Kaigiで、 Pythonの資産(scikit-learn,pandas,numpyなどのライブラリ)をRubyから利用できるようにするプロジェクト”PyCall” の開発を打ち出しました。
PyCallはRubyからPythonのライブラリを直接呼び出せるようにするためのgemとして開発されています。

機械学習やディープラーニングの領域では日々新しいアルゴリズムが論文として発表され、すぐに実装がオープンソースとして公開されるようなスピード感での開発が常識になっています。
この事情を考えると、これらの研究開発に近い分野のエンジニアが突然Rubyで新規のアルゴリズムを実装しだすことは考えにくいため、既存のPythonの資産をRubyから利用するアプローチには納得感が高く、期待を持って見ていました。

そして、1年後である今回のRuby KaigiでPyCallの安定版である1.0のリリースがむらけんさんのトークの中で発表されました。

デモではpandasでのデータ処理やmatplotlibでのグラフ描画、ディープラーニング用ライブラリであるKerasを使った画像検出などを実際に見せてくれました。
pandasやmatplotlib、numpyなどの使用頻度の高いライブラリはPyCallをさらにwrapしてインターフェースが整えられたgemとして提供されており、KerasはPyCallを直接使ってライブラリを呼び出すような実装になっていました。

セッション後実際に触ってみた感じでは、Pythonのライブラリを直接呼び出せることもあり本当にRubyでデータサイエンスができるようになった、と言うのに十分な完成度だと感じました。
以下のリンクを参考にDockerイメージを利用して簡単に試すことができるので、興味があれば触ってみてください。

Ruby x データサイエンスのこれから

ですが、セッションの中でむらけんさんがPycallは一時的なソリューションだとも語っていました。
実際にPyCall以外に、Rubyで頑張って実装すると言うアプローチでも色々なプロジェクトが進行しています。

Numoプロジェクト

そのうちの一つが、Rubyで科学計算を実現しようと言うNumoプロジェクトです。
こちらは筑波大学の田中昌宏@masa16tanakaさんがプライベートでやっているプロジェクトで、Numpyと同等の機能を志向する行列計算ライブラリのNumo::NArrayや、データビジュアライズのためのgnuplot、GNU scientific library、フーリエ変換のwrapperライブラリなどが存在します。
完全にプライベートプロジェクトであり、一人で開発しているため急速に実装が進んでいくことはなさそうですが、行列計算のための良いライブラリ(Numo::NArray)が提供されていることはデータサイエンスをRubyでやる、と言う観点からも非常に大きい貢献だと思います。

red-data-toolsプロジェクト

また、PyCallの作者でもあるむらけんさんも参加する、red-data-toolsと言うプロジェクトもあります。
red-data-toolsはRuby用のデータ処理ツールを提供するプロジェクトです。中でも、複数の言語のデータ処理のために共通で開発されているApache Arrowのフォーマットをサポートするためのライブラリが充実している点が特徴だと言えます。

Apache Arrowは大規模なデータ処理のために作られた仕様で、異なる言語からなるプラットフォーム間のデータ交換コストを下げることが目的で開発が進んでいます。PythonのpandasやScalaで書かれているSparkなどのメジャーどころも採用しているものになります。

業界標準となりつつあるApache Arrowに対応していくことで、今後Rubyがよりデータサイエンスの分野で使われるようになる可能性を模索していくようです。

これ以外にも今回のRuby Kaigiでは発表がなかった科学技術計算のSciRubyプロジェクトや、機械学習・ディープラーニングに関連する取り組みも存在します。
参考) SciRuby Awesome Machine Learning with Ruby

まとめ

今回のPyCallの安定版の発表により、Rubyでのデータサイエンスが可能な環境になったと私は感じています。
また、今後の展望も打ち出されており、今後ますますRubyでデータサイエンスをやる環境は整っていくと思います。

一方で、(周りを見ている限り)データサイエンスを得意とするエンジニアで、かつRubyを使う人はあまり多くはないと感じています。
今後、データサイエンスや機械学習・ディープラーニングのコモディティ化が進んでいき、Rubyエンジニアが通常の業務の延長でそれらを使うようになると、これらの取り組みはもっともっと盛り上がっていくのではないかと思いました。