使用Caffe训练模型时遭遇Protocol Buffer版本不兼容错误求助
解决Caffe训练时Protocol Buffer版本不匹配的崩溃问题
先看看你遇到的错误日志:
I0329 20:38:56.742496 13649 layer_factory.hpp:77] 创建layer data
[libprotobuf FATAL google/protobuf/stubs/common.cc:61] 本程序需要Protocol Buffer运行时库3.5.0版本,但已安装版本为2.6.1。请更新您的库。如果您自行编译程序,请确保头文件与链接时使用的Protocol Buffers版本一致。(版本验证在"google/protobuf/descriptor.pb.cc"中失败。)
terminate called after thro...
这个问题我之前帮不少开发者排查过,核心就是Protocol Buffer(简称protobuf)的编译版本和运行时版本不匹配——Caffe编译时依赖的是3.5.0,但是系统当前加载的是旧的2.6.1版本,导致运行时校验失败直接崩溃。下面给你两种靠谱的解决思路:
思路一:更新系统全局的protobuf到3.5.0版本
如果你的系统没有其他依赖旧版本protobuf的程序,直接替换是最省心的:
- 先卸载旧版本的protobuf开发包和编译器:
sudo apt-get remove libprotobuf-dev protobuf-compiler - 下载并手动编译3.5.0版本(源码编译能保证版本精准):
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.5.0/protobuf-all-3.5.0.tar.gz tar zxf protobuf-all-3.5.0.tar.gz cd protobuf-all-3.5.0 ./configure --prefix=/usr/local make -j$(nproc) # 用所有CPU核心加速编译 sudo make install sudo ldconfig # 更新系统库缓存 - 验证版本是否生效:
正常会输出protoc --versionlibprotoc 3.5.0
思路二:重新编译Caffe,指定链接正确的protobuf版本
如果系统里还有其他程序依赖旧版protobuf,不想替换全局版本,可以让Caffe单独使用3.5.0:
- 打开Caffe根目录下的
Makefile.config,找到INCLUDE_DIRS和LIBRARY_DIRS配置,添加手动编译的3.5.0版本的路径(假设你把protobuf装在了/usr/local):INCLUDE_DIRS += /usr/local/include LIBRARY_DIRS += /usr/local/lib - 清理旧的编译产物,重新编译Caffe:
make clean make -j$(nproc) make pycaffe # 如果需要Python接口的话执行这一步
额外要注意的坑
- 如果你用Anaconda虚拟环境,一定要检查环境内的protobuf版本:
如果版本不是3.5.0,用conda list protobufconda install protobuf=3.5.0安装对应版本,避免和系统全局版本冲突 - 编译完成后,可以用
ldd /path/to/your/caffe/build/libcaffe.so查看Caffe链接的protobuf库路径,确认是3.5.0版本的文件,这样能提前规避运行时的问题
内容的提问来源于stack exchange,提问作者Huangxs




