内容简介:最近在将tf训练的模型迁移到Android端,使用的是tensorflow-lite,由于模型用到了一些tflite还没有支持的op,所以需要让tflite支持tf的op,官方没有直接给出aar,而是让自己用bazel去编译一个,实在是有点坑啊,官方编译网址:大致方法就是:
前言
最近在将tf训练的模型迁移到Android端,使用的是tensorflow-lite,由于模型用到了一些tflite还没有支持的op,所以需要让tflite支持tf的op,官方没有直接给出aar,而是让自己用bazel去编译一个,实在是有点坑啊,官方编译网址:
https://www.tensorflow.org/lite/using_select_tf_ops
大致方法就是:
【1】 安装bazel,【 https://docs.bazel.build/versions/master/install.html 】
【2】 下载tensorflow源码,【 https://github.com/tensorflow/tensorflow 】
【3】 进入源码所在目录,修改WORKSPACE文件,增加sdk路径:
android_sdk_repository ( name = "androidsdk", api_level = 26, build_tools_version = "26.0.2", path = "/Users/vell/Library/Android/sdk/", ) android_ndk_repository( name = "androidndk", path = "/Users/vell/Library/Android/sdk/ndk-bundle", api_level = 19, )
注意修改自己的sdk路径和版本
【4】 进入源码所在的目录执行如下命令:
bazel build --cxxopt='--std=c++11' -c opt \ --config=android_arm --config=monolithic \ //tensorflow/lite/java:tensorflow-lite-with-select-tf-ops
【5】 如果你运气足够好的话,你将在如下目录找到编译好的aar:
bazel-genfiles/tensorflow/lite/java/tensorflow-lite-with-select-tf-ops.aar
【6】 大功告成,但是,我就是那个运气极其差的,总是遇到些奇怪的问题,我这算是有两个吧
“undeclared inclusion(s)” error
ERROR: /data/vellhe/tensorflow-master/tensorflow/core/common_runtime/eager/BUILD:40:1: undeclared inclusion(s) in rule '//tensorflow/core/common_runtime/eager:context': this rule is missing dependency declarations for the following files included by 'tensorflow/core/common_runtime/eager/context.cc': 'tensorflow/core/distributed_runtime/collective_param_resolver_distributed.h' 'tensorflow/core/distributed_runtime/device_resolver_distributed.h' 'tensorflow/core/distributed_runtime/rpc_collective_executor_mgr.h' Target //tensorflow/lite/java:tensorflow-lite-with-select-tf-ops failed to build Use --verbose_failures to see the command lines of failed build steps. INFO: Elapsed time: 85.812s, Critical Path: 33.15s INFO: 666 processes: 655 local, 11 worker. FAILED: Build did NOT complete successfully
这个是我遇到最坑的,由于对bazel工具不熟悉,各种google,花了整整一个上午,才搞出点名堂了,如果编译遇到坑的话,还是建议先去熟悉下bazel
其实stackoverflow上已经有大神给到了解决方法:
How to resolve bazel “undeclared inclusion(s)” error?
只不过,如果没有bazel背景是很难真正看懂怎么操作
问题原因
错误信息里可以看出,是.h文件没有声明, tensorflow/core/common_runtime/eager/context.cc
里缺三个.h文件的声明,缺的.h文件都在 tensorflow/core/distributed_runtime
目录下, tensorflow/core/distributed_runtime
里有一个BUILD文件,这个目录就相当于也是一个模块,所以需要做的就是将 tensorflow/core/distributed_runtime
里的.h文件告诉 tensorflow/core/common_runtime/eager/context.cc
解决方法:
【1】 编辑 tensorflow/core/distributed_runtime/BUILD
文件,新增如下:
cc_library( name = "headers", hdrs = glob(["*.h"]) )
【2】 编辑 tensorflow/core/common_runtime/eager/BUILD
文件,找到 //tensorflow/core/common_runtime/eager:context
的定义,在deps里增加一条, "//tensorflow/core/distributed_runtime:headers",
,修改后如下:
【3】 大功告成
no member named 'round' in namespace 'std';
ERROR: /Users/vell/workspace/github/tensorflow-master/tensorflow/lite/kernels/internal/BUILD:418:1: C++ compilation of rule '//tensorflow/lite/kernels/internal:neon_tensor_utils' failed (Exit 1) In file included from tensorflow/lite/kernels/internal/reference/portable_tensor_utils.cc:19: ./tensorflow/lite/c/builtin_op_data.h:154:9: warning: empty struct has size 0 in C, size 1 in C++ [-Wextern-c-compat] typedef struct { ^ ./tensorflow/lite/c/builtin_op_data.h:157:9: warning: empty struct has size 0 in C, size 1 in C++ [-Wextern-c-compat] typedef struct { ^ ./tensorflow/lite/c/builtin_op_data.h:232:9: warning: empty struct has size 0 in C, size 1 in C++ [-Wextern-c-compat] typedef struct { ^ ./tensorflow/lite/c/builtin_op_data.h:235:9: warning: empty struct has size 0 in C, size 1 in C++ [-Wextern-c-compat] typedef struct { ^ ./tensorflow/lite/c/builtin_op_data.h:274:9: warning: empty struct has size 0 in C, size 1 in C++ [-Wextern-c-compat] typedef struct { ^ In file included from tensorflow/lite/kernels/internal/reference/portable_tensor_utils.cc:21: ./tensorflow/lite/kernels/internal/round.h:28:10: error: no member named 'round' in namespace 'std'; did you mean simply 'round'? return std::round(x); ^~~~~~~~~~ round external/androidndk/ndk/sysroot/usr/include/math.h:255:8: note: 'round' declared here double round(double __x); ^ 5 warnings and 1 error generated. Target //tensorflow/lite/java:tensorflow-lite-with-select-tf-ops failed to build Use --verbose_failures to see the command lines of failed build steps. INFO: Elapsed time: 6.732s, Critical Path: 3.36s INFO: 0 processes. FAILED: Build did NOT complete successfully
问题原因
在 tensorflow/lite/kernels/internal/round.h:28:10
处,调用了 std::round(x);
,而在std的namespace里没有round这个函数,所以报错了
解决方法
将std去掉,如下:
以上所述就是小编给大家介绍的《编译tensorflow-lite-with-select-tf-ops遇到的坑》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
代码大全(第2版)
[美] 史蒂夫·迈克康奈尔 / 金戈、汤凌、陈硕、张菲 译、裘宗燕 审校 / 电子工业出版社 / 2006-3 / 128.00元
第2版的《代码大全》是著名IT畅销书作者史蒂夫·迈克康奈尔11年前的经典著作的全新演绎:第2版不是第一版的简单修订增补,而是完全进行了重写;增加了很多与时俱进的内容。这也是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题,并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念,还含有丰富而典型的程序示例。这本书中所论述的技术不仅填补了初......一起来看看 《代码大全(第2版)》 这本书的介绍吧!