有没有人为Tensorflow C++ API构建静态库的经验?

Has anyone experience in building a static library for the Tensorflow C++ API?

提问人:Maxxxxxx 提问时间:11/16/2022 最后编辑:General GrievanceMaxxxxxx 更新时间:11/24/2022 访问量:776

问:

我需要将 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 静态库 libtool tensorflow-c++

评论

0赞 Jirayu Kaewprateep 11/16/2022
它是一个静态库,您可以使用正确的权限在合适的环境中复制和运行。(我也在 Windows 10 中使用 VS 代码重新编译)tensorflow.org/install/lang_c#build_from_source
0赞 Maxxxxxx 11/17/2022
是的?我以为 .dylib 文件是动态库?我想编译成一个.a文件,因为我正在构建的项目不能像Windows那样捆绑动态库,如.dylib或.dll。似乎 Windows 版本包含一个 .lib 文件,但我需要它才能适用于没有夜间构建的 arm64 架构的 MacOS。
0赞 Jirayu Kaewprateep 11/17/2022
Python Lib 是 .pdb,Window lib 有 .dll,C++ 有 .cpp,.h 遵循指令已经有 MacOS,我也在本机 Windows 10 上运行(从源代码编译)。使用功能时,您需要创建使用它的环境,当他们尝试使用 AVX 或 AVX2 以及 CPU 或 GPU 功能时,请查找这些说明。
0赞 Maxxxxxx 11/17/2022
Linux 上的静态库是一个 .a 文件,在 Windows 上是一个 .lib 文件,在 MacOS 上是一个 .a 文件。你显然不知道你在这里说什么。
0赞 Jirayu Kaewprateep 11/18/2022
在链接中,我在评论中回复,因为使用本机 Windows 10,但他们提供了您可以构建匹配环境并以我的身份自行编译程序的源代码。

答:

0赞 Maxxxxxx 11/24/2022 #1

事实上,目前没有任何支持为 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