目前,在Tensorflow的支持下,编译(和运行)(大型)自己的项目时遇到了一些问题。在我自己的系统(Ubuntu 16.04 LTS)上,一切正常。在群集上执行相同的步骤会导致编译错误,但我现在还找不到解决方案。
用于复制的精确命令:
复制的库,标头并包含在自己的项目中:
$ cp bazel-bin/tensorflow/libtensorflow_cc.so ../tf_project/lib/
$ cp bazel-bin/tensorflow/libtensorflow_framework.so ../tf_project/lib/
$ cp /tmp/proto/lib/libprotobuf.a ../tf_project/lib/
$ mkdir -p ../tf_project/include/tensorflow
$ cp -r bazel-genfiles/ * ../tf_project/include/
$ cp -r tensorflow/cc ../tf_project/include/tensorflow
$ cp -r tensorflow/core ../tf_project/include/tensorflow
$ cp -r third_party ../tf_project/include
$ cp -r /tmp/proto/include/ * ../tf_project/include
$ cp -r /tmp/eigen/include/eigen3/ * ../tf_project/include
注释:在我自己的系统上,这种方法已经运行了几周。我可以在自己的项目中使用tensorflow,并在python项目中使用由keras训练的导出模型。我使用client_sessions和tensorflow框架的许多其他功能进行预测,并且可以正常工作。
问题::在集群上,我可以将张量流编译为动态库,安装protobuf和eigen。 当我尝试编译我的项目(关于我自己的系统的类似过程)而没有重大更改时,它不起作用并停止并显示以下错误消息:
.../tensorflow/include/tensorflow/core/framework/tensor.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
#error This file was generated by a newer version of protoc which is
^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
#error incompatible with your Protocol Buffer headers. Please update
^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:14:2: error: #error your headers.
#error your headers.
^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:27:10: fatal error: google/protobuf/inlined_string_field.h: No such file or directory
#include <google/protobuf/inlined_string_field.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
因此,显然这应该是问题所在
此文件是由与协议缓冲区标头不兼容的较新版本的protoc生成的。请更新标题。
和
严重错误: google / protobuf / inlined_string_field.h:没有此类文件或目录
尝试过的解决方案:
我想知道,因为按照相同的步骤进行我自己的安装可以正常工作。除非我尝试使用不同版本以确保这些不是“新”问题,否则其中一个组件可能存在问题。
有人可以帮助我解决我可以在另一台计算机上编译并运行该项目的错误吗?
期待获得有用的解决方案:)非常感谢您的支持!
德国最诚挚的问候!
答案 0 :(得分:1)
首先,我在github上进行了检查,tensorflow r1.9需要protobuf> = 3.6.0。使用download_dependencies.sh脚本,您总会得到protobuf 3.5.0,其中缺少inlined_string_field.h和其他一些头文件。
第二,一些错误要求您更新protobuf版本。我也尝试了许多版本的protobuf。只有3.6.0版才能正常运行,而不是3.6.1版或更早的版本。
对于这些错误,
error此文件是由protoc的较新版本生成的
严重错误:google / protobuf / inlined_string_field.h:无此类文件或目录
这是版本不匹配的问题。我的解决方案是从以下位置手动下载protobuf 3.6.0 https://github.com/protocolbuffers/protobuf/releases/download/v3.6.0/protoc-3.6.0-linux-x86_64.zip
安装并cp /usr/local/include/google to somewhere/tf/include
。对我来说效果很好。我不知道您是否尝试过3.6.0版。
download_dependencies.sh脚本将提供不匹配的版本 原虫。查看我在github上发布的问题 https://github.com/tensorflow/tensorflow/issues/22536
此外,我注意到您复制的文件与我的不同。我是这样做的。
sudo mkdir /usr/local/tensorflow/include
sudo cp -r tensorflow/contrib/makefile/downloads/eigen/Eigen /usr/local/tensorflow/include/
sudo cp -r tensorflow/contrib/makefile/downloads/eigen/unsupported /usr/local/tensorflow/include/
sudo cp -r tensorflow/contrib/makefile/gen/protobuf/include/google /usr/local/tensorflow/include/
sudo cp tensorflow/contrib/makefile/downloads/nsync/public/* /usr/local/tensorflow/include/
sudo cp -r bazel-genfiles/tensorflow /usr/local/tensorflow/include/
sudo cp -r tensorflow/cc /usr/local/tensorflow/include/tensorflow
sudo cp -r tensorflow/core /usr/local/tensorflow/include/tensorflow
sudo mkdir /usr/local/tensorflow/include/third_party
sudo cp -r third_party/eigen3 /usr/local/tensorflow/include/third_party/
sudo mkdir /usr/local/tensorflow/lib
sudo cp bazel-bin/tensorflow/libtensorflow_*.so /usr/local/tensorflow/lib
顺便说一句,我运行的是build_all_linux.sh而不是download_dependencies.sh。
希望对您有所帮助。
答案 1 :(得分:0)
我之前遇到过这个问题,下面是我的解决方法:
我成功地用tensorflow-r1.8
构建了bazel
。我发现以下路径中的protoc
是3.5.0:
/home/zsb/.cache/bazel/_bazel_zsb/1372f28eb0671f692e7ac38330377d8c/execroot/org_tensorflow/bazel-out/host/bin/external/protobuf_archive/protoc --version
但是实际上我的系统配置使用的是protoc
版本3.4.0
我直接通过类型"protoc --version"
确认了这一点。
所以最后我将系统protobuffer
的版本更新为3.5.0
,此问题已解决。