Мы рады представить вам новую версию Savant - 0.2.5. Мы работали над этим релизом более 2,5 месяцев. Он содержит значительные изменения, новые возможности и исправления ошибок в нескольких областях, но в первую очередь мы улучшили возможности для разработчиков и варианты развертывания.
Полезные ссылки:
GitHub: https://github.com/insight-platform/Savant/
Website: https://savant-ai.io/
Присоединяйтесь к Discord, наш аккаунт в X
Документация
Начнем с самых интересных улучшений, которыми мы хотим поделиться.
DeepStream 6.3
Компания Nvidia выпустила новый пакет DeepStream SDK - 6.3. Savant 0.2.5 основан на этом релизе. DeepStream 6.3 содержит несколько исправлений, которые мы хотели интегрировать в Savant, поэтому мы перешли с версии 6.2 на 6.3:
Проблема с кодированием ключевых кадров H.264 fix;
Кодировщик JPEG теперь поддерживает кодирование с ускорением на dGPU; в предыдущих релизах DeepStream, кодировщик JPEG для dGPU был программным. Улучшение является важным для ускорителей V100, A100, A40, Jetson Orin Nano и семейства GeForce, поскольку для этих ускорителей NVENC либо отсутствует либо имеет ограничение на количество кодируемых потоков. В этих условиях, аппаратное ускорение кодирования JPEG выглядит полезным.
Однако, Nvidia не исправила ошибки в DS 6.2 и 6.3, которые мы обнаружили:
Перемешивание кадров в видео-потоках с B-фреймами (bugreport) на Nvidia Jetson (в Savant сделан workaround);
Ошибка в элементе nvstreammux, вызывающая дублирование сигналов End Of Stream (в Savant сделан workaound).
Улучшение для разработчиков
Мы верим, что конвейеры компьютерного зрения должны быть простыми в разработке, однако - это всегда компромисс между сложностью и производительностью, простотой и неэффективностью.
DeepStream - довольно сложная технология: людям, знакомым с базовыми решениями в области компьютерного зрения, такими как PyTorch, может показаться, что разработка конвейеров для DeepStream мучительно трудна.
В этом, безусловно, есть своя причина: DeepStream - это сигнальная система с параллельным процессингом данных, предоставляющая продвинутые функции для потоковой обработки. Ванильный DeepStream требует значительных знаний и усилий для разработки продвинутых конвейеров, начиная от понимания GStreamer и заканчивая неудобным инструментарием и отсутствием интеграции со сторонними системами.
В Savant мы стремимся преодолеть бремя столь сложной среды. Чтобы сделать процесс разработки более удобным, мы реализовали пять функций для повышения производительности разработчиков. В релизе представлен новый расширенный инструментарий, позволяющий разрабатывать конвейеры прямо из PyCharm или VS Code IDE. Мы также расширили документацию, чтобы на практике продемонстрировать использование различных функций (в том числе видео руководства).
Поддержка OpenTelemetry
Savant теперь поддерживает OpenTelemetry, что позволяет инструментировать каждый кадр, обрабатываемый конвейером. Вы можете профилировать код, присоединяя к трейсам логи и произвольные атрибуты, для анализа ошибок и узких места конвейера. В репозитории мы приводим пример, демонстрирующий использование OpenTelemetry. В Savant OpenTelemetry может использоваться как в выборочном (sampled - для продуктива), так и в полном режиме (каждый фрейм - для разработки и отладки). Подробнее о поддержке OpenTelemetry (англ).
DevServer
Эта функция обеспечивает горячую перезагрузку Python-кода при его изменении. Это помогает быстрее экспериментировать, отлаживать и разрабатывать, используя только IDE. Для получения эффекта не нужно перестраивать и перезапускать конвейер.
Client SDK
Client SDK - это библиотека на языке Python, которая позволяет организовать взаимодействие с конвейером (ввод данных и получение результатов обработки) с помощью десятка строк простого кода на языке Python. Она интегрируется с OpenTelemetry, обеспечивая программный доступ к трейсу обработки конкретного кадра.
Client SDK можно использовать для разработки воспроизводимых модульных и полнофункциональных интеграционных тестов, а так же пользовательских адаптеров. SDK доступен в синхронной и асинхронной реализациях.
Логи с поддержкой цветов
Мы добавили цветовое оформление журналов, чтобы разработчикам было проще их анализировать. Кроме того, в этом релизе можно назначать различный уровень логгирования для различных компонентов пайплайна.
Вспомогательная утилита URI-Input
Обычно, данные в Savant поступают через адаптеры, что не всегда удобно при разработке. Мы снабдили Savant удобным скриптом, позволяющим вводить видео или изображения в конвейер прямо из среды разработки без необходимости запуска отдельных адаптеров.
Улучшения в части адаптеров
Мы реализовали два новых адаптера и сделали другие улучшения.
Kafka+Redis Adapters
В релизе опубликованы технологические превью адаптеров Kafka+Redis. Они обеспечивают масштабируемую обработку, необходимую для работы с большим количеством потоков в высоконагруженных, масштабируемых средах в режиме обработки с задержкой. Адаптеры передают метаданные с помощью Kafka и видео-фреймы с помощью Kafka или Redis (или другого Redis-совместимого хранилища, например KeyDB).
Multi-Stream Source Test Adapter
Чтобы помочь разработчикам измерять производительность конвейеров и настраивать их параметры, мы реализовали вспомогательный сервисный адаптер, параллельно отправляющий заданное количество потоков данных в конвейер.
Адаптер позволяет создать желаемую рабочую нагрузку, чтобы понять, как ведет себя конвейер, и определить оптимальную конфигурацию производительности (размер батча для моделей, количество потоков и т.д.).
По завершении работы он может отправить сообщение shutdown, чтобы сообщить об конвейеру о необходимости завершения работы.
Инструментарий для разработки пользовательских адаптеров (Client SDK)
Client SDK, описанный в предыдущем разделе, предоставляет простые и удобные средства для быстрой разработки пользовательских адаптеров.
Multi-Streaming Always-On RTSP Sink Adapter
Ранее разработчикам требовалось запускать по одному экземпляру AO-RTSP Sink Adapter для трансляции каждого потока. Теперь можно запустить один адаптер и указать несколько потоков одновременно, что уменьшает количество конфигурационного boilerplate-кода при настройке пайплайнов.
HEVC-кодирование для промышленных камер GigE Vision
С помощью этой функции потоки, получаемые с камер GigE Vision, могут быть закодированы в HEVC и при необходимости переданы через каналы с низкой пропускной способностью. Функция может повысить производительность обработки, если сжатие видео не снижает качество. Кодирование программное (на CPU), чтобы его можно было выполнять на простейших edge-устройствах типа Raspberry Pi и аналогичных.
Развертывание
Мы улучшили то, как модуль Docker image сигнализирует контейнерной среде о ходе процесса инициализации. Теперь разработчики могут использовать функции health check в Docker, чтобы понять, когда конвейер готов к обработке данных.
Состояние работоспособности доступно по объекту файловой системы и HTTP URL.
Демки и примеры
Мы считаем, что примеры очень важны для новых пользователей, которые хотят быстро освоить Savant, поэтому каждый новый выпуск Savant поставляется с дополнительными примерами. Мы совершенствуем ранее опубликованные примеры с учетом изменений в отрасли. Например, в этом релизе мы перешли с YOLOV5-Face на YOLOV8-Face в двух демках.
Instance Segmentation
В демонстрации используется модель YOLOV8M-Seg. На современных GPU типа RTX4000 или A4000 производительность конвейера может достигать 100 FPS и более. Демонстрация находится в репо Savant.
Facial ReID
В демонстрационном примере используются YOLOV8-Face, AdaFace и HNSWLib для распознавания людей на видео. Демонстрация находится в репо Savant.
Прогнозирование пола и возраста
Демонстрация основана на YOLOV8-Face и пользовательской модели на базе MobileNet V2. Демонстрация находится в репозитории Savant. Видеоматериалы доступны по ссылке здесь (Youtube удаляет видео).
Улучшение в демке Traffic Meter
Мы также расширили демонстрационную версию счетчика трафика, чтобы использовать YOLOV8S для обнаружения. Теперь она поддерживает PeopleNet, YOLOV8M и YOLOV8S по вашему выбору. Демонстрация находится в репо Savant.
С машинками (YOLO):
С человечками (PeopleNet, YOLO):
Вспомогательные примеры
Пример работы с OpenTelemetry.
В шаблоне проекта демонстрируются возможности клиентского SDK, OpenTelemetry и DevServer.
Пример проверки совместимости RTSP-камеры с Savant.
Пример передачи потоковых данных и метаданных через Kafka+Redis.
Работа над ошибками
В релизе исправлено 14 важных багов.
Улучшение документации
В версии Savant 0.2.5 существенно обновлена документация. К наиболее важным обновлениям относятся:
настройка среды разработки для VS Code;
учебник для разработчиков, рассказывающий о нашем подходе к эффективной разработке конвейеров для Savant в PyCharm и VS Code (+ видео);
продвинутые топики, посвященные нетривиальным проблемам разработки конвейеров;
обновлена документация по адаптерам.
Прочие улучшения
Транспортный протокол на основе Rust. Предыдущие версии Savant были основаны на Fast AVRO. Однако мы обнаружили, что AVRO недостаточно быстр для наших нужд, и у нас возникли опасения по поводу освобождения GIL в Fast AVRO. Чтобы решить проблемы, мы заново реализовали протокол с помощью крейта Rkyv с корректным высвобождением GIL, когда это необходимо.
Группы элементов. Эта функция подробно описана здесь.
Расширенная настройка логирования. Теперь уровни протоколирования можно настраивать для каждого участка кода. Более подробная информация приведена в документации.
Программный кодировщик H264. Аппаратный кодировщик недоступен в таких dGPU, как A100, V100 и Jetson Nano V2. Для полноценной поддержки этих устройств мы реализовали поддержку программного кодировщика.
Валидация пропуска кадров. Когда адаптеры реального времени начинают терять данные из-за узкого места в конвейере, в журналах появляется специальное сообщение с уровнем WARN.