はじめに
こんにちは、Preferred Infrastructureの柏原です。私も開発に参加しているOSSの機械学習フレームワークである
JubatusをOpenBlocks AX3へインストールする方法を紹介します。
Jubatusは機械学習のフレームワークです。機能としては分類、レコメンド、回帰、グラフ分析などがあり、それらの機能に対して複数のアルゴリ
ズムを実装しているものもあります。特徵としては、オンライン学習に特化しており、さらに分散実行によってスケールアウトするため、機械学習の訓練と予測
を短時間に繰り返し的に(イテレーティブに、そしてバッチではなく)実行可能となっています。ただし、実行時間は入力データの種類、長さにも依存してしま
うため、一定時間内に処理が完了することを保証しているわけではありません。
Jubatusはサーバとして動作させ、クライアントプログラムからサーバへ問い合わせる形で利用します。また、サーバを分散環境で動作させることができ、学習結果のモデルをMIXという処理で共有できることを大きな特徴としています。
Jubatusはこれまで通常のデータセンターのようにIAサーバ上でしか稼働させていませんでしたが、地理的に分散した情報源が存在する環境で
や、もしくは通信ボトルネックを考慮してOpenBlocksのような省電力サーバを末端に配置して処理するようなEdge-HeavyData(*1)
というアーキテクチャへの適用も視野に入れています。例えば、OpenBlocksの活用例にもあるような監視カメラや防災センサーの情報を
OpenBlocksで処理し、リアルタイム(バッチと比較して、より短い時間という意味です)に異常検知やシステム監視などを実現できるのではないかと
思っています。
OpenBlocks
AX3はARMプロセッサを搭載していますが、JubatusのインストールにおいてJubatus本体に特別な修正は必要ありません。依存ライブラリの
インストール時には、修正が必要なものもあります。インストール先はPREFIX=/usr/localと仮定して解説します。基本的にはx86系の
Linuxへインストールする手順と大きな差はありません。
(*1)
インストールに必要なライブラリ
Jubatusインストール前に、まず以下4つのライブラリをインストールします。
- msgpack
- シリアライズフォーマットMessagePackのC/C++ライブラリです。Jubatusの提供するRPCで利用しています。また、pficommon経由で依存しています
- libevent
- glog 0.3.2
- pficommon
- C++用の拡張ライブラリです。Jubatusで利用しています
上2つのmsgpackとlibeventは以下のコマンドでパッケージからインストールできます。
$ sudo aptitude install -y libmsgpack-dev libevent-dev
glog、pficommonとJubatus本体はソースコードを取得してからのインストールになります。あらかじめgitをパッケージからインストールしておいてください。
オプショナルなライブラリ
必須ではありませんが、Jubatusから利用できるライブラリに以下のものがあります。例えば自然言語処理といった実行目的に応じて活用することになると思います。今回はこれらのインストール方法の解説はありません。
- re2
- mecab
- ux-trie
- zookeeper c client-library
- Jubatusを分散構成で実行するためには、ZooKeeperのCクライアントライブラリを含めてビルドする必要があります。
ZooKeeper
3.4.4(stable)では、インラインアセンブラを使用していた箇所をARM向けにコードを修正すればJubatusのビルドができることを確認し
ています。動作確認は今後実施していく予定です
- http://zookeeper.apache.org
インストール
glog 0.3.2
glog 0.3.2のソースコードをダウンロードし、ビルドしてインストールするだけとなります。
http://code.google.com/p/google-glog/
$ wget http://google-glog.googlecode.com/files/glog-0.3.2.tar.gz
$ tar -xvf glog-0.3.2.tar.gz
$ cd glog-0.3.2
$ ./configure
$ make
$ sudo make install
pficommon
gitからソースコードを取得します。ビルドが確認できている 10b1ba95628b0078984d12300f9a9deb94470952 を利用しましょう。
$ git clone https://github.com/pfi/pficommon.git
$ cd pficommon
$ git checkout 10b1ba95628b0078984d12300f9a9deb94470952
pficommonでは一部、ARM非対応のコードがあるため以下の箇所をコメントアウトします。
diff --git a/src/system/barrier.h b/src/system/barrier.h
index 8d5a783..51fe561 100644
--- a/src/system/barrier.h
+++ b/src/system/barrier.h
@@ -58,7 +58,7 @@
#else
-#error "your cpu architecture is not support memory barrier"
+//#error "your cpu architecture is not support memory barrier"
#endif
修正後に、configureをしてビルド・インストールという手順になります。
$ ./waf configure
Setting top to : /home/kashihara/repos/pficommon
Setting out to : /home/kashihara/repos/pficommon/build
Checking for 'g++' (c++ compiler) : /usr/bin/g++
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library pthread : yes
Checking for header msgpack.hpp : yes
Checking for header fcgiapp.h : not found
Checking for header stdint.h : yes
Checking for header unordered_map : not found
Checking for header tr1/unordered_map : yes
Checking for header ext/hash_map : yes
Checking for header unordered_set : not found
Checking for header tr1/unordered_set : yes
Checking for header ext/hash_set : yes
Checking for 'mysql_config' : not found
Checking for 'Magick++-config' : not found
pficommon has been configured as follows:
[Modules]
FCGI module: no
Database module: yes
have MySQL lib: no
have PostgreSQL lib: no
MessagePack RPC module: yes
[Visualization]
Magick++ impl: no
[Build information]
Package: pficommon-1.3.1
build (compile on): arm-linux
host endian: little
Compiler: g++
Compiler version: 4.4.5
CXXFLAGS: -O2 -Wall -g -pipe -D_REENTRANT -fno-omit-frame-pointer D_FORTIFY_SOURCE=1
$ ./waf
$ sudo ./waf install
>wafの使い方
/usr/local以外に、例えば自分のホームディレクトリをprefixに指定してインストールしたい場合もあると思います。そのような場合は、以下のように環境変数を加えて./waf configureを実行します。
$ export DEV_HOME=$HOME/usr
$ PKG_CONFIG_PAHT="$DEV_HOME/lib/pkgconfig" \
CXXFLAGS="-I$DEV_HOME/include" \
LINKFLAGS="-L$DEV_HOME/lib" \
./waf configure --prefix=$DEV_HOME
Jubatusのインストール
Jubatus 0.3.3 (2012年10月29日リリース)もpficommonと同様にgitからソースコードを取得します。以下のコマンドで、ソースの取得から最低限の構成でインストールが可能です。
$ git clone https://github.com/jubatus/jubatus.git
$ cd jubatus
$ git checkout jubatus-0.3.3 -b jubatus-0.3.3
$ ./waf configure --disable-re2
Setting top to : /home/kashihara/repos/jubatus
Setting out to : /home/kashihara/repos/jubatus/build
Checking for 'g++' (c++ compiler) : ok
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library msgpack : yes
Checking for library dl : yes
Checking for program pkg-config : /usr/bin/pkg-config
Checking for 'libglog' : yes
Checking for 'libevent' : not found
Checking for library event : yes
Checking for 'pficommon' : yes
Checking for header pficommon/network/mprpc.h : yes
Checking for header unistd.h : yes
Checking for header sys/types.h : yes
Checking for header sys/wait.h : yes
Checking for header sys/stat.h : yes
Checking for header cxxabi.h : yes
Checking for header sys/socket.h net/if.h : yes
Checking for header sys/ioctl.h : yes
Checking for header fcntl.h : yes
Checking for header netinet/in.h : yes
Checking for header arpa/inet.h : yes
Checking for header dlfcn.h : yes
Checking for header sys/socket.h net/if.h sys/ioctl.h : yes
Checking for header netinet/in.h arpa/inet.h : yes
Checking for compiler atomic builtins : no
'configure' finished successfully (11.186s)
$ ./waf
$ sudo ./waf install
まとめ
これでOpenBlocksでJubatusを利用する準備は整いました。実際にJubatusを利用して機械学習をするには、Jubatusのクライアントを作ることになります。クライアントは、必ずしもJubatusサーバを動作させるホストで実行する必要はありません。この場合は
OpenBlocksでサーバを動かすことを想定していますが、クライアントをx86_64のLinuxやMacBook
Air(2011)から実行してOpenBlocks上でJubatusが動作することを確認しています。
クライアントの開発・実行にはC++, Ruby, Python,
Javaといったプログラミング言語が利用可能です。現在はgithubのjubatus-exampleリポジトリにサンプルプログラムを準備していま
す。詳しくはJubatusオフィシャルサイトやJubatus Blogなどをご覧ください。
ちなみに、Jubatusの各サーバは、eth0もしくは、最初に取得できたネットワークインタフェースのIPv4アドレスにリッスンす
るソケットを割り当てます。クライアントからアドレスを指定する際には、IPv6のアドレスではなくIPv4アドレスを指定するよう気をつけてください
(ホスト名の解決で、IPv4アドレスより先にIPv6アドレスが返ることがあります)。
今後はZooKeeperや各種ライブラリを利用した実験、評価を考えています。分散環境をOpenBlocks(ARM)とx86系サーバといったヘテロジニアスな環境で構築して動作させたいですね。
Jubatus解説記事 実験/評価編はこちら:
JubatusをOpenBlocksで動作させてみる