编译tensorflow-lite-with-select-tf-ops遇到的坑

栏目: 编程工具 · 发布时间: 5年前

内容简介:最近在将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版)

代码大全(第2版)

[美] 史蒂夫·迈克康奈尔 / 金戈、汤凌、陈硕、张菲 译、裘宗燕 审校 / 电子工业出版社 / 2006-3 / 128.00元

第2版的《代码大全》是著名IT畅销书作者史蒂夫·迈克康奈尔11年前的经典著作的全新演绎:第2版不是第一版的简单修订增补,而是完全进行了重写;增加了很多与时俱进的内容。这也是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题,并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念,还含有丰富而典型的程序示例。这本书中所论述的技术不仅填补了初......一起来看看 《代码大全(第2版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具