令人胃痛的protobuf

版权声明:未经博主允许,不得转载! https://blog.csdn.net/u011681952/article/details/86736175

1 什么是 Google Protocol Buffer?

  什么是 Google Protocol Buffer?
  Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

  Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

  上面这些都可以忽略,一句话,protobuf是众多深度学习框架依赖的依赖包。

2 Protobuf常见错误

  在Ubuntu环境下,深度学习框架及其版本泛多,个人常用caffe,tensorflow,pytorch等;这些框架都要依赖protobuf,然而protobuf的版本也比较多,我们在适配环境时,常常顾此失彼
  个人在学习中,protobuf也是最令我胃痛的依赖包,卸载安装很多次,总不太理想,现在将我采过的坑和一些心得记录下来,方便你我他。

  个人环境:ubuntu16,CUDA8.0,cudnn6,opencv3.4,matlab2017,caffe,tensorflow-gpu==1.4,pytorch=1.0,tensorboardX=1.6,protobuf=2.6.1

  经常会遇到这么些错误
  错误1:import tensorflow
  报:Segmentation fault(cored umped)

  错误2:python-protobuf==3.6.1
  This program requires version 3.6.1 of the Protocol Buffer runtime library, but the installed version is 2.6.1. Please update your library. If you compiled the program yourself, make sure that your headers are from the same version of Protocol Buffers as your link-time library. (Version verification failed in “google/protobuf/descriptor.pb.cc”.)

  错误3:调用tensorboardX
  File “/usr/local/lib/python3.5/dist-packages/tensorboardX/proto/resource_handle_pb2.py”, line 22, in serialized_pb=_b(’\n(tensorboardX/proto/resource_handle.proto\x12\x0ctensorboardX"r\n\x13ResourceHandleProto\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\x11\n\tcontainer\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\thash_code\x18\x04 \x01(\x04\x12\x17\n\x0fmaybe_type_name\x18\x05 \x01(\tB/\n\x18org.tensorflow.frameworkB\x0eResourceHandleP\x01\xf8\x01\x01\x62\x06proto3’)
TypeError: init() got an unexpected keyword argument ‘serialized_options’

  这些错误都是protobuf版本不匹配问题

3 安装Protobuf

  1)简述
  之前安装Protobuf:

sudo apt-get install libprotobuf-dev protobuf-compiler

  该命令默认为2.6.1版本,对caffe来说,没有问题,但是对tensorflow和pytorch就容易出问题
  在安装tensorflow1.4时,会有下列信息:

Requirement already satisfied: protobuf>=3.3.0
tensorflow-tensorboard 0.4.0 has requirement protobuf>=3.4.0

  在安装torch1.0时,会有下列信息

Requirement already satisfied: protobuf>=3.2.0

  如果低于要求版本,会有警告,甚至报错,可能不确定报错

  所以protobuf升级势在必行,先卸载之前的版本

sudo apt-get autoremove libprotobuf-dev protobuf-compiler

  注意:其实在安装ubuntu时,系统内部已经有部分protobuf的lib,如下:

/usr/lib/pulse-8.0/modules/libprotocol-http.so
/usr/lib/pulse-8.0/modules/libprotocol-simple.so
/usr/lib/pulse-8.0/modules/libprotocol-native.so
/usr/lib/pulse-8.0/modules/libprotocol-cli.so
/usr/lib/libreoffice/program/libprotocolhandlerlo.so
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.9
/usr/lib/x86_64-linux-gnu/libprotobuf-lite.so.9.0.1
/usr/lib/x86_64-linux-gnu/libprotobuf.so.9.0.1
/usr/lib/x86_64-linux-gnu/libprotobuf.so.9

  这些lib具体干啥的,我不清楚,但我尝试过删除这些lib,然后,然后系统就崩溃了,所以建议不要手动删除这些库

  2)安装protobuf

  我尝试分别安装了protobuf,3.3.1,3.4.0,3.4.1,3.5.1,3.6.1这几个版本,
  这些版本安装过程都一样,只是3.6.1中autogen.sh没有下载googletest,但不会有太大影响,只是在make check时,会警告提示
  下面以3.4.0版本为例,记录安装过程

  步骤1)下载

wget https://github.com/google/protobuf/archive/v3.4.0.zip
unzip v3.4.0.zip
cd protobuf-3.4.0

  步骤2)生成configure

