Почему такая низкая скорость прогнозирования 25 - 40 [сек / 1] при использовании более быстрого RCNN для пользовательского обнаружения объектов на графическом процессоре? - PullRequest
0 голосов
/ 04 июня 2018

Я обучил faster_rcnn_inception_resnet_v2_atrous_coco модель (доступно здесь ) для Обнаружения пользовательского объекта.

Для прогноза я использовал демонстрацию обнаружения объектов файл ноутбука jupyter на своих изображениях.Также проверил время, затрачиваемое на каждый шаг, и обнаружил, что sess.run занимало все время.

Но для прогнозирования требуется около 25-40 [сек].изображение размером (3000 x 2000) пикселей (около 1-2 [МБ]) на графическом процессоре.

Может кто-нибудь выяснить проблему здесь?

У меня естьвыполнено профилирование, ссылка для загрузки файл профилирования

ссылка на полное профилирование

Системная информация:
Обучение иПрогноз на Виртуальная машина , созданная на Портал Azure с Standard_NV6 (подробности здесь ), который использует NVIDIA Tesla M60 GPU

  • Платформа и дистрибутив ОС - Windows 10
  • Установленный TensorFlow из - Использование pip pip3 install --upgrade tensorflow-gpu
  • Версия TensorFlow - 1.8.0
  • версия Python - 3.6.5
  • GPU / CPU - GPU
  • версия CUDA / cuDNN - CUDA 9/ cuDNN 7

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

TensorFlow занимает много времени для начальной настройки.(Не волнуйтесь. Это всего лишь один раз).

Загрузка графика - сложный процесс.Я выполнил этот код в моем процессоре.Для завершения программы потребовалось почти 40 секунд.

Время, необходимое для начальной настройки, такой как загрузка графика, составило 37 секунд.

Фактическое время, необходимое для обнаружения объекта, составило 3 секунды, т.е.1,5 секунды на изображение.

Если бы я дал 100 изображений, то общее время съемки составило бы 37 + 1,5 * 100. Мне не нужно загружать график 100 раз.

Так что в вашем случае, если этопотребовалось 25 [с], тогда начальная установка заняла бы ~ 23-24 [с].Фактическое время должно быть ~ 1-2 [с].

Вы можете проверить это в коде.Может использовать модуль time в python:

import time                          # used to obtain time stamps

for image_path in TEST_IMAGE_PATHS:  # iteration of images for detection
    # ------------------------------ # begins here
    start = time.time()              # saving current timestamp
    ...
    ...
    ...
    plt.imshow( image_np )
    # ------------------------------ # processing one image ends here

print( 'Time taken',
        time.time() - start          # calculating the time it has taken
        )
0 голосов
/ 10 июня 2018

Как говорится на веб-сайте, размер изображения должен составлять 600x600 , а код запускался на карте Nvidia GeForce GTX TITAN X.Но сначала , пожалуйста, убедитесь, что ваш код действительно работает на GPU и не на CPU .Я предлагаю запустить ваш код и открыть другое окно, чтобы увидеть использование графического процессора с помощью команды ниже и посмотреть, если что-то изменится.

watch nvidia-smi
0 голосов
/ 13 июня 2018

Может ли кто-нибудь выяснить проблему здесь?

Извините за то, что вы здесь зверски открыты и честны
на
где основная причина наблюдаемой проблемы с производительностью:

Невозможно найти худшую VM-настройку из портфеля Azure для таких вычислительно интенсивных (производительность- и -производительность мотивированы) задача.Просто не смог - для этого в меню нет «менее» оснащенной опции.

Azure NV6 явно продается для пользы пользователей виртуальных рабочих столов , гдеДрайвер NVidia GRID (R) предоставляет программный уровень сервисов для «совместного использования» частей также виртуализированного FrameBuffer для совместного использования изображения / видео (пиксели настольной графики, макс. SP endecs),среди групп пользователей, независимо от их оконечного устройства (пока не более 15 пользователей на любой из двух встроенных графических процессоров, для которых это было специально объявлено и рекламировано в Azure как ключевой пункт продажи. NVidia даже является отчимом, явно рекламируя это устройство для (cit.) Office Users ).

