Задача
Во многих встраиваемых сценариях вывод нейросети нужен локально: модель должна запускаться на устройстве, занимать минимум памяти и встраиваться в существующую C/C++-систему. Полноценная среда выполнения уровня TensorFlow Lite или ONNX Runtime здесь слишком дорога: лишние зависимости, память, долгий запуск, нестабильные задержки.
BinaryNaiveNN закрывает этот разрыв: низкобитное ядро вывода и исследовательский инструментарий на чистом C99, без внешнего ML-рантайма. Проект я делал сам, от математики до релизного процесса.
Как устроено
Два поколения API.
v1 - компактная полносвязная модель с тернарными весами -1/0/1, int8-активациями и обучением через Straight-Through Estimator (STE). Ключевое решение - разделить представление для обучения и рабочий формат: при обучении используются скрытые вещественные веса для обратного распространения, в рабочем режиме модель хранится компактно, с упакованными весами.
v2 - исследовательская ветка для сверточных архитектур на CIFAR-10. Часть слоев бинаризована, граничные остаются вещественными - баланс между компактностью и качеством. Для бинарных слоев есть отдельный путь XNOR + popcount: значения пакуются по 32 в uint32_t, совпадения знаков считаются через XNOR, скалярное произведение восстанавливается через popcount. Вещественное умножение с накоплением превращается в дешевые побитовые операции.
Горячий путь вывода - без лишних выделений памяти, с автоматическим выбором вычислительного пути: для небольших слоев скалярный код, для широких - AVX2.
Компоненты:
bitpack- упаковка low-bit представленияternaryи inference-ядра - тернарный dot productmodel/model_io- собственный формат.bnndataset- бинарный формат.bdsдля быстрой загрузки данныхplatform- выровненная память, пул потоков, таймеры, определение возможностей CPU
Инженерная обвязка
Консольный инструмент для обучения, вывода, инспекции моделей и замеров производительности. Unit-, integration- и acceptance-тесты. CI на GitHub Actions, MIT-лицензия, документация (usage, architecture, release), шаблоны issue/PR. Крупные бинарные файлы CIFAR-10 в репозитории не хранятся: acceptance-бенчмарк без датасета чисто пропускается, а для полного запуска принимает внешний путь через BNN_CIFAR10_DIR.
Статус
Сравнительный бенчмарк v1 / float_v2 / bnn_v2 на CIFAR-10 встроен в проект, но замеры не публиковались - честные цифры accuracy / size / latency входят в план.
Технический стек
- Язык: C99
- Сборка: CMake, Ninja
- SIMD: AVX2, несколько вычислительных путей
- Тестирование: собственный фреймворк, acceptance-тесты
- Автоматизация: GitHub Actions,
Makefile - Окружение: devcontainer
