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 もまともに入れられない。なんじゃこりゃ。
話題のClassiasをインストールしようとしたけどlibLBFGS1.8のmakeでエラーが出る…すでに1.10をインストールしたせいなのか、CCのバージョンのせいなのか… pic.twitter.com/uQmx0OJjs0
— ダークアンドダーク (@so1owingpixy) 2014, 10月 2
すると @true0024 くんからこんなツイートが。
classiasはclangのコンパイラだと入らないのでMavelicksではコンパイラを変えてインストールする必要がある。理由は下記URLに書いてあるので、該当箇所を書き直せば、clangでもいけないことも無いかも
https://t.co/Xo67LLpqCC
— TRUE (@true0024) 2014, 10月 2
リンク先に飛ぶと、こんな内容が。
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
と書いてある。そう、デフォルトの gcc は gcc の皮を被った LLVM だったのだ!
ということで、自分で本物の gcc を入れて、ビルドする際にそれを参照する必要がある。以下その手順。
まず、MacPorts で GNU 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]
オプションを入れていなかった。正直これがどれくらい効いているかは未知数だったけどとりあえずあった方が安心できる。CC
やCXX
を./configure
のあとに書いていた。まあ普通に考えて先にパスを通しておくべきだから前に書くべきだよね。./configure
したあとにパスを通すのって意味ないよね。
知ってて当たり前な知識かもしれないけど、自分であれこれ調べるのは(多少は勉強になるけど)限界がある。けど知ってる人に聞くと一瞬だったりする。その大切さを実感した。あと自分の知識の無さも痛感した。実は gcc や LLVM などのコンパイラの仕組みやどういう位置づけなんかなど、まだ良く分かっていない部分が多いので誰か詳しい人がいたら教えて下さい!
ブログを書くまでがYANSとのことなので、これでようやく自分のYANSも終わった、はず・・・長い夏だった。