M60 не хватает (, очевидно, как определено таким образом для совершенно другого сегмента рынка) любые интеллектуальные функции обработки AI / ML / DL / Tensor , имеющие ~ 20x ниже DP производительность ,чем специализированные вычислительные устройства на базе графических процессоров AI / ML / DL / Tensor.

enter image description here

Если позволите,

... " GRID " - это программный компонент , который перекрывает заданный набор Тесла (в настоящее время M10, M6, M60 ) (и ранее Quadro (K1 / K2)) графические процессоры.В самой простой форме (если можно так назвать) программное обеспечение GRID в настоящее время предназначено для создания профилей FrameBuffer при использовании графических процессоров в режиме «Графика» , что позволяет пользователям совместно использовать часть графических процессоров FrameBuffer.при обращении к одному и тому же физическому графическому процессору.

и

Нет, M10, M6 и M60 равны не специально подходит для ИИ.Однако они будут работать , просто не так эффективно , как другие графические процессоры.NVIDIA создает специальные графические процессоры для определенных рабочих нагрузок и областей применения (технологических), поскольку каждая область предъявляет различные требования. (кредиты идут в BJones)

Далее,
, еслидействительно готовы потратить усилия на этот априори известный худший вариант а ля карт:

убедитесь, что оба графических процессора в режиме "Compute" , НЕ "Графика" , если вы играете с ИИ.Вы можете сделать это с помощью утилиты загрузки Linux, которую вы получите с правильным пакетом драйверов M60 после того, как зарегистрируетесь для оценки. (кредиты снова отправляются в BJones)

, который, очевидно, не имеет такой возможности для устройств виртуализированного доступа, не поддерживающих Linux / Azure.


Резюме:

Если вы стремитесь к повышению производительности - и - через пропускную способность, лучше выберите другое, GPU-устройство с поддержкой обработки AI / ML / DL / Tensor, где были размещены оба проблемных вычислительно-аппаратных ресурса и отсутствуют программные уровни (нет GRID или, по крайней мере, легко доступна опция отключения), что в каком-то смысле блокирует достижениетакие продвинутые уровни производительности GPU-обработки.

0 голосов
/ 08 июня 2018

Естественно, что для больших изображений требуется больше времени.Обнаружение объекта Tensorflow хорошо работает даже при более низких разрешениях, таких как 400 * 400.

Возьмите копию исходного изображения, измените ее размер до более низкого разрешения, чтобы выполнить обнаружение объекта.Вы получите ограничивающую коробку.Теперь вычислите соответствующие координаты ограничительной рамки для вашего исходного изображения с более высоким разрешением.Нарисуйте ограничительную рамку на исходном изображении.

т.е.

Представьте, что у вас есть изображение 3000 * 2000, сделайте его копию и измените его размер до 300 * 200.Выполняя обнаружение объекта на изображении с измененным размером, обнаружил объект с ограничительной рамкой (50, 100, 150, 150), т. Е. (Ymin, xmin, ymax, xmax)

Теперь соответствующие координаты прямоугольника для большего исходного изображения будут (500,1000,1500), 1500). Нарисуйте прямоугольник на нем.

Выполните обнаружение на небольшом изображении, затем нарисуйте ограничительную рамку на исходном изображении. Производительность будет значительно улучшена.

Примечание: поддержка TensorFlowнормализованные кординаты.

т.е. если у вас есть изображение с высотой 100 и ymin = 50, то нормализованный ymin равен 0,5.Вы можете отобразить нормализованные кординаты на изображение любого размера, просто умножив их на высоту или ширину для у и х кординатов соответственно.

Я предлагаю использовать OpenCV (cv2) для всей обработки изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...