首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow静态C库-如何链接到10个子依赖项?

TensorFlow静态C库-如何链接到10个子依赖项?
EN

Stack Overflow用户
提问于 2022-03-21 10:53:37
回答 1查看 560关注 0票数 0

我试图链接到TensorFlow库的静态C版本。我使用以下命令构建了静态库:

代码语言:javascript
复制
// get the sources
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src

// create a build directory
mkdir builddir
cd builddir

// build the lib using CMake
cmake -S ../tensorflow_src/tensorflow/lite/c -DTFLITE_C_BUILD_SHARED_LIBS:BOOL=OFF
cmake --build . -j

这就构建了libtensorflow-lite.a。然而,libtensorflow-lite.a不是自给的,它有它自己的10组依赖项,在CMake文件中说。

代码语言:javascript
复制
# TensorFlow Lite dependencies.

find_package(absl REQUIRED)
find_package(eigen REQUIRED)
find_package(farmhash REQUIRED)
find_package(fft2d REQUIRED)
find_package(flatbuffers REQUIRED)
find_package(gemmlowp REQUIRED)
find_package(neon2sse REQUIRED)
find_package(clog REQUIRED)
find_package(cpuinfo REQUIRED)  #CPUINFO is used by XNNPACK and RUY library
find_package(ruy REQUIRED)

问题是,如何找到所需子库的.a名称?

我使用find ./builddir -type f -name "*.a"列出了由CMake构建的库,预计大约有10个库,但是实际的列表太长了:

代码语言:javascript
复制
./_deps/xnnpack-build/libXNNPACK.a
./_deps/ruy-build/ruy/libruy_pack_avx2_fma.a
./_deps/ruy-build/ruy/libruy_have_built_path_for_avx2_fma.a
./_deps/ruy-build/ruy/libruy_block_map.a
./_deps/ruy-build/ruy/libruy_system_aligned_alloc.a
./_deps/ruy-build/ruy/libruy_have_built_path_for_avx512.a
./_deps/ruy-build/ruy/profiler/libruy_profiler_instrumentation.a
./_deps/ruy-build/ruy/libruy_trmul.a
./_deps/ruy-build/ruy/libruy_cpuinfo.a
./_deps/ruy-build/ruy/libruy_blocking_counter.a
./_deps/ruy-build/ruy/libruy_pack_arm.a
./_deps/ruy-build/ruy/libruy_apply_multiplier.a
./_deps/ruy-build/ruy/libruy_kernel_avx2_fma.a
./_deps/ruy-build/ruy/libruy_prepacked_cache.a
./_deps/ruy-build/ruy/libruy_tune.a
./_deps/ruy-build/ruy/libruy_context_get_ctx.a
./_deps/ruy-build/ruy/libruy_have_built_path_for_avx.a
./_deps/ruy-build/ruy/libruy_ctx.a
./_deps/ruy-build/ruy/libruy_wait.a
./_deps/ruy-build/ruy/libruy_allocator.a
./_deps/ruy-build/ruy/libruy_context.a
./_deps/ruy-build/ruy/libruy_kernel_avx.a
./_deps/ruy-build/ruy/libruy_prepare_packed_matrices.a
./_deps/ruy-build/ruy/libruy_pack_avx512.a
./_deps/ruy-build/ruy/libruy_kernel_arm.a
./_deps/ruy-build/ruy/libruy_denormal.a
./_deps/ruy-build/ruy/libruy_kernel_avx512.a
./_deps/ruy-build/ruy/libruy_frontend.a
./_deps/ruy-build/ruy/libruy_pack_avx.a
./_deps/ruy-build/ruy/libruy_thread_pool.a
./_deps/flatbuffers-build/libflatbuffers.a
./_deps/fft2d-build/libfft2d_fftsg2d.a
./_deps/fft2d-build/libfft2d_fftsg.a
./_deps/farmhash-build/libfarmhash.a
./_deps/clog-build/libclog.a
./_deps/abseil-cpp-build/absl/synchronization/libabsl_graphcycles_internal.a
./_deps/abseil-cpp-build/absl/synchronization/libabsl_synchronization.a
./_deps/abseil-cpp-build/absl/strings/libabsl_strings.a
./_deps/abseil-cpp-build/absl/strings/libabsl_str_format_internal.a
./_deps/abseil-cpp-build/absl/strings/libabsl_cord.a
./_deps/abseil-cpp-build/absl/strings/libabsl_strings_internal.a
./_deps/abseil-cpp-build/absl/status/libabsl_status.a
./_deps/abseil-cpp-build/absl/hash/libabsl_city.a
./_deps/abseil-cpp-build/absl/hash/libabsl_wyhash.a
./_deps/abseil-cpp-build/absl/hash/libabsl_hash.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_reflection.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_program_name.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_internal.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_private_handle_accessor.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_marshalling.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_commandlineflag_internal.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_commandlineflag.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags_config.a
./_deps/abseil-cpp-build/absl/flags/libabsl_flags.a
./_deps/abseil-cpp-build/absl/numeric/libabsl_int128.a
./_deps/abseil-cpp-build/absl/debugging/libabsl_symbolize.a
./_deps/abseil-cpp-build/absl/debugging/libabsl_debugging_internal.a
./_deps/abseil-cpp-build/absl/debugging/libabsl_demangle_internal.a
./_deps/abseil-cpp-build/absl/debugging/libabsl_stacktrace.a
./_deps/abseil-cpp-build/absl/base/libabsl_spinlock_wait.a
./_deps/abseil-cpp-build/absl/base/libabsl_raw_logging_internal.a
./_deps/abseil-cpp-build/absl/base/libabsl_malloc_internal.a
./_deps/abseil-cpp-build/absl/base/libabsl_throw_delegate.a
./_deps/abseil-cpp-build/absl/base/libabsl_exponential_biased.a
./_deps/abseil-cpp-build/absl/base/libabsl_base.a
./_deps/abseil-cpp-build/absl/base/libabsl_log_severity.a
./_deps/abseil-cpp-build/absl/time/libabsl_time_zone.a
./_deps/abseil-cpp-build/absl/time/libabsl_civil_time.a
./_deps/abseil-cpp-build/absl/time/libabsl_time.a
./_deps/abseil-cpp-build/absl/container/libabsl_hashtablez_sampler.a
./_deps/abseil-cpp-build/absl/container/libabsl_raw_hash_set.a
./_deps/abseil-cpp-build/absl/types/libabsl_bad_variant_access.a
./_deps/abseil-cpp-build/absl/types/libabsl_bad_optional_access.a
./_deps/cpuinfo-build/libcpuinfo.a

