Intel Edisonにオンライン機械学習を行うJubatusを導入する

1. 概要

オンライン機械学習のための分散処理フレームワークJubatusをEdison上で動作させる方法について説明します.
以前のエントリで説明した, Intelの提供するIoT Analyticsでは現在,データ集計が主な機能なので,Jubatusを利用することで,Edisonが担える機能,Edisonを含めたアーキテクチャでできることが広がると思います.

対象OSは,デフォルトのYocto Linux,およびubilinuxです.このエントリではそれぞれについてのインストール方法と動作確認までを行います.ちなみにubilinuxのほうが簡単です.

Jubatusについての説明は行いませんが,公式ページにまとめてくださっているので,そちらを参照してください.以下に概要のみ引用します.

Jubatusは「分散したデータ」を「常に素早く」「深く分析」することを狙った分散基盤技術です。

Jubatusの名前の由来は、俊敏な動物であるチータの学術名からの命名で、「ユバタス」と読みます。 株式会社Preferred InfrastructureとNTTソフトウェアイノベーションセンタが共同開発した、 日本発のオープンソースプロダクトです。

最終的に全ての人にスケーラブルなオンライン機械学習フレームワークを提供することがJubatusの目標です。

Jubatus は以下の特徴を持ったオンライン機械学習向け分散処理フレームワークです。

1-1. 利用するスクリプト

どちらのOSを利用する場合も,公式で用意してくださっているインストールスクリプトを利用します.
後述しますが,デフォルトのYocotoを利用する場合,利用できるコマンドやリポジトリの問題から,別PCでの作業が必要になります.

1-2. 共通する準備

1-2-1. インストール用スクリプトの導入

Edisonの/usr以下は容量が少ないので,/home/root以下で作業をします. また,導入先は/home/root/local以下とします.このディレクトリをインストールスクリプト実行時に指定します.ディレクトリの切り方はお好きなように決めてください.

$ cd /home/root
$ mkdir local
$ git clone https://github.com/jubatus/jubatus-installer

1-2-2. インストールスクリプトへの修正点

どちらのOSを利用する場合でも共通して,最後のRPCのテストでこけます.
Jubatus開発者の1人である@kumagiさんによると,遅いCPUでビルドする場合に,タイムアウトの時間設定が短くてこけるとのことでした.
ですので,install.sh中,最後のJubatusをビルドする部分(275行目)を以下のように修正します.

# install.sh中275行目が以下のようになっている
 ./waf build --checkall && ./waf install

 # これを以下のように修正
 ./waf install

2. ubilinuxへの導入

コマンドやリポジトリDebianベースなのであまり問題ありません.
前述したインストールスクリプトへの修正と,bzip2を事前に導入しておくことが必要です.

2-1. 準備

2-1-1. 必要なパッケージの導入

bzip2を導入しておきます.

$ sudo apt-get install bzip2

2-1-2. スクリプトへの修正点

前述したwaf --checkへの修正点のみで良いです.

2-2. install

インストールスクリプト実行時にインストール先をpオプションで指定します.

$ cd jubatus-installer
$ sudo ./install.sh -p /home/root/local

ubilinuxでは以上でインストール完了です.

3. デフォルトのyocto Linux

yocto linuxはコマンドやリポジトリが残念なので,あんまりセルフビルドする環境ではなくてめんどくさいです.
以下,順番に説明していきます.

3-1. 準備(別PCでの作業)

めんどくさい原因は,shasumとtarまわりです.jubatus-installerに手を入れたり,いろいろ整備するのもめんどくさいので,wgetと解凍は別PCでやって,SFTPとか使ってEdisonへファイルを転送しましょう.

3-1-1. ファイルのダウンロード

別PCでinstallスクリプトを使ってファイルをダウンロードします.
スクリプト実行時にdオプションを使ってダウンロードだけまず行いましょう.

$ git clone https://github.com/jubatus/jubatus-installer
$ cd jubatus-installer
# dオプションをつけることでダウンロードのみを実行.
$ sudo ./install.sh -d

3-1-2. ファイルの解凍

ここまでで,jubatus-installer/download 以下に各ファイルがダウンロードされました. 次にこれらのファイルを解凍します.
install.shの中の該当箇所のみが動作するようにスクリプトを修正しても良いですし,該当箇所だけ別のスクリプトに書き出して実行しても良いです.もちろん手打ちでもいいけどちょっとだるいですね.
インストールスクリプトの中で解凍の際に必要な箇所は以下のとおりです.

#!/bin/bash
JUBATUS_VER="0.6.4"
JUBATUS_CORE_VER="0.0.5"
MSG_VER="0.5.7"
LOG4CXX_VER="0.10.0"
APR_VER="1.5.1"
APR_UTIL_VER="1.5.4"
UX_VER="0.1.9"
MECAB_VER="0.996"
IPADIC_VER="2.7.0-20070801"
ZK_VER="3.4.6"
PKG_VER="0.25"
RE2_VER="20130115"
ONIG_VER="5.9.5"
JUBATUS_MPIO_VER="0.4.5"
JUBATUS_MSGPACK_RPC_VER="0.4.4"

cd download

tar zxf msgpack-${MSG_VER}.tar.gz
tar zxf apache-log4cxx-${LOG4CXX_VER}.tar.gz
tar zxf apr-${APR_VER}.tar.gz
tar zxf apr-util-${APR_UTIL_VER}.tar.gz
tar jxf ux-${UX_VER}.tar.bz2
tar zxf mecab-${MECAB_VER}.tar.gz
tar zxf mecab-ipadic-${IPADIC_VER}.tar.gz
tar zxf zookeeper-${ZK_VER}.tar.gz
tar zxf pkg-config-${PKG_VER}.tar.gz
tar zxf onig-${ONIG_VER}.tar.gz

