Почему TensorFlow Lite медленнее, чем TensorFlow для ПК?

В настоящее время я работаю над сверхразрешением одного изображения, и мне удалось заморозить существующий файл контрольной точки и преобразовать его в tenorflow lite. Однако при выполнении логического вывода с использованием файла .tflite время, необходимое для повышения дискретизации одного изображения, как минимум в 4 раза больше, чем при восстановлении модели с использованием файла .ckpt.

Вывод с использованием файла .ckpt выполняется с помощью session.run (), в то время как вывод с использованием файла .tflite выполняется с помощью интерпретатора.invoke (). Обе операции выполнялись на виртуальной машине Ubuntu 18, работающей на обычном ПК.

Чтобы узнать больше об этой проблеме, я запустил top в отдельном терминале, чтобы увидеть коэффициент использования ЦП при выполнении любой из операций. Уровень использования достигает 270% с файлом .ckpt, но остается примерно на уровне 100% с файлом .tflite.

interpreter.set_tensor(input_details[0]['index'], input_image_reshaped)
interpreter.set_tensor(input_details[1]['index'], input_bicubic_image_reshaped)
start = time.time()
interpreter.invoke()
end = time.time()

vs

y = self.sess.run(self.y_, feed_dict={self.x: image.reshape(1, image.shape[0], image.shape[1], ch), self.x2: bicubic_image.reshape(1, self.scale * image.shape[0], self.scale * image.shape[1], ch), self.dropout: 1.0, self.is_training: 0})

Одна гипотеза состоит в том, что tensorflow lite не настроен для многопоточности, а другая - что tenorflow lite оптимизирован для процессоров ARM (а не для процессоров Intel, на которых работает мой компьютер), и поэтому он медленнее. Однако я не могу сказать наверняка и не знаю, как отследить корень проблемы - надеюсь, кто-то будет более осведомлен об этом?


person tehtea    schedule 08.01.2019    source источник


Ответы (1)


Да, текущие операционные ядра TensorFlow Lite оптимизированы для процессора ARM (с использованием набора инструкций NEON). Если SSE доступен, он попытается использовать NEON_2_SSE для адаптации вызовов NEON к SSE, поэтому он должен по-прежнему работать с какой-то SIMD. Однако мы не приложили больших усилий для оптимизации этого пути кода.

По поводу количества потоков. В C ++ API есть функция SetNumThreads, но он не представлен в Python API (пока). Если он не установлен, базовая реализация может попытаться проверить количество доступных ядер. Если вы создадите код самостоятельно, вы можете попробовать изменить значение и посмотреть, не повлияет ли это на результат.

Надеюсь, это поможет.

person miaout17    schedule 10.01.2019
comment
Да, это очень помогло, спасибо за исчерпывающий ответ на вопрос! - person tehtea; 15.01.2019
comment
Не могли бы вы поделиться своим опытом, работает ли SSD Mobilenet в реальном времени на средне мощных устройствах Android или нет, то есть с каким количеством кадров в секунду он может работать (после использования версии tflite)? Я не могу найти эту информацию, и, следовательно, я не уверен, было бы правильно потратить время на создание таких приложений для обнаружения объектов для Android, которые требуют ответа в реальном времени. - person hafiz031; 24.10.2020
comment
@ hafiz031 не отвечает, но из того, что я обнаружил до сих пор, SSD Mobilenet будет работать со скоростью от 2 до 3 кадров в секунду на среднем устройстве Android с входом 224x224. Вы можете дважды проверить это, используя пример приложения, предоставленный Google! github.com/tensorflow/examples/blob/ мастер / lite / examples / - person tehtea; 27.10.2020