Мне нужно собрать 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
Это? Я думал, что файлы .dylib - это динамические библиотеки? Я хотел бы скомпилировать файл .a, поскольку проект, который я создаю, не может объединять динамические библиотеки, такие как .dylib или .dll, как в случае с Windows. Похоже, что в версию для Windows включен файл .lib, но мне нужно, чтобы он работал на MacOS с архитектурой arm64, у которой нет ночной сборки.
Python Lib — это .pdb, Window lib — .dll, C++ — .cpp, .h, следуя инструкциям, уже имел MacOS, я также работаю в Native Windows 10 (скомпилирован из исходников). Работая с функциями, вам необходимо создать среду, которая работает с ними, когда они пытаются работать с AVX или AVX2, а также с функциями ЦП или ГП, пожалуйста, найдите эти инструкции.
Статическая библиотека в Linux — это файл .a, в Windows — файл .lib, а в MacOS — файл .a. Вы, очевидно, понятия не имеете, о чем говорите здесь.
В ссылке я отвечаю в комментарии, потому что использую родную Windows 10, но они предоставили исходники, где вы можете создать соответствующую среду и самостоятельно скомпилировать программу, как я.
Ах я вижу! Проблема в том, что bazel не поддерживает создание статических библиотек из исходного кода. Но я построил его из исходного кода, как указано в моем «частичном решении».
Это то же самое, что вы загружаете исходный код C++. В Windows я использовал VSCode, следуйте инструкциям.
Действительно, на данный момент нет никакой поддержки для создания статической библиотеки для Tensorflow C-API. Это связано с тем, что bazel является инструментом сборки. На момент написания bazel не поддерживает написание статических библиотек:
https://github.com/bazelbuild/bazel/issues/1920
Это было проблемой в течение достаточно долгого времени, и это также причина, по которой весь C-API не может быть собран в виде статической библиотеки на данный момент.
Но есть способ обойти это. Вы можете собрать Tensorflow lite как статическую библиотеку с помощью Cmake
, которую можно найти здесь, в репозитории Tensorflow git:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite
Я также нашел эту тему очень полезной: Статическая библиотека C API TensorFlow — как связать с 10 зависимостями?
После сборки вам также потребуется включить в свой проект библиотеку Google flatbuffer (которую вы, конечно, также можете включить в свою статическую библиотеку): https://github.com/google/flatbuffers
TFlite может запускать большинство моделей и работает даже с самыми сложными моделями, которые я построил. Так что на данный момент это лучший способ заставить Tensorflow работать как статическая библиотека. Для получения дополнительной информации о TFLite см.: https://www.tensorflow.org/lite
Это статическая библиотека, вы можете копировать и запускать ее в подходящей среде с правильными разрешениями. (Я также перекомпилировал с использованием кода VS в Windows 10) tensorflow.org/install/lang_c#build_from_source