とある人工知能の雑記帳

人工知能(主に自然言語処理)とかに関する覚え書き

mac に classias をインストールする際に詰まったところ

ブログ見なおしてみたら実に7ヶ月ぶりの記事になる。サボりすぎた・・・

前回の記事から今までの間、無事大学院に進学できてたり、去年のスカスカなスケジュールとは打って変わって授業にハンパない数の勉強会、TAやアルバイトを白目になりながらこなしたり、やっとのことで夏休みになったかと思いきや2ヶ月近くのインターンシップで気づいたら秋になってたりと、それはそれは色々あった。それを書くのも面白いと思うけどまた別の機会にしようと思う。(書くとは言っていない)

実は9月に、研究室の合宿も兼ねた自然言語処理若手の会(YANS)に参加して来た。そこで人生初のハッカソンも経験できた。ちなみに2位だった。やったぜ。

NLP若手の会(YANS) Web Site - YANSサイトへようこそ

そのハッカソンで、同じチームの @true0024 くんが classias という分類のための機械学習ツールを使って大活躍していたので、こりゃいいと思い合宿から帰って早速自分の mac にインストールすることにした。しかしこれが上手くいかない。

Classias - A collection of machine-learning algorithms for classification

ちなみにこれをインストールするためには libLBFGS というライブラリも必要になる。現時点(2014/10/16)の最新バージョンは 1.10 だけど classias のホームページには 1.8 と書いてある。どちらでもいいとは思うが、一応念のため 1.8 をインストールすることにした。最新版は公式サイトで配布されているが、古い 1.8 はダウンロードできない。が、実は classias の公式サイトで 1.8 のダウンロードリンクが残っている。まだ生きてたらこれをダウンロードしよう。

$ wget http://www.chokkan.org/software/dist/liblbfgs-1.8.tar.gz

もしダメだったらどんまい。多分あまり関係ないからなんとかなる。

とまぁ、ここ(ダウンロード)までは良かった。ここから先、make しようとするとエラーの嵐。 libLBFGS もまともに入れられない。なんじゃこりゃ。

すると @true0024 くんからこんなツイートが。

リンク先に飛ぶと、こんな内容が。

Apple released Mavericks today, and MacPorts works great on the new OS (assuming you use trunk/base). However, there is one big change that I want to point out to other MacPorts developers: the C++ runtime. The default C++ runtime is now libc++. libstdc++ is still available for binary compatibility, but newly built applications and frameworks should use libc++. This means that clang++ should be used for all C++ code since g++ does not support libc++.

どうやら Mavericks にアップデートされたことで、デフォルトの C/C++コンパイラが従来の gcc から LLVM のものに変わったようだ。でもここで紛らわしいのは、 LLVM になっていても、名前は gcc のままということ。試しに、

$ which gcc
$ gcc --version

と打ってみればデフォルトでどのコンパイラを使っているかが分かる。自分の環境ではこうだった。

Peinan@Mercury:~
$ which gcc
/usr/bin/gcc
Peinan@Mercury:~
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

お気づきいただけたのだろうか。そこにはハッキリと Apple LLVM と書いてある。そう、デフォルトの gccgcc の皮を被った LLVM だったのだ!

ということで、自分で本物の gcc を入れて、ビルドする際にそれを参照する必要がある。以下その手順。

まず、MacPortsGNU gcc 4.4 を入れます。

$ sudo port install gcc44

何もいじっていなければ /opt/local/bin に実行ファイルがあるはず。

次に libLBFGS のビルド。

$ CC=/opt/local/bin/gcc-mp-4.4 ./configure
$ make
$ sudo make install
$ hash -r

嵐だったエラーが嘘のようにすんなりと行けた。 GNU gcc SUGEEE!

次にいよいよ classias のビルド。

$ CXX=/opt/local/bin/g++-mp-4.4 ./configure --with-liblbfgs=/usr/local/
$ make
$ sudo make install
$ hash -r

エラーが出なかったら、 classias-train -h など試してみて下のようなヘルプ画面が出たらビルド成功!

Classias 1.1 trainer Copyright (c) 2008,2009 Naoaki Okazaki

USAGE: classias-train [OPTIONS] [DATA1] [DATA2] ...
This utility trains a model from training data set(s).

  DATA    file(s) corresponding to data set(s) for training; if multiple N files
          are specified, this utility assigns a group number (1...N) to the
          instances in each file if no file is specified, the utility reads a
          data set from STDIN; if a file name has an extension '.gz', '.bz2',
          and '.xz', the utility uses 'gzip', 'bzip2', and 'xv' to decompress
          the input file
(略)

ちなみに自分がここで犯した間違いがいくつか。

  • CXX ではなく CC を使ってた:libLBFGS は C コンパイラで実行できたが、classias は C++ コンパイラを必要としていたため、CXX で指定する必要があった。念のため両方指定しておいた方がいいかも?
  • --with-liblbfgs=[DIR] オプションを入れていなかった。正直これがどれくらい効いているかは未知数だったけどとりあえずあった方が安心できる。
  • CCCXX./configure のあとに書いていた。まあ普通に考えて先にパスを通しておくべきだから前に書くべきだよね。./configure したあとにパスを通すのって意味ないよね。

知ってて当たり前な知識かもしれないけど、自分であれこれ調べるのは(多少は勉強になるけど)限界がある。けど知ってる人に聞くと一瞬だったりする。その大切さを実感した。あと自分の知識の無さも痛感した。実は gccLLVM などのコンパイラの仕組みやどういう位置づけなんかなど、まだ良く分かっていない部分が多いので誰か詳しい人がいたら教えて下さい!

ブログを書くまでがYANSとのことなので、これでようやく自分のYANSも終わった、はず・・・長い夏だった。