Проекты/кейсы
Нами накоплен большой опыт работы над внушительным спектром задач, включая машинное обучение, миграцию и оптимизацию хранилищ данных, разработку инференса под нестандартные платформы, создание транзакционных хранилищ и слоев, настройку и получение аналитики по блокчейнам, компиляцию криптографии в Wasm, интеграцию ML-инструментов в браузерные приложения.
BigDataDuck
Видеоаналитика в медицине
Задача: создать систему «умного» видеонаблюдения для медицинских учреждений за счет анализа фиксируемых изображений и событий.
Подзадача: уменьшить нагрузку на серверное оборудование, на которое передается с камер поток событий для анализа.

Решение: обеспечить постоянный анализ событий и фильтрацию видеопотока на уровне камер при помощи нейросетей.

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

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

Наша команда обеспечила в данном проекте всё, кроме создания нейросетей. Для фильтрации потока событий с камер, поступающих на сервер, мы, в зависимости от технических характеристик установленных видеокамер, использовали один из трех подходов:
а) Каждая видеокамера напрямую подключается к серверному оборудованию и отправляет на него нефильтрованный видеопоток.
б) Каждая группа камер подключается к локальному серверу-медиатору с установленной на него нейросетью, которая анализирует видеопотоки с нескольких камер, отсекая незначительные события, прежде чем передать данные на центральный сервер. Видеопоток при этом передается целиком, но фильтруется поток событий, которые приходится обрабатывать центральному серверу.
в) Каждая видеокамера оснащается собственной нейросетью с кастомным кодом. Нейросеть анализирует входящий видеопоток в соответствии с динамически получаемыми правилами и отфильтровывает незначительные события, отправляя на сервер сокращенный поток данных.

При помощи алгоритмов машинного обучения мы написали для нейросетей задачи по фильтрации потока событий, построили ML-конвейер для обучения нейросетей и отдельный конвейер — для их переобучения. Специально для данной задачи мы также разработали кастомный инференс, способный работать на АРМ-процессорах малого размера — таких, как процессор видеокамеры.

Созданные с нашим участием системы видеоанализа сегодня успешно применяются в целом ряде медучреждений в разных странах.

Использованный техстек: Python, Go, C++, CUDA, Tensorflow, PyTorch, TensorRT
Кейс 1
ML
low level
ML в диагностических исследованиях
Задача: построить систему анализа снимков диагностических исследований (рентгенографии, флюорографии, УЗИ, МРТ и КТ) путем анализа изображений.
Подзадача: в целях экономии средств использовать для инференса не графические процессоры GPU, а процессоры общего назначения CPU.

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

Наша команда разработала для данного проекта всё продуктовое решение за исключением ML-моделей, а также сумела эффективно построить инференс с использованием процессоров общего назначения CPU, чтобы обеспечить окупаемость проекта.

Использованный техстек: Python, Go, C++, CUDA, PyTorch, Tensorflow, TensorRT
Кейс 2
ML
data engineering
Построение сверхбыстрой системы нейросетевого поиска изображений
Задача: построить сверхбыструю систему нейросетеового поиска изображений (например, для сверки с существующими объектами авторского права).
Подзадача: наладить переобучение нейросетей при их переводе с формата float32 на форматы int8 и int16.
Исходный техстек: CUDA, C++, Python, gRPC

Решение: для обучения нейросетей строится ML-конвейер, который непрерывно анализирует структуру нейросети на предмет ненужных связей, удаляет их и тем самым упрощает ее структуру. Это позволяет нейросети работать даже на самом простом оборудовании.
Для системы нейросетевого поиска была специально написана резидентная СУБД, что позволило обрабатывать свыше миллиона сравнений за 100 миллисекунд. Она задействуется там, где требуется найти четкое соответствие, в остальных случаях используется библиотека FAISS.
В рамках работы по переводу нейросетей с формата flout32 на int8 и int16 был построен отдельный конвейер для быстрого переобучения нейросетей после замены у них соответствующих слоев.

Использованный техстек: CUDA, C++, Python, gRPC, PyTorch, Tensorflow, TensorRT
Инференс — OpenCV? OpenWin
АРМ — Cortex8
Кейс 3
ML
high performance
data engineering
Видеоаналитика
Задача: при помощи нейросетей обеспечить постоянный анализ событий и фильтрацию видеопотока на уровне камер, чтобы снизить нагрузку на серверные мощности, на которые передается поток событий с камер для анализа.

Решение: каждая видеокамера оснащается собственной нейросетью с кастомным кодом для аккумуляции данных. Нейросеть анализирует входящий видеопоток в соответствии с динамически получаемыми правилами и отфильтровывает незначительные события, отправляя на сервер уменьшенный поток данных.

При помощи алгоритмов машинного обучения мы написали для нейросетей задачи по фильтрации потока событий и построили ML-конвейер для обучения нейросетей. Специально для данной задачи мы также разработали кастомный инференс, способный работать на АРМ-процессорах малого размера — таких, как процессор умной.
Кейс 4
ML
high performance
low level
ML: Интеграция ML-модели в web-приложение
Задача: для стримингового онлайн-сервиса с многоуровневой системой подписки создать систему сверхбыстрого видеоанализа, позволяющую определить, когда клиент переключается между разными категориями контента, чтобы обеспечить гибкую тарификацию предоставляемых услуг.

Решение: интегрировать инструменты машинного обучения в браузерное приложение.

