Faster RCNN Tensorflow, TenssorRT в Windows
При тестировании моделей для детектирования объектов faster rcnn (TensorFlow object detection) под Windows было обнаружено, что работа модели на карте RTX 2080 Super почти в 2 раза медленнее, чем в Linux.
38 ms против 20 ms. Причём запуск из Питона или Си - роли не играл. Блуждая по просторам Интернета, был выяснен подозреваемый - драйверная модель WDDM.
На платформе Windows графический процессор NVIDIA имеет два режима: WDDM и TCC. WDDM - это графический драйвер для видеокарт, позволяющий отображать рабочие столы и приложения. Если установленный графический процессор используется только для вычислений, рендеринг дисплея бесполезен. В этой ситуации графический процессор NVIDIA может переключиться в режим, ориентированный только на вычисления. Этот режим известен как режим TCC.
В режиме TCC можно добиться той же скорости, что и в Linux, но не с нашей видеокартой.
Таким образом ускорить работу модели можно было только с помощью TensorRT. Однако даже в Python модуле TensorFlow для Windows нет поддержки TensorRT. Вопрос можно было решить только через C++ версию. Но TensorRT не принимает граф от TensorFlow.
И хотя есть утилита для конвертирования модели из TensorFlow в UFF, которую потом можно загрузить в TensorRT, оказалось, что на модели faster rcnn она возвращала ошибки - не могла конвертировать ряд слоев. При этом на форуме NVIDIA сами разработчики признавали, что такая проблема есть и рекомендовали использовать свой фреймворк для обучения NVIDIA Transfer Learning Toolkit:
https://developer.nvidia.com/transfer-learning-toolkit
Собственно, поскольку данные были размечены и их только надо было преобразовать в другой формат, то это было сделано, после чего обучилась модель, из которой можно было сконвертировать engine файл для TensorRT. Этот файл и является достаточным для работы в Windows (правда для конкретного семейства видеокарт).
Для запуска модели можно было использовать их пример sampleUffFasterRCNN с некоторыми изменениями. Так пришлось поменять названия входных и выходных слоев:
params.inputNodeName = "input_image";
params.outputClsName = "dense_class_td/Softmax";
params.outputRegName = "dense_regress_td/BiasAdd";
params.outputProposalName = "proposal";
И изменить количество объектов в params.classNames. Ну и добавить блоки для измерения времени.
Запускал пример я так:
sample_uff_faster_rcnn.exe -f -W 512 -H 512 -B 1 -I 0000044985.ppm -l trt.fp16.engine -d F:\tensorrt\TensorRT-7.0.0.11\bin -r 100
Скорость работы на модели float16 составил 11 ms, что больше чем в 3 раза быстрее, чем модель Tensorflow в Windows.
Модель int8 вообще отрабатывала за 6.8 ms