Есть ли у кого-нибудь опыт создания статической библиотеки для API Tensorflow C++?

Мне нужно собрать 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

Это статическая библиотека, вы можете копировать и запускать ее в подходящей среде с правильными разрешениями. (Я также перекомпилировал с использованием кода VS в Windows 10) tensorflow.org/install/lang_c#build_from_source

Jirayu Kaewprateep 16.11.2022 16:10

Это? Я думал, что файлы .dylib - это динамические библиотеки? Я хотел бы скомпилировать файл .a, поскольку проект, который я создаю, не может объединять динамические библиотеки, такие как .dylib или .dll, как в случае с Windows. Похоже, что в версию для Windows включен файл .lib, но мне нужно, чтобы он работал на MacOS с архитектурой arm64, у которой нет ночной сборки.

Maxxxxxx 16.11.2022 17:09

Python Lib — это .pdb, Window lib — .dll, C++ — .cpp, .h, следуя инструкциям, уже имел MacOS, я также работаю в Native Windows 10 (скомпилирован из исходников). Работая с функциями, вам необходимо создать среду, которая работает с ними, когда они пытаются работать с AVX или AVX2, а также с функциями ЦП или ГП, пожалуйста, найдите эти инструкции.

Jirayu Kaewprateep 17.11.2022 06:54

Статическая библиотека в Linux — это файл .a, в Windows — файл .lib, а в MacOS — файл .a. Вы, очевидно, понятия не имеете, о чем говорите здесь.

Maxxxxxx 17.11.2022 11:09

В ссылке я отвечаю в комментарии, потому что использую родную Windows 10, но они предоставили исходники, где вы можете создать соответствующую среду и самостоятельно скомпилировать программу, как я.

Jirayu Kaewprateep 18.11.2022 13:06

Ах я вижу! Проблема в том, что bazel не поддерживает создание статических библиотек из исходного кода. Но я построил его из исходного кода, как указано в моем «частичном решении».

Maxxxxxx 18.11.2022 14:53

Это то же самое, что вы загружаете исходный код C++. В Windows я использовал VSCode, следуйте инструкциям.

Jirayu Kaewprateep 19.11.2022 23:34
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
0
7
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Действительно, на данный момент нет никакой поддержки для создания статической библиотеки для 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

Другие вопросы по теме

Как добавить общую или статическую библиотеку с помощью расширения PyTorch C++?
Можно ли указать относительный путь к макросу __FILE__, если статическая библиотека построена с помощью GCC и CMake?
Нужно ли включать shebang #!/bin/bash в заголовочный файл?
Могу ли я найти все файлы .c, скомпилировать их и создать из них статическую библиотеку одновременно?
Как убедиться, что статическая библиотека и приложение скомпилированы одинаково?
Являются ли доморощенные пакеты статическими библиотеками или динамическими?
Каков хороший метод для обнаружения несоответствия препроцессорных определений между библиотечным кодом и пользовательским кодом во время компиляции?
В чем разница между использованием ar -rc и libtool?
Boost.DLL не может найти символы в исполняемом файле, используя статически связанную библиотеку
Как связать библиотеку `.lib` из другого решения в Visual Studio 2019?