Mac (El Capitan) に Chainer, TensorFlow, DMTK をインストールする

# はじめに

※この記事は [word2vec の各種実装の速度比較](http://aial.shiroyagi.co.jp/2015/12/word2vec/) の環境構築部分を抜き出したものですが、単体でも読める内容となっています。

機械学習のフレームワークである Chainer, TensorFlow, DMTK (Microsoft Distributed Machine Learning Toolkit) を Mac にインストールします ([Ubuntu にインストールする手順](http://qiita.com/knzm/items/971e046bb80456ad824e) はこちら)。 Mac の場合は、最近の機種では NVIDIA の GPU が載っていないので、必然的に CPU モードでインストールすることになります。

なお、記事中で説明した手順を実行するスクリプトを含むリポジトリはここにあります: https://bitbucket.org/knzm/wordembedding-experiments

# Chainer をインストールする

依存ライブラリを Homebrew で先にインストールしておきます。

```
$ brew tap homebrew/science
$ brew install openblas
$ brew install hdf5
```

virtualenv を作成して、

```
$ virtualenv ~/virtualenvs/chainer
$ source ~/virtualenvs/chainer/bin/activate
```

pip でインストール

```
$ pip install chainer
```

または開発版をインストールします。

```
$ git clone https://github.com/pfnet/chainer.git
$ cd chainer
$ pip install h5py
$ python setup.py develop --cupy-no-cuda
```

# TensorFlow をインストールする

公式ドキュメント: https://www.tensorflow.org/versions/master/get_started/os_setup.html

virtualenv を作成して、

```
$ virtualenv ~/virtualenvs/tetnsorflow-cpu --system-site-packages
$ source ~/virtualenvs/tensorflow-cpu/bin/activate
```

公式に提供されている wheel ファイルをインストールします。

```
$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl
```

# DMTK をインストールする

DMTK をビルドするには GCC 4.8 が必要なので、 Homebrew でインストールします。

```
$ brew install homebrew/versions/gcc48
```

wget コマンドがインストールされていなければインストールします。

```
$ brew install wget
```

途中 Makefile の中で GNU readlink を使っているので coreutils をインストールして有効化しておきます。

```
$ brew install coreutils
$ PATH=$(brew --prefix coreutils)/libexec/gnubin:$PATH
```

フレームワーク (multiverso) のビルド:

```
$ git clone https://github.com/Microsoft/multiverso.git
$ cd multiverso/third_party
$ CXX=g++-4.8 ./install.sh
$ rm lib/*.dylib
$ cd ..
$ make CXX=g++-4.8
```

ここで dylib を削除しているのは強制的にスタティックリンクさせるためです。 (参考: [Forcing the Mac OS X linker to choose a static library](https://wincent.com/wiki/Forcing_the_Mac_OS_X_linker_to_choose_a_static_library) )

次に個別のプロジェクトをビルドします。ここでは distributed_word_embedding を対象としますが、 lightlda, distributed_skipgram_mixture もほぼ同様の手順でビルドできます。

```
$ git clone https://github.com/Microsoft/distributed_word_embedding.git
$ cd distributed_word_embedding
$ ln -s ../multiverso
```

以下のようにソースコードを修正します。

```diff
--- src/memory_manager.h
+++ src/memory_manager.h
@@ -8,7 +8,8 @@
 #include <vector>
 #include <condition_variable>
 #include <cassert>
-#include <malloc.h>
+//#include <malloc.h>
+#include <cstdlib>
 #include <cstring>
 
 #include "constant.h"
diff --git a/src/util.h b/src/util.h
index a103b6b..c8842db 100644
--- a/src/util.h
+++ b/src/util.h
@@ -7,7 +7,8 @@
 
 #include <cstring>
 #include <cstdlib>
-#include <random>
+//#include <random>
+#include <cmath>
 #include <cassert>
 #include <exception>
 
```

また、 Makefile を修正して LD_FLAGS に -lpmpich を追加します。

```diff
--- Makefile
+++ Makefile
@@ -14,7 +14,7 @@
 
 INC_FLAGS = -I$(MULTIVERSO_INC)
 LD_FLAGS  = -L$(MULTIVERSO_LIB) -lmultiverso
-LD_FLAGS += -L$(THIRD_PARTY_LIB) -lzmq -lmpich -lmpl
+LD_FLAGS += -L$(THIRD_PARTY_LIB) -lzmq -lmpich -lpmpich -lmpl
 LD_FLAGS += -lpthread
                
 WORD_EMBEDDING_HEADERS = $(shell find $(PROJECT)/src -type f -name "*.h")
```

ビルド:

```
$ make CXX=g++-4.8
```

ビルドが終わると bin ディレクトリの下に実行ファイルが作られています。