protobufのC++実装でChainerのCaffeモデルの読み込みを10倍早くする


chainer v.1.16.0から対応しました

待望のprotobuf 3.0.0がリリースされました。特に2系までPython 3では動作せず、Python 3がサポートされている3系の正式リリースが待望されていました。

余り知られていないと思いますが、protobufのPythonインターフェースには、内部的にPython実装とC++実装の2つの実装を持っており、後者のほうが圧倒的に早いのです。ChainerでCaffeのmodelzooファイルを読むと異様に遅いのは、前者のPython実装を使っているためです。例えばalexnetのモデルファイルの読み込みは、Python実装では120秒位かかっていたのが、C++実装では10倍速の10秒ほどですみました。かねてより、読み込みファイルサイズ上限(バッファサイズ上限があった)のせいで、modelzooで公開されているような巨大なファイルは読めず、これを回避する方法も最近取り込まれたようです。

インストール方法

protobufのC++実装を使うには、ソースから入れる必要があります。これは、将来的に変わるかもしれません。
まず、protobufのC++のソースをとってきて解凍し、インストールします。

$ wget https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-cpp-3.0.0.tar.gz
$ tar -xzf protobuf-cpp-3.0.0.tar.gz
$ cd protobuf-3.0.0 && ./configure && make && make install && ldconfig

次に、pythonパッケージのダウンロードとビルドです。先ほどと同じディレクトリで作業してください。ここで、--cpp_implementationを指定するとC++実装が使われます。

$ wget https://github.com/google/protobuf/releases/download/v3.0.0/protobuf-python-3.0.0.tar.gz
$ tar -xzf protobuf-python-3.0.0.tar.gz
$ cd protobuf-3.0.0/python && python setup.py install --cpp_implementation

これで終わりです。

インストール時の注意点

必ずC++とPythonの両方のソースを同じディレクトリで解凍してください。また、C++を先にインストールしてください。これは、setup.pyの中でC++のライブラリを相対ディレクトリで指定しているようです。将来的にはpipからもインストールできるようになるかもしれません。

備考

pickleすると読み込みが早くなるという指摘を色んな所で受けています。当面はこれでいいかもしれません。pickleはバージョン間で互換性が取れないので(例えばpython2とpython3)、その点だけご注意を。