Вчера (8.11.2023) мы выпустили релиз фреймворка компьютерного зрения Savant с номером 0.2.6. Этот выпуск включает в себя множество исправлений ошибок, семь новых демонстрационных пайплайнов и ряд других улучшений, включая документацию, улучшения производительности и поддержку Nvidia Jetson Orin Nano.

Savant пересек отметку в 300 звезд на GitHub, и Discord наконец-то стал более активен, что нас сильно радует. Работа над релизом заняла 1.5 месяца. В следующих разделах мы подробно рассмотрим основные части релиза.

Что такое Savant

Savant - это высокоуровневый фреймворк с открытым кодом для построения пайплайнов компьютерного зрения и видеоаналитики на базе Nvidia DeepStream SDK. Фреймворк фокусируется на готовности для продуктива и одинаковой работе на широком спектре оборудования Nvidia. Возможно, вы захотите узнать подробнее о преимуществах фреймворка - можно прочитать статью на английском.

Если коротко, Savant быстрее PyTorch и OpenCV CUDA и проще DeepStream. Кроме того, вы можете использовать в Savant PyTorch, OpenCV CUDA, CuPy, если вас устраивает пониженная производительность, но хочется переносить готовые пайплайны.

Чем примечателен текущий релиз

Данный релиз фокусируется на двух основных блоках задач:

  • исправление ошибок, обнаруженных в 0.2.5;

  • улучшения, направленные на работу с видео-данными на GPU без поддержки NVENC.

Релиз 0.2.5 пошел в продуктив у ряда пользователей, в результате нам навалили багов (чему мы сильно рады), которые на наших сэмплах ранее не проявлялись - в итоге мы исправили 22 бага разной степени серьезности: начиная от защищающих от стрельбы в ноги и заканчивая "ничего не работает".

Что такое NVENC

NVENC - аппаратный кодировщик видео, выделенный блок на dGPU Nvidia и их устройствах Nvidia Jetson. Это самый эффективный способ кодировать видео - фреймы кодируются прямо из памяти GPU без переноса их в память CPU и без участия процессора. К сожалению, Nvidia решила выпускать ряд устройств с обрезанным NVENC, а часть устройств вообще без NVENC, например:

  • GeForce, NVENC есть, но максимум 5 одновременно кодируемых потоков, а раньше было вообще 3 (видимо, по просьбе геймеров подняли);

  • V100/A100/H100/A30 - вообще нет NVENC;

  • Jetson Orin Nano - вообще нет NVENC (на предыдущем Nano был).

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

Как мы раньше жили

Экосистема Savant считает, что для целей компьютерного зрения NVDEC и NVENC бесплатны. Под "бесплатны" понимается то, что они работают всегда быстрее чем работает инференс, поэтому можно без замороча декодировать видео в начале пайплайна и кодировать видео в конце и это никак на производительность не влияет.

Поскольку V100/A100/H100 для инференса видео и компьютерного зрения редко используется, мы фокусировались на T4/A10 и серии Quadro (RTX N000, RTX AN000), а так же устройствах Nvidia Jetson Xavier (NX, AGX).

Однако, к пользователям приходят A30 и Jetson Orin Nano, без NVENC. Nvidia говорит - кодируйте на CPU, если надо. Однако, проблема в том, что передача сырых фреймов между памятью GPU и CPU - это реальный joy killer, поскольку производительность падает очень сильно.

Например, представим себе FullHD RGBA фрейм с цветом 8 бит: 1920 x 1280 x 4 = 9.37 MB. Это один фрейм, если мы хотим обрабатывать 1000 FPS, что вполне себе реально на современных GPU для инференса, то мы приходим к 9.37 GB/sec передачу по PCI-E в одну сторону. А если еще обратно надо передать, то это еще 9.37 GB/sec. В общем, не каждая PCI-E уже протянет. При этом, внимание, ResNet-50 (int8) на Nvidia A10 может работать на скорости около 5000 FPS. В общем, без NVDEC/NVENC никак.

А теперь, с приходом A30, Orin Nano, или V100/A100/H100 обратный перенос фреймов из видеопамяти в CPU для кодирования (если требуется) стал очень дорогим.

А зачем кодировать вывод в системах компьютерного зрения?

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

Для тех случаев, когда кодировать не надо, мы реализовали в этом релизе функцию Video Pass-Through. Теперь Savant пропускает исходное кодированное видео и аугментирует его метаданными. Само собой, что в случае такой настройки ничего нарисовать на кадре нельзя.

Если же хочется все же кодировать на устройствах без NVENC, у нас есть программный энкодер, стандартный для экосистемы GStreamer. С ним можно рисовать на фреймах и видеть результат. Для целей разработки подойдет, для продуктива - сомнительное решение. Лучше вынести отрисовку на отдельное устройство, тем более, что Savant позволяет соединять пайплайны по сети в цепочку с помощью протокола на базе Rkyv и ZeroMQ или Kafka.

Декодировать все еще надо, само собой, однако, NVDEC идет во всех устройствах NVIDIA и он реально "бесплатный" для задач инференса видео.

Что еще в релизе для устройств без NVENC?

Always-On RTSP Sink Adapter. У нас в Savant есть классный RTSP-адаптер Always-On RTSP. Чем он хорош, так этом тем, что позволяет выводить RTSP-поток независимо от того, есть к нему входящий поток или нет: если поток умер, выводится stub, как на картинке ниже (можно свой подставить).

