MacPortsでCaffe

2012年の国際的な画像認識技術評価タスクで、多段の畳み込みニューラルネットワークを使った手法が圧倒的な性能を達成してから、画像認識研究は深層学習中心に一変しました:
[1409.0575] ImageNet Large Scale Visual Recognition Challenge

自然言語処理研究の分野でも、畳み込みニューラルネットワークを使う手法は、タスクごとの知識を利用しないで最高性能に迫る解析を行うSENNAが現れ、word2vecの分散表現やアルファベットや読みを入力としてテキスト分類タスクでベンチマークのbag-of-wordsモデルを超える性能を示したりと大変注目を集めています:
[1103.0398] Natural Language Processing (almost) from Scratch
[1408.5882] Convolutional Neural Networks for Sentence Classification
[1502.01710] Text Understanding from Scratch

深層学習を実装するフレームワークとして、Theano/Pylearn2TorchCaffeなど様々公開されていますが、Caffeは画像認識研究の最新成果が反映されていて、高速な上に使いやすく人気があります。

Caffeのインストール手順を見ると、Mavericks(10.9)以降のMacの場合、NVIDIAGPUを利用するために必要なCUDAのバージョン6までがgccベースのlibstdc++にリンクされているため、homebrewを使った少々面倒な手順が記述されていますが、CPUだけ、もしくは次期CUDAのバージョン7を利用する場合はもっと単純です。

Caffeは効率的なデータ処理を行うprotobufなどいくつかの依存パッケージが必要で、Pythonのインタフェースも用意されていますが、MacPortsCaffeポートを使うと、CPUでの処理限定になりますが、簡単にMacにインストールできます。Mac標準のベクトル数値演算ライブラリは、十分にチューニングされているためか結構高速ですが、複数のCPUコアでは同時に動作しません。Caffeポートはデフォルトの指定でOpenBLAS対応になって、CPUコアが最大限利用されるようになります。ただし、残念ながら全体の処理速度は思ったほどあがらないですが。。

Caffeをインストールして、手書き数字認識テストセットMNISTを標準的な畳み込みニューラルネットワークのLeNetで学習するサンプルを試してみます:

$ sudo port selfupdate
$ sudo port install caffe
$ cp -r /opt/local/libexec/caffe .
$ cd caffe
$ ./data/mnist/get_mnist.sh
Downloading...
...
Unzipping...
Done.
$ ./examples/mnist/create_mnist.sh
Creating lmdb...
Done.
$ vi examples/mnist/lenet_solver.prototxt
(最終行のGPUをCPUに変更します)
$ ./examples/mnist/train_lenet.sh
I0215 22:35:43.757207 2073379584 caffe.cpp:103] Use CPU.
I0215 22:35:43.758378 2073379584 caffe.cpp:107] Starting Optimization
I0215 22:35:43.759407 2073379584 solver.cpp:32] Initializing solver from parameters:
...
I0215 22:43:08.604959 2073379584 solver.cpp:246] Iteration 10000, loss = 0.00372661
I0215 22:43:08.604992 2073379584 solver.cpp:264] Iteration 10000, Testing net (#0)
I0215 22:43:11.086513 2073379584 solver.cpp:315]     Test net output #0: accuracy = 0.9902
I0215 22:43:11.087237 2073379584 solver.cpp:315]     Test net output #1: loss = 0.0292476 (* 1 = 0.0292476 loss)
I0215 22:43:11.087249 2073379584 solver.cpp:251] Optimization Done.
I0215 22:43:11.087255 2073379584 caffe.cpp:121] Optimization Done.
$ 

2.7 GHz Intel Core i5のマシンで動かして、8分弱の学習時間でテスト精度が99%を超えました! CUDAを有効にしてGPUを使ったり、NVIDIAが公開している深層学習用のcuDNNライブラリを利用するとさらに高速になります。ちなみにTheanoで同様のことを行うとCPU処理で6時間程度かかるようです。。

ちなみに、CaffeのPythonインタフェースは/opt/local/bin/python2.7から利用できます。NumPyやmatplotlib、scikit-learn、pandas、ipythonなど、機械学習や統計処理などに適したAnacondaのように各種Pythonライブラリも同時にインストールされるので、デフォルトのPythonとして普段から利用するのも良いと思います:

$ sudo port select --set python python27
$ sudo port select --set ipython ipython27

[2015-02-22追記]
CaffeポートにGPUとcuDNNを利用するオプションを追加しました。CUDA7(+cuDNN)が/usr/local/cudaにインストールされていることが前提です。ポートを+gpuや+cudnnオプションつきでインストールしようとすると、ソースからコンパイルが始まります:

$ port variants caffe
caffe has the variants:
[+]cpu: Use CPU only
     * conflicts with gpu
   cudnn: Use cuDNN
   gpu: Use GPU and CUDA in /usr/local/cuda
     * conflicts with cpu
[+]openblas: Use OpenBLAS
[+]python27: Install Python 2.7 interface
   universal: Build for multiple architectures
$ sudo port install caffe +gpu
または
$ sudo port install caffe +cudnn
...

また、まもなくCaffeのバージョン1.0が公開されるようです:
https://github.com/BVLC/caffe/pull/1849