Почему python многопоточность замедляет время вывода для более быстрого R-CNN - PullRequest
0 голосов
/ 12 февраля 2020

Я работаю над системой отслеживания трафика c, которая анализирует видео, которое уже собрано. Я использую opencv, threading, pytorch и dectron2. Чтобы ускорить захват кадров из opencv, я решил использовать поток, который запускает все oop, заполняя очередь кадрами, как показано в этом блоге . После реализации этого я могу получить доступ к кадрам так же быстро, как и остальная часть моего конвейера обработки go, поэтому никаких проблем нет. Проблема возникает, когда я делаю вывод (просто прямой проход через модель Faster R-CNN) на кадрах, что занимает более 5 секунд по сравнению с 0,11 в прошлом. Мой графический процессор используется, и мой процессор недостаточно загружен. Что может вызвать это?

1 Ответ

1 голос
/ 12 февраля 2020

CPython имеет глобальную блокировку интерпретатора. Это означает, что интерпретатор имеет большую блокировку, которая предотвращает одновременную оценку байт-кода Python из нескольких потоков.

Пакеты, реализованные в C и обеспечивающие доступ к операциям высокого уровня, часто могут освобождать GIL при запуске , но если ваш код обработки в основном состоит только из Python и привязан к процессору, вы не получите никакого ускорения от многопоточности: у вас будут потоки, сражающиеся друг с другом, но ваша обработка в итоге будет полностью последовательной из-за GIL.

В этом случае вам нужно многопроцессорная обработка для получения ускорений, GIL является для каждого интерпретатора, поэтому отдельные интерпретаторы в отдельных процессах не мешают друг другу. Стоимость связи / синхронизации еще выше.

...