Tensorflow Lite
Если вы используете Tensorflow Lite, единственное решение, которое я нашел , - это работать на уровне Interpreter
и настраивать библиотеку ядра (OpResolver
).Я не думаю, что есть автоматический способ сделать это, и единственный доступный пример (здесь заголовок) не так легко понять, ИМХО.Я думаю, что дополнительные улучшения по этой теме будут включены в следующие выпуски.Кроме того, Я не уверен, что это уменьшит размер конечной библиотеки .В примечаниях API этот подход считается эквивалентным выборочной регистрации , что объясняется в следующей части ответа для Tensorflow Mobile.
Tensorflow Mobile
Какответ на вопрос «Как включить только операции, используемые моей моделью», ответ в Мобильная документация Tensorflow (в подразделе Binary Size).
Обычный размер для TensorflowМобильный, кажется, 12 МБ, но его можно уменьшить, включив только требуемые модели.Очевидно, что для этого требуется построить Tensorflow Lite в качестве платформы с использованием Bazel.
Вы можете создать заголовок требуемых операций (ops_to_register.h
), используя инструмент print_selective_registration_header.py
, который доступен здесь .Сгенерированный заголовок должен быть помещен в корень директории с исходным кодом Tensorflow.Теперь вы готовы скомпилировать библиотеку, передав компилятору определение SELECTIVE_REGISTRATION
(при сборке с Bazel вы должны добавить опцию: --copts=”-DSELECTIVE_REGISTRATION”
).
Я думаю, что эта процедура даст библиотеке минимумопс внутри.Некоторые другие флаги оптимизации компилятора могут помочь вам с размером (иногда снижающим производительность).
Параметры компиляции
Я на самом деле не знаю, как вы компилируете свой код (статическая или динамическая библиотека), которые вам нужны с точки зрения производительности, и которые являются параметрами по умолчанию в Tensorflow bazelfile, но вы можете попробовать:
- , чтобы уменьшить оптимизацию до
-O1
или -Os
(иногда помогаетразмер двоичного файла, и я думаю, что по умолчанию для Tensorflow -O2
для платформы и -O3
для отдельных ядер, хотя я не знаю, для облегченной версии). - использовать флаги
-fdata-section
и --gc-sections
: цитирование gcc
документации: «[-fdata-sections
] Вместе со сборщиком мусора (опция линкера --gc-sections
) эти опции могут привести к уменьшению статически связанных исполняемых файлов (после удаления)."(Похоже, что по крайней мере --gc-sections
используется в опциях компоновщика для Raspberry Pi ) -fvisibility-inlines-hidden
должно влиять на производительность встроенных функций, но уменьшает размер таблицы экспортаобщий объект.Эта опция может сломать библиотеку.Некоторые объяснения можно прочитать здесь . - Еще более опасно
-fvisibility=hidden
.Посмотрите на это здесь .