利布斯的情况似乎如下:

  1. absl:找到30个图书馆
  2. 本征:好,在标头中定义模板库。
  3. 农哈希:好的,找到了一个库
  4. fft2d:好的,找到了两个库
  5. 平面缓冲器:好的,找到一个库
  6. 好的,只有标题
  7. neon2sse:好的,只有头
  8. 卡格:好的,找到了一个图书馆
  9. cpuinfo:好的,找到了一个库
  10. ruy:找到了30个图书馆

总之,大多数库都是可以的,要么有一个库可以链接,要么库是标头的。剩下的问题是:

  • absl
  • 鲁伊

因为它们包含大约30个.a库。不知道我是不是要和所有这些联系起来?这将非常麻烦,因为我的构建系统是Meson,我正在使用目标()与TensorFlow链接。

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 13:58:52

一年后,但我亲自经历了这件事,所以我的回答是这样的。

根据我的经验(使用makefile和不使用-DTFLITE_C_BUILD_SHARED_LIBS:BOOL=OFF),执行推理的程序不需要链接到Abseil。

您需要链接到您提到的所有其他库,除了ruy_kernel_armruy_pack_arm,前提是您在x64平台上运行您的程序。(令人恼怒的是,-DTFLITE_ENABLE_RUY=OFF在构建TfLite时不受尊重,所以你被Ruy困住了)

详细步骤:

构建TfLite:

代码语言:javascript
复制
mkdir ~/my_tflite_project
cd ~/my_tflite_project/
git clone https://github.com/tensorflow/tensorflow.git tensorflow_src
mkdir tflite_build_x64
cd tflite_build_x64/
cmake ../tensorflow_src/tensorflow/lite/
    /* You may encounter two CMake messages:
    -- The Fortran compiler identification is unknown
    I believe a Fortran compiler is only necessary to build Fortran bindings for TfLite.

    -- Could NOT find CLANG_FORMAT: Found unsuitable version "0.0", but required is exact version "9" (found CLANG_FORMAT_EXECUTABLE-NOTFOUND)
    sudo apt install clang-format-9
    Annoyingly you need clang-format-9, plain clang-format (version 13, the newest) won't do. */
cmake --build . -j 4

相关的libs:

