提问人:Maxxxxxx 提问时间:11/16/2022 最后编辑:General GrievanceMaxxxxxx 更新时间:11/24/2022 访问量:776
有没有人为Tensorflow C++ API构建静态库的经验?
Has anyone experience in building a static library for the Tensorflow C++ API?
问:
我需要将 Tensorflow 构建为静态库以包含在产品中。截至目前,似乎只支持使用 bazel 构建共享/动态库。我目前的目标是为 MacOS(darwin-arm64) 构建一个库,但我也将为 x86 构建一个库。
以前有人解决这个问题吗?
多亏了这个线程,我有一些事情可以工作:https://github.com/tensorflow/rust/pull/351
我所做的是编译并保留所有 .a 和 .lo 文件缓存:
bazel build --config=monolithic --macos_minimum_os=11.0 --cpu=darwin_arm64 -j 1 //tensorflow:libtensorflow_cc.so
然后尝试使用 libtool 将它们链接在一起,并使用 bazel 生成的参数来尝试获取所需的文件,整理出不需要的行并过滤重复项:
libtool -static -o libtensorflow_arm64_libtool_SO3.a $(cat bazel-bin/tensorflow/libtensorflow_cc.so.*.params | sed -e 's!-Wl,-force_load,!!' | grep -e '\.a$' -e '\.lo$' | sort -t: -u -k1,1)
一些简单的事情适用于这种方法,但例如,在运行与 C-API 接口的代码时,我可能会遇到以下错误:
F tensorflow/core/framework/allocator_registry.cc:85] No registered CPU AllocatorFactory
答:
事实上,目前没有任何支持为 Tensorflow C-API 构建静态库。这是因为 bazel 是构建工具。在撰写本文时,bazel 不支持编写静态库:
https://github.com/bazelbuild/bazel/issues/1920
这个问题已经存在了很长一段时间,这也是目前无法将整个 C-API 构建为静态库的原因。
但是,有一种方法可以解决这个问题。您可以使用以下方法将 Tensorflow lite 构建为静态库:Tensorflow git 存储库中提供了以下信息: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/liteCmake
我还发现这个线程非常有用: TensorFlow 静态 C API 库 - 如何与 10 个子依赖项链接?
构建完成后,您还需要在项目中包含 Google flatbuffer 库(当然,您也可以将其包含在静态库中): https://github.com/google/flatbuffers
TFlite 可以运行大多数模型,甚至可以用于我构建的最复杂的模型。因此,这是目前让 Tensorflow 作为静态库工作的最佳方式。有关 TFLite 的详细信息,请参阅: https://www.tensorflow.org/lite
评论