AG
Все проекты

BinaryNaiveNN: низкобитные нейросети на C99

C99-библиотека и CLI для низкобитных нейросетей: компактный локальный вывод, обучение через STE, AVX2/XNOR-пути, тесты, CI и документация.

C99Neural NetworksSIMDAVX2CMakeEmbedded AI
BinaryNaiveNN: низкобитные нейросети на C99

Задача

Во многих встраиваемых сценариях вывод нейросети нужен локально: модель должна запускаться на устройстве, занимать минимум памяти и встраиваться в существующую 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 product
  • model / model_io - собственный формат .bnn
  • dataset - бинарный формат .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