2017.09.01 金.

基調講演2【Rubyでデータ分析ができる未来】(株式会社Speee 畑中悠作氏)軽量Ruby普及・実用化促進フォーラム2017 Vol.04

まつもとゆきひろmrubyRubyMatzまつもとゆきひろ軽量Ruby普及・実用化促進フォーラム2017
平成29年9月1日(金)に開催された福岡県Ruby・コンテンツビジネス振興会議・福岡県主催の「軽量Ruby普及・実用化促進フォーラム2017」にて行われた、株式会社Speee 畑中悠作氏による基調講演2【Rubyでデータ分析ができる未来】の模様をレポート致します。 Rubyでの機械学習など各種既存のツールを組み合わせたデータ処理の実現に向け活動中の「Red Data Toolsプロジェクト」についてのご紹介でした。

ーー「自動車をmrubyで動かすことができる」
これはRubyistの皆さんにとって、非常に夢があることではないでしょうか。

株式会社Speeeの畑中悠作氏より【Rubyでデータ分析ができる未来】についての基調講演がありました。

株式会社Speee 畑中悠作氏

株式会社Speee

畑中悠作(はたなか ゆうさく)氏

金沢工業大学情報学部情報工学科を卒業、2014年4月株式会社Speee入社。社内システムの作成・保守・運用に携わる。現在は自社で作成しているネイティブアド配信プラットフォーム「UZOU」にてアルゴリズム部分の実装やGoによるバッチ処理の実装を担当している。

ー最近ではビッグデータ、機械学習などという言葉をよく耳にするようになりました。
Rubyでビッグデータ分析ができる?そんなにRubyでなんでもできるのでしょうか?どんなに素晴らしい未来のお話が聞けるのでしょうか?
今回の講演はmrubyを使った何かというわけではないそうですが、mrubyを使って収集したビッグデータを解析し、その先にある問題を解決する方法についてお話をお聞きすることができました。講演の内容は以下の通りです。

自己紹介・会社について


UZOU

広告配信サービス「UZOU」

現在、畑中氏は株式会社Speeeに在籍し、「UZOU」という広告配信サービスを配信を行う事業部に所属されています。
畑中氏はその中で、アルゴリズム部分の実装やGoによるバッチ処理の実装に携わる部分を担当されています。

PHP等からRubyへ移行、エンジニアのほとんどがRubyを使用

株式会社Speeeは、2007年に創業し、当時はPHP等を使用していたそうですが、約2年前に会社の使用言語をPHP等からRubyに徐々に移行して行き、システムやサービスの約8割をRubyに切り替え、今では、社内のエンジニアのほとんどがRubyを使用しているということでした。
ただ、一部では適材適所で他の言語を使用することはあるようです。

ビッグデータについて


ビッグデータの定義

Rubyでデータ分析ができるようになると良いと思いませんか

このイベントに参加されている方は軽量Rubyの活用を検討していたり、実際に活用している方が多いと思いますが、そもそも、軽量Rubyで大量のデータをどう活用・分析されているのでしょうか?

最近ではビックデータという言葉がよく聞かれるようになりましたが、定義が曖昧ではないでしょうか?畑中氏による定義はこちらです。

1. データ量が多い
みなさんが持っているイメージそのもの、大きなデータ。
2. 急速に増える
例えば、広告配信でお客様のサイトに広告を出すと、そのアクセスログはサーバに返ってきて日々急速に増えていっている
3.元となるデータの種類が様々
JSONやエクセルなど様々なデータフォーマットを取り扱う

 


ビッグデータの分析が出来ると

ビックデータの分析が出来るとどんなことができるでしょうか?畑中氏が身近で感じているところから以下のようなことが例として挙げられました。

● オススメ商品をレコメンドすることが出来る
ユーザの閲覧履歴などから商品のデータ分析をすることによって分析することができる。
● 電子機器類の測定されたデータから欠陥品を探すことが出来る
機械にmrubyを組み込むことで、データを収集し分析をすることによって欠陥品を探すことが出来る。
● レントゲンの結果から潜在的な病気を見つけることが出来る
医療現場でレントゲンの結果の過去の大量なデータから解析することによって自動的に判別できるようになるのではないか?

データ分析には、現状ではPythonなど今まで使われてきて、かつ、ライブラリが充実しているもので実現されているケースが多いようです。
おそらく、mrubyを使っていてもデータ分析などはPythonやRを使っているという方もいらっしゃるのではないでしょうか。
それがRubyという、好きな言語で実現できるということになれば素敵な世界になるのではないでしょうか?


データ分析について


スライドより

データ構築
最新となるデータを取り出します
 
データ抽出
その次の工程で必要なデータだけを抽出してきます。
 
データ集計
そこから日付などの様々な切り口で集計をします。
 
可視化
そのままでは、人の目にわかりやすくないので、グラフや図などで見易いものに可視化します。

データ分析には、複数のシステムを併用して使用されるケースが多いようです。

