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)、その点だけご注意を。