为 arm64-v8a 构建 libtensorflow_cc.so 问题

Posted

技术标签:

【中文标题】为 arm64-v8a 构建 libtensorflow_cc.so 问题【英文标题】:Issue building libtensorflow_cc.so for arm64-v8a 【发布时间】:2018-04-16 22:22:30 【问题描述】:

我正在尝试使用 bazel 为 android 构建用于 arm64-v8a 架构的 libtensorflow_cc.so

要求

我正在尝试为 arm64-v8a 架构的 android 构建“libtensorflow_cc.so”。 我需要它在运行时通过 C++ 在 Android NDK 中创建和训练模型文件。 在由

生成的“libtensorflow_cc.so”的帮助下,我可以在桌面上使用 C++ 做到这一点

bazel build -c opt //tensorflow:libtensorflow_cc.so

,但现在想与 Android NDK 集成并在移动设备上进行训练。

我尝试使用 'libtensorflow.so' ,但出现以下错误

tensorflow_jni.cc:359 Non-OK-status: session->Create (graph_def) 状态:无效参数:没有注册 OpKernel 来支持 Op 具有这些属性的“SparseSoftmaxCrossEntropyWithLogits”。挂号的 设备:[CPU],注册内核: [[节点:SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits = SparseSoftmaxCrossEntropyWithLogits[T=DT_FLOAT, Tlabels=DT_INT64](add, Cast)]]

我也试过 'libtensorflow_inference.so' 但我得到许多未定义的参考错误 如下所示

在函数 tensorflow::TensorShapeRep::~TensorShapeRep()' 中: /home/ashok/AndroidStudioProjects/Android-arm64-v8a-dnn/facerecognitionlibrary/jni-build/jni/include/include1/tensorflow/core/framework/tensor_shape.h:492: 未定义参考 totensorflow::TensorShapeRep::DestructorOutOfLine()' ./obj/local/arm64-v8a/objs-debug/tensorflow_cc1/tensorflowTrian_jni.o: 在函数 std::pair::~pair()' 中: /home/ashok/Ashok/android-ndk-r12b/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/stl_pair.h:96: 未定义对 tensorflow::Tensor::~Tensor()' 的引用 ./obj/local/arm64-v8a/objs-debug/tensorflow_cc1/tensorflowTrian_jni.o: 在函数 std::string* tensorflow::internal::MakeCheckOpString(long const&, int const&, char const*)' 中: /home/ashok/AndroidStudioProjects/Android-arm64-v8a-dnn/facerecognitionlibrary/jni-build/jni/include/include1/tensorflow/core/platform/default/logging.h:184: 未定义参考 totensorflow::internal::CheckOpMessageBuilder::CheckOpMessageBuilder(char 常量*)'

因此使用以下代码为 arm64-v8a 构建 libtensorflow_cc.so

代码

bazel build -c opt //tensorflow:libtensorflow_cc.so --crosstool_top=//external:android/crosstool --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cpu=arm64-v8a

日志

警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12: 在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:avgpooling_op.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:bounds_check.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:cwise_ops.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:cwise_ops_common.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:cwise_ops_gradients.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_activations.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_attention.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_backward_cuboid_convolutions.h' 直接地。您应该将文件移动到此包或依赖 有一个适当的规则警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_backward_spatial_convolutions.h' 直接地。您应该将文件移动到此包或依赖 有一个适当的规则警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_cuboid_convolution.h' 直接。你 应该将文件移动到此包或依赖于 适当的规则有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_pooling.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_softmax.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_spatial_convolutions.h' 直接。你 应该将文件移动到此包或依赖于 适当的规则有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:eigen_volume_patch.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:fifo_queue.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:maxpooling_op.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:ops_util.cc' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:ops_util.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:padding_fifo_queue.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:pooling_ops_common.cc' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:pooling_ops_common.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:queue_base.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:queue_op.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/kernels:typed_queue.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/ctc:ctc_beam_entry.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/ctc:ctc_beam_scorer.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/ctc:ctc_beam_search.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/ctc:ctc_decoder.h' 直接。你应该要么 将文件移动到这个包或依赖于那里的适当规则 警告:/home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 cc_library 规则的 srcs 属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/ctc:ctc_loss_util.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/tensor_bundle:naming.cc' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/tensor_bundle:naming.h' 直接。你应该 要么将文件移动到这个包中,要么依赖于适当的规则 有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/tensor_bundle:tensor_bundle.cc' 直接。你 应该将文件移动到此包或依赖于 适当的规则有警告: /home/ashok/Ashok/tensorflow/tensorflow/core/BUILD:952:12:在 srcs cc_library 规则的属性 //tensorflow/core:android_tensorflow_lib_lite: 请不要导入 '//tensorflow/core/util/tensor_bundle:tensor_bundle.h' 直接。你 应该将文件移动到此包或依赖于 适当的规则有错误: /home/ashok/Ashok/tensorflow/tensorflow/c/eager/BUILD:11:1:在部门 cc_library 规则属性 //tensorflow/c/eager:c_api:target '//tensorflow/c/eager:c_api_internal' 不存在。由于这条规定 由宏“tf_cuda_library”创建,错误可能是 由宏实现引起 /home/ashok/Ashok/tensorflow/tensorflow/tensorflow.bzl:667:12 错误: 分析目标'//tensorflow:libtensorflow_cc.so'失败;建造 中止信息:经过时间:0.252 秒失败:构建未完成 成功(加载了 0 个包)

请帮助解决问题

【问题讨论】:

你是如何解决这个问题的?下面的答案似乎没有解决警告You should either move the file to this package or depend on an appropriate rule there 要修复最初的“No OpKernel”错误,您需要将您使用的操作添加到 tensorflow/core/kernels/BUILD 中的 android_extended_ops_group1 目标:github.com/tensorflow/tensorflow/blob/master/tensorflow/core/…。尽管有警告,图书馆还是建成了 你知道如何解决这个错误this rule is missing dependency declarations for the following files included by 'tensorflow/core/kernels/decode_image_op.cc': './tensorflow/core/lib/jpeg/jpeg_mem.h' './tensorflow/core/platform/jpeg.h' 【参考方案1】:

要修复最初的“No OpKernel”错误,您需要将您使用的操作添加到 tensorflow/core/kernels/BUILD 中的 android_extended_ops_group1 目标: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/BUILD#L4568

您可以在 TF for Mobile 电子书中找到更多详细信息,了解为什么需要这样做: http://www.oreilly.com/data/free/building-mobile-applications-with-tensorflow.csp

【讨论】:

那个警告是什么,You should either move the file to this package or depend on an appropriate rule there 是由什么引起的?

以上是关于为 arm64-v8a 构建 libtensorflow_cc.so 问题的主要内容,如果未能解决你的问题,请参考以下文章

我可以根据 Android API LEVEL 强制使用 armeabi-v7a 与 arm64-v8a 吗?

无法为 com.android.build.gradle.internal.dsl.NdkOptions 类型的对象获取未知属性“arm64-v8a”

arm64-v8a 是不是与 armeabi-v7a 兼容?

反应原生模块中的“arm64-v8a”、“x86_64”上的应用程序崩溃

arm64-v8a 静态成员模板 undefined reference to

如何构建和使用PJSIP用于不同于armeabi的架构?