./autogen.sh

  这一步可能会出现2个错误:

错误1:
Google Mock not present.  Fetching gmock-1.7.0 from the web...
./autogen.sh: 34: ./autogen.sh: curl: not found

错误2:
\+ autoreconf -f -i -Wall,no-obsolete
./autogen.sh: 50: ./autogen.sh: autoreconf: not found

  这都是没有依赖包的错误,简单:

sudo apt-get install autoconf automake libtool

  步骤3)configure

./configure --prefix=/usr/local/protobuf

  --prefix=/usr/local/protobuf :指定安装位置;
  这个,个人觉得比较重要,将protobuf安装到指定位置,也就是将protobuf的include文件,lib文件,protoc命令文件放在同一个目录/usr/local/protobuf下,方便升级卸载或删除;
  若为默认路径,将会把protobuf的安装文件分别放到不同系统路径,和其他包文件混在一起,再想删除就麻烦了(不避免的,可能会升级或更换版本)

  步骤4) make

make -j16
make check   #(非必须)

  步骤5) make install

make install

  这是在/usr/local/protobuf下,就有相关安装文件:

	├── bin
	│   └── protoc
	├── include
	│   └── google
	└── lib
	    ├── libprotobuf.a
	    ├── libprotobuf.la
	    ├── libprotobuf-lite.a
	    ├── libprotobuf-lite.la
	    ├── libprotobuf-lite.so -> libprotobuf-lite.so.14.0.0
	    ├── libprotobuf-lite.so.14 -> libprotobuf-lite.so.14.0.0
	    ├── libprotobuf-lite.so.14.0.0
	    ├── libprotobuf.so -> libprotobuf.so.14.0.0
	    ├── libprotobuf.so.14 -> libprotobuf.so.14.0.0
	    ├── libprotobuf.so.14.0.0
	    ├── libprotoc.a
	    ├── libprotoc.la
	    ├── libprotoc.so -> libprotoc.so.14.0.0
	    ├── libprotoc.so.14 -> libprotoc.so.14.0.0
	    ├── libprotoc.so.14.0.0
	    └── pkgconfig

  步骤6)用户变量设置
  在~/.bashrc文件末尾中,添加下列protobuf路径

vim ~/.bashrc

####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/pkgconfig/
######################################

保存 退出

#刷新
source ~/.bashrc
sudo ldconfig

  这时可以验证下,是否正确

protoc --version

  输出:libprotoc 3.4.0

  步骤7)安装python版本protobuf
  python版本的protobuf,也建议在这里安装,若用pip install protobuf,安装的版本是最新的3.6.1,容易出现上面的错误2问题

cd python
python3 setup.py build   (若编译python2,命令换为python2即可)
python3 setup.py test  (非必须)
sudo python3 setup.py install  

  若build出现下面错误:

_NamespacePath' object has no attribute 'sort'

  更新下setuptools,再重新build

sudo pip3 install -U setuptools

  在/usr/local/lib/python3.5/dist-packages下就会出现:

protobuf-3.4.0-py3.5.egg

4 其他坑

  1)在尝试过程中,发现protobuf3.6.1对我用的caffe不友好,caffe编译会出现c++11标准问题,caffe对其他版本适配很好
  2)pythorch1.0在使用tensorboard1.2时,protobuf3.3.1,protobuf3.4.1,protobuf3.5.1均出现不同错误,这可能是pythorch自己的问题,它要求protobuf>=3.2,结果还出问题;后来我降低了pythorch==0.4版本,protobuf3.4.0能好适配
  3)tensorflow1.4,最多支持protobuf3.4.0,在高就会出现错误2;tensorflow版本高点的,好像需要高版本的protobuf(这点本人还没验证,因为个人用cuda8,还没升级)
  4)matlab2017调用caffe时,我前面的博客中有提到,但这里libprotobuf也要跟着升级,更新~/.bashrc中的LD_PRELOAD:

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:/usr/local/cuda-8.0/lib64/libcudart.so.8.0:/usr/local/cuda-8.0/lib64/libcublas.so.8.0:/usr/local/protobuf/lib/libprotobuf.so.14

  5)若遇到tensorflow或torch众口难调的情况,个人建议使用python虚拟环境(pipenv)

猜你喜欢

转载自blog.csdn.net/u011681952/article/details/86736175
今日推荐