tar zxf jubatus_mpio-${JUBATUS_MPIO_VER}.tar.gz
tar zxf jubatus_msgpack-rpc-${JUBATUS_MSGPACK_RPC_VER}.tar.gz
tar zxf jubatus_core-${JUBATUS_CORE_VER}.tar.gz
tar zxf jubatus-${JUBATUS_VER}.tar.gz

3-1-3. ファイルの転送

scpコマンドやFTPソフトなどを使ってEdisonへファイルを転送しておきます.
jubatus-installerディレクトリごと移動させておけばよいでしょう.
なおこの際に,tarファイルやbz2ファイルはもう必要ないので削除しておいてかまいません.

3-2. 準備(Edison上での作業)

Edisonへ各ファイルを転送したら,インストールの準備を行います.

3-2-1. 必要なパッケージの導入

デフォルトのままだとiconvのヘッダが足りないためmecabのテストが正常に終了しません. 以下のパッケージを導入しておきます.
この点についても,jubatus開発者の@kumagiさんに教えて頂きました.ありがとうございます.

$ sudo opkg install eglibc-gconv-euc-jp

3-2-2. スクリプトへの修正点

次の手順3-3インストールの際にiオプションを使って,ファイルのダウンロードを実行しないようにするのですが,デフォルトのままだと解凍は行われてしまいます.
ですので,install.sh中171行目〜189行目のtarコマンドを利用する箇所をコメントアウトしておきます.

3-3. install

インストールスクリプト実行時にインストール先をubilinuxの際と同様にpオプションで指定します.
なお,ダウンロードコマンド実行時にはiオプション をつけてインストール作業のみを行うようにします.

$ cd jubatus-installer
$ sudo ./install.sh -p /home/root/local -i

インストールが完了したら,パスの設定を追加しておきます.
~/.profile などへ以下を記述します.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/root/local/lib
export PATH=$PATH:/home/root/local/bin

以上でyocto Linuxへの導入は完了です.

4. jubatusの動作確認

導入したJubatusが動作するかどうかを,公式のサンプルにそって確かめてみます.公式のチュートリアルが充実していますから,そちらを参照すれば以下は読む必要がありません.
なお,ここではPythonクライアントでの利用について述べますが,Ruby等他のクライアントも用意されています.

4-1. jubatus-client(python)の導入方法

jubatus-installerに導入用スクリプトが存在するのでそちらを用います.なお,事前にpipを導入しておく必要があります.

4-1-1. pipの導入

python用のパッケージマネージャであるpipを導入します.また,のちほどyamlのライブラリも必要になるので導入しておきましょう.

$ wget https://bootstrap.pypa.io/get-pip.py | python
$ pip install PyYAML

4-1-2. python用ライブラリの導入

jubatus-installerのディレクトリに移動してスクリプトを実行します.

$ cd jubatus-installer
$ sudo ./install_python.sh

4-2. 公式チュートリアルにそった動作確認

Edisonへsshしてターミナルを2枚開いておきましょう.一方でサーバ,もう一方でクライアントのプログラムを実行します.
以下,公式にそい,5つの機械学習手法についての動作確認を行います.
その前に公式サンプルをクローンしておきます.

$ git clone https://github.com/jubatus/jubatus-example.git
$ cd jubatus-example

4-2-1. Classifierの動作確認

多値分類を行います.スパム判定のように,入力されたデータを複数のグループに分類します.
shogunという,歴代将軍の苗字と名前を学習して,入力された未知の名前から苗字を当てるプログラムを動かします.

サーバ側

$ cd shogun
$ jubaclassifier --configpath shogun.json

クライアント側

$ cd shogun/python
$ python shogun.py

4-2-2. Recommenderの動作確認

推薦を行います.広告やamazonのおすすめ商品推薦のように,入力データに類似するものを推薦します.
ここでは,npb_similar_playerという,野球選手のプロフィールを学習し,入力された未知の選手に類似する選手を返却するプログラムを動かします.

サーバ側

$ cd npb_similar_player
$ jubarecommender --configpath npb_similar_player.json

クライアント側

$ cd npb_similar_player/python
$ python update.py
$ python analyze.py

4-2-3. Regressionの動作確認

回帰分析を行います.株などの予測に用いられます. ここでは,入力された物件の情報から家賃を返却するプログラムを動かします.

サーバ側

$ cd rent
$ jubaregression --configpath rent.json

クライアント側

$ cd rent/python
$ python jubahomes.py -t ../dat/rent-data.csv -a ../dat/myhome.yml

4-2-4. Graphの動作確認

ネットワーク構造分析に用いられる,グラフマイニングを行います.
ここでは,電車の駅の間の最短経路を探索するプログラムを動かします.

サーバ側

$ cd train_route
$ jubagraph --configpath train_route.json

クライアント側

$ cd train_route/python
# グラフを作成
$ python create_graph.py
# 2つの駅のIDを与えて最短経路を計算
$ python search_route.py 0 144

4-2-5. Statの動作確認

異常データ検知などに用いられる,統計分析を行います.

サーバ側

$ cd trival_stat
$ jubastat --configpath stat.json

クライアント側

$ cd trival_stat/python
$ python stat.py

もっとくわしいこと

Jubatus公式HPを参照してください.