代码语言:javascript
复制
$ cd ~/my_tflite_project/tflite_build_x64
$ ls *.a
libtensorflow-lite.a
$ ls pthreadpool/*.a
pthreadpool/libpthreadpool.a
$ ls _deps/*/*.a
_deps/clog-build/libclog.a        _deps/farmhash-build/libfarmhash.a  _deps/fft2d-build/libfft2d_fftsg2d.a      _deps/xnnpack-build/libXNNPACK.a
_deps/cpuinfo-build/libcpuinfo.a  _deps/fft2d-build/libfft2d_fftsg.a  _deps/flatbuffers-build/libflatbuffers.a
$ ls _deps/ruy-build/ruy/*.a
_deps/ruy-build/ruy/libruy_allocator.a         _deps/ruy-build/ruy/libruy_ctx.a                           _deps/ruy-build/ruy/libruy_kernel_avx.a       _deps/ruy-build/ruy/libruy_prepacked_cache.a
_deps/ruy-build/ruy/libruy_apply_multiplier.a  _deps/ruy-build/ruy/libruy_denormal.a                      _deps/ruy-build/ruy/libruy_kernel_avx2_fma.a  _deps/ruy-build/ruy/libruy_prepare_packed_matrices.a
_deps/ruy-build/ruy/libruy_block_map.a         _deps/ruy-build/ruy/libruy_frontend.a                      _deps/ruy-build/ruy/libruy_kernel_avx512.a    _deps/ruy-build/ruy/libruy_system_aligned_alloc.a
_deps/ruy-build/ruy/libruy_blocking_counter.a  _deps/ruy-build/ruy/libruy_have_built_path_for_avx.a       _deps/ruy-build/ruy/libruy_pack_arm.a         _deps/ruy-build/ruy/libruy_thread_pool.a
_deps/ruy-build/ruy/libruy_context.a           _deps/ruy-build/ruy/libruy_have_built_path_for_avx2_fma.a  _deps/ruy-build/ruy/libruy_pack_avx.a         _deps/ruy-build/ruy/libruy_trmul.a
_deps/ruy-build/ruy/libruy_context_get_ctx.a   _deps/ruy-build/ruy/libruy_have_built_path_for_avx512.a    _deps/ruy-build/ruy/libruy_pack_avx2_fma.a    _deps/ruy-build/ruy/libruy_tune.a
_deps/ruy-build/ruy/libruy_cpuinfo.a           _deps/ruy-build/ruy/libruy_kernel_arm.a                    _deps/ruy-build/ruy/libruy_pack_avx512.a      _deps/ruy-build/ruy/libruy_wait.a

使用TfLite构建MWE:

代码语言:javascript
复制
$ cd ~/my_tflite_project
$ mkdir my_dev_x64
$ cd my_dev_x64/
/* Construct minimal.cpp and makefile below */
$ cat minimal.cpp
#include "tensorflow/lite/model.h"
#include "tensorflow/lite/interpreter.h"
#include "tensorflow/lite/kernels/register.h"
#include <iostream>

int main() {
    std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile("your_network_here.tflite");
    tflite::ops::builtin::BuiltinOpResolver resolver;

    std::cout "Done\n";
    return EXIT_SUCCESS;
}

$ cat makefile
COMPILER     := g++

LINKER       := g++

CXX_FILES    := minimal.cpp

OBJ_FILES    := $(CXX_FILES:.cpp=.o)

EXE_FILE     := app

INCLUDE_DIRS := -I../tensorflow_src -I../tflite_build_x64/flatbuffers/include

LIB_DIRS     := \
        -L../tflite_build_x64 \
        -L../tflite_build_x64/_deps/fft2d-build \
        -L../tflite_build_x64/_deps/flatbuffers-build \
        -L../tflite_build_x64/_deps/ruy-build/ruy \
        -L../tflite_build_x64/_deps/farmhash-build \
        -L../tflite_build_x64/_deps/xnnpack-build \
        -L../tflite_build_x64/_deps/cpuinfo-build \
        -L../tflite_build_x64/_deps/clog-build \
        -L../tflite_build_x64/pthreadpool

LIBS         := \
        -ltensorflow-lite \
        -lfft2d_fftsg \
        -lfft2d_fftsg2d \
        -lflatbuffers \
        -lruy_ctx \
        -lruy_allocator \
        -lruy_frontend \
        -lruy_context_get_ctx \
        -lruy_context \
        -lruy_apply_multiplier \
        -lruy_prepacked_cache \
        -lruy_tune \
        -lruy_cpuinfo \
        -lruy_system_aligned_alloc \
        -lruy_prepare_packed_matrices \
        -lruy_trmul \
        -lruy_block_map \
        -lruy_denormal \
        -lruy_thread_pool \
        -lruy_blocking_counter \
        -lruy_wait \
        -lruy_kernel_avx \
        -lruy_kernel_avx2_fma \
        -lruy_kernel_avx512 \
        -lruy_pack_avx \
        -lruy_pack_avx2_fma \
        -lruy_pack_avx512 \
        -lruy_have_built_path_for_avx \
        -lruy_have_built_path_for_avx2_fma \
        -lruy_have_built_path_for_avx512 \
        -lfarmhash \
        -lXNNPACK \
        -lpthreadpool \
        -lcpuinfo \
        -lclog

CXX_FLAGS    := -Wall #-pedantic

LINK_FLAGS   :=

#Do not print the output of the commands
.SILENT:

#Phony targets do not represent actual files, so files with the following names are ignored
.PHONY: clean depend

#Link object files to form an executable file
$(EXE_FILE): $(OBJ_FILES)
        $(LINKER) $(LINK_FLAGS) $(OBJ_FILES) -o $(EXE_FILE) $(LIB_DIRS) $(LIBS)

#Compile cpp files to object files
%.o: %.cpp
        $(COMPILER) $(CXX_FLAGS) $(INCLUDE_DIRS) -c $<

#Remove object files, executable, and possible linkinfo files
clean:
        -rm -f $(OBJ_FILES) $(EXE_FILE)

#Generate dependency file
depend:
        $(COMPILER) $(CXX_FLAGS) $(INCLUDE_DIRS) -MM $(CXX_FILES) > make.dep

#Include dependency file
-include make.dep

建立和运行MWE:

代码语言:javascript
复制
$ cd ~/my_tflite_project/my_dev_x64
$ make
$ ./app
Done

希望这能帮助您或其他可怜的家伙让TfLite C++工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71556391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档