Этот адаптер так же реализован на базе NVDEC/NVENC и "бесплатный" для правильных GPU. Однако, пользователи используют разные GPU и Jetson Orin Nano, поэтому в релизе мы сделали возможным работу данного адаптера с помощью CPU-кодеков. Особо с производительностью не работали - пока позиционируем как инструмент для разработки, но не продуктива.

Kafka/Redis Sink Adapter. Этот адаптер в режиме Pass-through теперь поддерживает дедупликацию видео-данных. Для выходного потока видео не загружается в KVS заново (если настроено), а используется ссылка на предыдущий хранимый элемент - только TTL может исправляться. Если же используется только Kafka (без Redis), видео всегда складывается в Kafka.

Это самые значимые функциональные фичи релиза.

Демки и сэмплы

Всего в Savant 22 демки на все случаи жизни (детекция, классификация, сегментирование, архитектурные, утилитарные). В этом релизе мы сделали семь новых демок. Вот что мы сделали.

Сэмпл про распознавание номеров машин. Использует модели YOLOV8, NGC LicensePlateDetector, NGC LicensePlateRecognition. Модели LPD/LPR заточены под американские номера, поэтом на армянских косячат - нужно дообучение. Однако, несколько людей одновременно начали создавать с помощью Savant нечто подобное, поэтому мы решили сделать такой сэмпл. Подробнее о сэмпле здесь.

GitHub

E2E производительность (с рисовкой на фреймах):

  • 92 FPS on Nvidia A4000;

  • 25 FPS on Jetson NX.

Person body keypoints detection. Классический сэмпл про определение и отрисовку суставных точек. Используется YOLOV8N-POSE. Можно использовать как базу для реализации распознования действий. Подробнее о сэмпле здесь.

GitHub

E2E производительность (с рисовкой на фреймах):

  • 178 FPS on Nvidia A4000

  • 56 FPS on Jetson NX

  • 67 FPS on Jetson Orin Nano

Advanced traffic meter sample. Трекает машины по направлениям на сложном участке дороги (перекресток), результаты складывает в Grafana, где их можно смотреть (с минимальными допилами можно делать госконтракты на мониторинг трафика, не благодарите; товарищи из Индии собрали на базе этого за пару недель e2e систему для мониторинга трафика и измерения скорости). Сделан на базе YOLOV8M. Подробнее здесь.

GitHub

E2E производительность (с рисовкой на фреймах):

  • 93 FPS on Nvidia A4000

  • 21 FPS on Jetson NX

Object counting by areas. Простенькая демка для начинающих, кто хочет считать очереди всякие и прочую толпу (тоже понравится любителям госконтрактов и прочих искателей дешевой популярности). Сделана на NGC PeopleNet.

GitHub

E2E производительность (с рисовкой на фреймах):

  • 116 FPS on Nvidia A4000

  • 30 FPS on Jetson NX

Странные демки. Более того, мы сможем их оптимизировать только в следующем релизе, пока что sub-optimal. Они показывают как вы можете применять Savant иначе.

Video super-resolution. Делаем апскейлинг с NinaSR. Эта демка появилась потому что мы никогда раньше не игрались с апскейлом, вот решили поиграться. Делает x3 увеличение.

GitHub

Разница на глаз не очень заметна, но тут уж претензии к NinaSR. В чем проблема с этой демкой? Фреймы копируются в CPU внутри пайплайна - это некрасиво и неоптимально. Мы сейчас делаем интеграцию с CuPy и доступ к сырым тензором после Nvinfer - когда сделаем, улучшим.

E2E производительность (с рисовкой на фреймах):

  • 49 FPS on Nvidia A4000

AnimeGANv2 demo. Это еще одна "странная" демка для подурачиться (импортозамещение с такой не сделаешь), которая генерирует видео в стиле Хаяо Миядзаки по вашему обычному видео.

GitHub

E2E производительность (с рисовкой на фреймах):

  • 4 FPS on Nvidia A4000

Архитектурная демка для video pass-through. Демка показывает как соединить гуськом несколько пайплайнов, например, для реализации архитектуры обработки, включающей как edge так и дата-центр, разнеся вычисления между узлами с использованием Video pass-through.

GitHub

А вот скорость некоторых из сэмплов без отрисовки. Результаты получены с помощью системы бенчмаркинга Savant, можно воспроизвести на своем железе.

Демонстрация работы с Etcd

В Savant можно динамически реконфигурировать пайплайны с помощью Etcd. Мы улучшили демку, показывающую условную обработку потока так, что теперь она позволяет еще модифицировать поведение обработки через Etcd.

GitHub

Что будет в следующем релизе

В 0.2.7 мы планируем:

  • представить новый строительный блок - дисковый буффер, для тех, кто не хочет морочиться с адаптером Kafka/Redis, но хочет нормально переживать берсты, чтобы адаптеры доступа к потокам видео реального времени не страдали (RTSP, USB/CSI, GigE Vision);

  • попробуем реализовать новый инференс блок, основанный на чистом TensorRT с полностью управляемым pre/post-процессингом (нужно для ВИ типа Super-resolution, AnimeGANv2);

  • сделаем интеграцию и покажем как использовать PyTorch GPU inference в Savant;

  • сделаем интеграцию с CuPy.

Заключение

Если вам понравился Savant и вы хотите поддержать нашу команду, поставьте нам ⭐ на GitHub. У нас есть документация и Discord (eng) - мы помогаем начинающим со всей силы.

Еще, нас можно нанять на обучение моделей, разработку пайплайнов, оптимизацию инференса и прочие задачи компьютерного зрения.

Комментарии (0)