2012-11-21

JubatusをOpenBlocks AX3へインストールしてみる

はじめに

こんにちは、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
    • 正規表現ライブラリです。文字列入力に対して、正規表現でマッチした文字列の置換ができるようになります。Jubatusを初めて試す場合にはインストールの必要はないでしょう
    • https://code.google.com/p/re2/
  • mecab
    • 形態素解析エンジンです。日本語の自然言語処理を実行したいときにインストールすると良いでしょう。Jubatusではmecab 0.99以降を利用するため、現時点ではパッケージからではなくソースコードからインストールする必要があります
    • https://code.google.com/p/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で動作させてみる

0 件のコメント:

コメントを投稿