・Pandas:
Python製のデータ分析用ライブラリ
・Cassandra:
分散データベース管理システム
・Spark:
高速でスケーラブルな汎用分散処理エンジン
・HBase:
列指向、分散データベース

ただ、これらは、それぞれの用途ごとにろ過しており、実際にデータ分析を行う際には、それぞれのシステムを併用して使うケースが多い、つまり外のシステムだけを使って終わりではなく、様々なシステムを組み合わせて使うことが多いようです。
そうなってくると、それぞれのシステム間のデータ連携が必要になってきます。

システム間のデータ連携

では、それぞれのシステム間のデータ連携をどう実現するか?

現状では、それぞれのシステムでは独自のメモリ構造をもっているので、実際に連携しようという時には、一度、CSVやJSONのようなファイルに出力し、連携するシステムの方に持って行き、それにアクセスし読み込めるような形にするという方法が一つ目の方法です。

もう一つの方法としては、Parquet(https://parquet.apache.org/)と呼ばれるディスク上で列指向でデータを扱うフォーマットを使うなどしてシステム間の連携行う方法があります。

現状はこういった例がよく見かけられます。
畑中氏のチームでは、TSVで出力したものを、別のシステムに持って行き連携し読み込み直す、というようなアプローチを取られています。
しかし、この場合、数MBくらいのデータであれば問題ないのですが、数TBなどといった大きなデータになってくると、データ交換コストは無視のできないものになってきます。

スライドより


Apache Arrow


Apache Arrow

それを解決するために生まれたのが、「Apache Arrow」というプロジェクトです。
https://arrow.apache.org/

  • 2016年の10月に0.1.0がリリース
  • メモリ上でカラム型データを扱うためのフォーマットとアルゴリズム
  • Apache Software Foundationのトップレベルプロジェクト

ロー型とカラム型

ロー型とカラム型

スライドより

ロー型

カラム型と対になって、行指向やロー型といった、行単位でデータを管理する方法です。

カラム型

列でデータを管理する方法。
縦にデータを格納しているため、格納されたデータは同じ型なので圧縮効率が良くなります。
例えば、価格などを集計する際は、列でデータを扱えるため、ロー型のように他の列を参照しないで、ロー型より早く集計することができます。

Apache Arrowの特徴

Apache Arrowの特徴として以下のようなものがあります。

1. Fast
最新のプロセッサに含まれるSIMD (Single Instruction/Multiple Data)を使用することが出来ます。
カラム型のデータを扱えることでCPUキャッシュを効率よく使用することが出来ます。
コピーなしでデータを読み込むZeroCopyをサポートできます。
2. Flexible
Java, C, C++, Pythonなど各種言語から扱うことが出来るのでArrowに対応したシステムを柔軟に扱うことが出来ます。
他の言語に関しても対応は進められています。
3. Standard
Calcite, Cassandra, Drill, Hadoop, HBase,Ibis, Impala, Kudu, Pandas, Parquet, Phoenix, Spark, Stormの13のビックデータ関連プロジェクトの開発者が参加
Apache Incubator が省略されたApache Software Foundationのトップレベルプロジェクト

Apache Arrowがない場合とある場合の比較

スライドより「ビックデータ関連プロジェクト」

例えば、PandasとCassandraを連携しようとする場合、まずPandasでコピーしてConvertしてCassandraの方で読み込み直す対応を行わなければなりません。 一つならまだいいですが、3つ4つ…と増えていくと複数に関連し合うことになります。 そうなってくるとシステムが複雑になり、CPUが無駄に使われてしまいます。

共通のメモリフォーマットと呼ばれる「Apache Arrow」を使うことで、複雑さが解消され、真ん中の共通のArrow Memoryを介してデータを連携することができるようになるので、CPUも無駄に使われることなく、非常に効率良くデータを連携できるようになります。


Ruby が Apache Arrow に対応すればどうなる?!


Apache Arrowに対応することで 必要な部分からRubyを使ったデータ分析を始めることができる

Rubyで集めたデータをArrowに対応しているPandasやSpark  に連携し分析した結果をRubyで受け取って、Railsを使った  webアプリで可視化、ということができるようになる

PandasやSpark部分を徐々にRubyへ移行することも出来る

これが共通データフォーマットを使用する強みと言えます。

例えば、図のようにmruby、Rubyで出たデータをApache Arrowを介して、Pandasなどと連携していって解析を行います。その結果を受け取って、Railsのアプリ上でグラフや図などのわかりやすい形で表示することができます。

スライドより

RubyからApache Arrowを使うことができるのか

スライドより

Apache Arrowって、よさそうなプロジェクトだけど、そもそもRubyからApache Arrowを使うことができるのでしょうか?

もちろん、RubyからApache Arrowを使うことは可能です。

Red Arrowというgemによって、RubyはApache Arrowに対応できるようになったということです。

 

red-data-tools/red-arrow

Apache Arrowを体験


次に、目で見てわかっていただけるようにと実際にApache Arrowを使っての説明をしていただきました。

検証内容

Pythonで約2GのデータをCSV, Apache Arrowで書き込みRubyでそれぞれを読み込む

各フォーマットにおける書き込みと読み込みの時間を計測して比較を行う

検証環境

AWSのEC2インスタンスのt2.large

  • vCPU: 2, メモリ: 8G
  • Ubuntu: 16.04.2 LTS

Python: 3.6.2

Ruby: 2.4.1

Apache Arrow: 0.6.0

CSV(書き込み)

スライドより

Python側のCSVの書き込みです。

CSV(読み込み)

スライドより

Ruby側のCSVの読み込みです。

Apache Arrow(書き込み)

スライドより

Python側のApache Arrow形式の書き込みです。

Apache Arrow(読み込み)

スライドより

Ruby側でRed Arrowというgemを使ってのApache Arrow形式の読み込みです。


DEMO

実際にターミナルで、速さの比較のDEMOが行われました。

CSV

CSV

まずはCSVの方から。
トータルで51秒の時間がかかっています。
Rubyで5秒くらいの読み込み時間でした。
4万行くらいのデータです。

Apache Arrow

Apache Arrow

Apache Arrow形式では、
書き込みに3.4秒くらい
Rubyでの読み込み時間は約2秒くらいで終わりました。

結果

Red Data Toolsについて


Apache Arrowを使って、Rubyでもデータ分析をしようというプロジェクトがあります。
それが、「Red Data Tools」(https://red-data-tools.github.io/ja/)です。畑中氏も参加されています。

特徴

  • 株式会社クリアコードの須藤さんが2017年2月にプロジェクトを設立
  • Ruby用のデータ処理ツールを提供することを目的としたプロジェクト
  • 多くの言語が共通して使用できるApache Arrowを使用することで Rubyコミュニティーを超えて協力する

活動内容

1. Red Arrow
Apache ArrowのRubyバインディング
Rubyバインディングの開発だけでなくApache Arrow本体の開発も行っている
2. 既存のgemのArrow化
SciRuby
  • 科学技術計算、データ可視化用途のGem群の総称
  • Pythonでいうpandasにあたるdaruやnumpyにあたるnmatrixなどがある
  • Gem間が独立していて連携が難しい
PyCall
  • @mrknさんが作成されているRubyとPythonのブリッジライブラリ
  • Pythonで作成された既存の資産を使うことが出来るのでRubyでPythonのオブジェクトを使用することが出来る
3. 新しいツールを提供
red-data-tools/xtensor-arrow-glib
  • xtensorと呼ばれるC++で実装された多次元配列を扱うライブラリのApace Arrow対応
  • Pythonでいうpandasにあたるdaruやnumpyにあたるnumo-narryなどがある
red-data-tools/red-chainer
  • • Python製の深層学習フレームワークのChainerをRubyへポーティングしたもの

Red Data Toosの今後

  • 引き続き既存のgemのApache Arrowへの対応は行う
  • red-chainerのような新しいツールの作成
    Ruby間でデータ分析ができるようにしたい
  • Apache Arrow本体の開発の追従
  • Rubyバインディングの作成
    Ruby間だけでなく言語も超えて協力してデータ分析ができるようにしたい

RubyがApache Arrowに対応すれば?

Apache Arrowに対応することで必要な部分からRubyを使ったデータ分析をはじめることが出来る

例)

Rubyで集めたデータをArrowに対応しているPandasやSparkに連携し分析した結果をRubyで受け取ってRailsを使ったwebアプリで可視化

PandasやSpark部分を徐々にRubyへ移行することも出来る


まとめ

軽量Rubyで集めたデータをRubyで分析が出来るようになればRubyだけで完結することが出来る

Apache Arrowに対応することで必要な部分からRubyでデータ分析をはじめることが出来る

Rubyでもデータ分析が出来る未来へ!

最近よく聞くようになったビックデータのデータ分析。
Rubyエンジニアにとって、慣れ親しんだRubyを使用してデータ分析が可能になると、様々な分野への進出が可能になり、Rubyの可能性もますます広がる気がしてまいりました!
RubyistBizでは、今後も、株式会社Speeeの皆様、畑中さん、そして、Red Data Toolsのプロジェクトの皆さんの活動に注目し、お伝えしてまいりたいと思います!


【Vol.04】はここまで。
こちらもご覧ください。

軽量Ruby普及・実用化促進フォーラム2017 レポートVol.01
1. 開会挨拶
福岡県商工部 新産業振興課 企画監 見雪和之氏
2. 来賓挨拶
経済産業省 商務情報政策局 情報処理振興課 企画官 和泉 憲明 氏
軽量Ruby普及・実用化促進フォーラム2017 レポートVol.02
軽量Ruby普及・実用化促進ネットワーク活動報告
福岡県商工部 新産業振興課 企画監 見雪和之氏
軽量Ruby普及・実用化促進フォーラム2017 レポートVol.03
基調講演1【⾞載組込みシステム開発の現状・動向とmrubyへの取り組み】
名古屋大学未来社会想像機構 教授 高田 広章氏