Необходимо было наладить нейросетевой анализ изображений в онлайн-трансляции в режиме реального времени параллельно с анализом поведения клиента на сайте. Для этого мы интегрировали в web-приложение Wasm-модуль для Javascript.

Сперва потребовалось перевести множество созданных для этой задачи нейросетей в формат int8, после чего мы сконвертировали модели в код С++ и скомпилировали их в Wasm-модуль. Чтобы восполнить недостаточную скорость работы с помощью программной библиотеки TensorFlow.js, мы воспользовались наработками из open-source.

Интегрирование в веб-приложение кода обработки на С++ позволило снизить нагрузку на процессорные мощности при конвертации видеопотока из браузера в Wasm-модуль и сократить накладные расходы на обработку данных с Х5 до Х1,5-2, а также оптимизировать обработку изображения.

Наша разработка дала возможность анализировать содержание онлайн-трансляции по 5 кадрам в режиме реального времени, распознавая не только лица, но и предметы в кадре.
Кейс 5
ML
frontend
performance
Аналитика по блокчейну
Задача: наладить процесс анализа блокчейнов (Bitcoin, Etherium) в целях AML-мониторинга.

Для работы над данным проектом мы выделили три типа задач:
1) проверить последние несколько транзакций с уже известных клиентских кошельков,
2) тщательно проверить все счета и транзакции нового клиента-физлица,
3) провести глубокий поиск и проверку всех счетов и транзакций компании или лица, обладающего большим количеством криптокошельков. Тип задачи определяет глубину поиска и тип СУБД, используемой для обработки запроса. Так, для обычных запросов мы использовали СУБД ArangoDB, для срочных — ClickHouse, а для сверхбыстрой проверки разработали кастомную графовую СУБД, работающую по конкретному набору запросов. (В ее основе лежит многопоточный алгоритм Дейкстры, работающий по сегментированным группам адресов на основе признаков сегментации, предоставляемых заказчиком по собственному усмотрению.)

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

Использованный техстек: Python, C++
Кейс 6
Blockchain
backend
data engineering
Финтех: модернизация системы хранения
Задача: модернизировать систему хранения, контроля и управления денежными активами клиентов финансовой организации.

Подзадача 1: за счет модернизации снизить стоимость денежных операций в системе в среднем на $0,04.

Подзадача 2: в ходе замены старых компонентов обеспечить сохранение текущей микросервисной архитектуры, интегрированной со старой системой.

Подзадача: 3: обеспечить возможность работы с системой для сотрудников банка, не обладающих глубокой компетенцией в ИТ.

Исходный техстек: Perl, ANSI C99, COBOL (редкая версия).

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

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

Данный проект мы ведем начиная с 2016 года, один только анализ legacy-системы занял около 5 месяцев. Разрабатываемая нами система полностью соответствует законодательным требованиям к банковскому ПО и уже прошла один из этапов сертификации, необходимой для ее использования в банковской сфере. Помимо этого она прошла серию тестов на TLA+ и Haskell в промышленном контуре (Prod).

Использованный техстек: С++, множество лицензированных бизнес-компонентов.
Кейс 7
Fintech
high performance
backend
Компиляция криптографии в Wasm
Задача: построить систему обработки данных пользователей сервиса онлайн-платежей так, чтобы обработка конфиденциальной информации происходила на стороне клиента (избегая передачи данных по сети). Решение должно работать
а) в браузере,
б) быстро,
в) с соблюдением условия детерминированности процесса вычислений.

Решение: компилировать криптографические библиотеки из нативного языка программирования в WebAssembly.

Изначально обработка данных пользователей осуществлялась на языке JavaScript, а критически важные данные передавались по сети. Чтобы обеспечить безопасную обработку данных в браузере на компьютере клиента, мы взяли готовую криптографическую библиотеку, написанную на языках С++/Rust, и компилировали ее код в Wasm-файл при помощи тулчейна Emscripten, предварительно введя правило компиляции, гарантирующее детерминированный процесс вычислений. Многие криптографические функции пришлось дорабатывать вручную, чтобы решить самую сложную задачу — обеспечить стопроцентно идентичное выполнение вычислений на сервере, в браузере и на “Андроиде” клиента, соблюдая все правила конвертации типов кодирования данных с LP64/LLP64 на ILP32.

Использование WebAssembly позволило выполнить все условия задачи наиболее эффективным и наименее трудозатратным путем. Благодаря нашему решению данные обрабатываются в браузере или на мобильном устройстве клиента без передачи по сети, а для работы над каждым из сегментов функционала требуется куда меньше специалистов на стороне заказчика.
Кейс 8
frontend
high performance
Обновление техстека онлайн-игр
Задача: миграция серверного ПО многопользовательских онлайн-игр из Perl и Postgres в новый технологический стек в целях повышения эффективности утилизации серверной инфраструктуры.
Использованный техстек: Python, C++, Lua, MongoDB, Tarantool.

Изначально как основной программный язык бэкенда в приложении заказчика использовался Perl, а для описания сюжетных дополнений использовались JavaScript и Lua. Мы перевели большую часть инфраструктуры на Python и C++, обеспечив при этом сохранение и работоспособность существующих игровых механик и сценариев. Базы данных заказчика мы мигрировали с MySQL на Postgres, а также использовали платформу Tarantool в качестве системы очередей и горячего кэша.

Миграция на новый техстек позволила более эффективно обрабатывать входящий пользовательский трафик и увеличить пропускную способность игровых серверов, используя при этом меньший объем ресурсов инфраструктуры.
Кейс 9
Backend
high performance