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.

https://subscription.packtpub.com/book/programming/9781788996242/app01/app01sec02/wddm-tcc-mode-in-windows

В режиме 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