読書帳

PyData Tokyo MeetupでCaffeとmafについて話しました

10月30日のPyData Tokyo MeetUp #1にて「Caffeとmafを用いたディープラーニング開発・実験方法」というタイトルで発表を行いました。 発表資料はSlideShareで公開しています。当日の発表に関する情報はconnpassにまとめられています (私以外の発表の資料へのリンクや当日のUstreamでの配信へのリンクもあります)。 また、当日までのtwitterの反応はtogetterにもまとめられています。

勉強会の立ち上げ会での講演という大役で恐れ多くありましたが、興味を持っていただいたようで当日は質問や議論で盛りあがり一安心しました。 発表の機会をくださったPyData発起人の皆様、発表を聞いてくださった方々に改めてお礼を申し上げます。 PyDataは「濃い」勉強会を行うことを目標としているとのことで、陰ながら応援をさせていただければと考えております。

発表内容について

今回はディープラーニングライブラリの中でも特に開発が活発に行われているCaffeと、PFI/PFNで開発している実験ビルドツールのmafをそれぞれ紹介しました。 また、 発起人の柴田さんから、Caffeを用いて参加者の方が自分で何か作れるようになるとうれしい人が集まっていると事前に聞いておりましたので、 デモを通じてmafとCaffeを用いて具体的に実験を行う具体的な方法を紹介しました。

質問の回答

頂いた質問について、きちんと答えられなかったものがいくつかありましたので、ここで改めて回答いたします。 自分が質問を間違って理解していたら申し訳ありません。指摘していただけるとありがたいです。

高次元な入力データを扱う方法について

入力が高次元で疎な場合に、BlobとLayerを駆使して効率的に学習を行う方法がないかという質問を頂きました。 疎なデータを入力するためのInput Blob(Sparse Blob)は議論で挙がり、Pull Request上で既に実装されているのですが、まだマージされていないようです。 ですので、もし利用する場合には、ローカルレポジトリにforkし、このリクエストをマージし、自己責任で利用する必要がありそうです。

参考:Sparse Data Support #937

また、返答中で「Torch7と勘違いしているかもしれない」とも話しました。 確認した所、疎なデータを入力して内積計算するLayerがTorch7にも存在しました。

参考:SparseLinear Layer関係 - コード - ドキュメント

mafをCaffeで実行する際の-j1オプションについて

デモでmafを用いてCaffeを実行した際、1並列での実行を指定する-j1オプションを付けたのはなぜかという質問にきちんと回答ができていませんでした。 これは今回のデモで用いたNeural NetでのData Layerがleveldb形式であった事が原因です。

Data Layerを用いて入力データを与える場合、入力ファイルを予め適切なファイル形式に変換しなければなりません(そのためのスクリプトはCaffe側で用意されています)。 その形式の1つのleveldb形式では、同じファイルに複数のプロセスから同時にデータにアクセスすることができません(下記issue参照)。 今回のデモでは、色々なパラメータでのprototxtを生成・利用しましたが、Data Layerで利用しているファイルは共通していました。 そのため、複数のタスクが並列に走った場合競合が発生します。 下記のissueによると、ファイル形式がleveldbではなくLMDBを用いれば並列実行しても問題ないようです。

参考:Parallel access to Leveldb #695

Mac OS 10.9でのCaffeのインストールについて

公式サイトに手順は書かれていますが、Mac OS 10.9でのインストール方法は10.8以前とは異なります。 その原因の一つがデフォルトで使用するC++ライブラリです。 Mac OS 10.9ではデフォルトC++コンパイラであるClang++はlibc++をデフォルトで用いています。 しかし、NVIDIAのCUDAはlibstdc++でコンパイルしたライブラリとしかリンクできません。

これの回避策は大きく分けて2通りあります。 一つ目はClangのコンパイラをlibc++からlibstdc++に変更する方法でこれは本家サイトで紹介されています。 もしGPUを使用しないのであれば、もう一つの方法として、10.8以前の方法に1つ手順を加えるだけでインストールを行う方法があります。 具体的には、Makefile.configの中で–libstdc++を利用する部分を削除し、コメントアウトされているCPU_ONLY:=1を有効すれば良いです。 これにより、GPUを使わないのでデフォルトのライブラリがlibc++でも問題なくCaffeをビルドできます。

GPUを使用しない場合のインストール手順はtwitterで@mooopanさんに指摘していただきました(参考)。ありがとうございます。

(2015/1/1追記)

上記とほぼ同等の内容を会社のリサーチブログに載せたので、こちらでの文章は下書きとして未公開にしていましたが、せっかくこちらのブログ用にも整形していたので、こちらでも公開しました。