AG
Все проекты

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

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

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

Обзор

BinnaryNaiveNN - это open source низкобитное ядро машинного обучения и исследовательский инструментарий на C99 для сценариев, где классический стек машинного обучения слишком тяжел по памяти, зависимостям и допустимым задержкам. Проект решает задачу локального вывода в условиях жестких ресурсных ограничений: когда модель должна запускаться на устройстве, занимать минимум памяти и встраиваться в существующую C/C++ систему без полноценной среды выполнения уровня TensorFlow Lite или ONNX Runtime.

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

Ключевые возможности

  • Низкобитное рабочее ядро с минимальными зависимостями и собственным форматом модели
  • Обучение через Straight-Through Estimator (STE) с разделением скрытых вещественных весов и компактного рабочего представления
  • SIMD-ускорение под AVX2 и автоматический выбор вычислительного пути в зависимости от размера слоя
  • Отдельный XNOR + popcount путь для бинарных сверточных слоев в bnn_v2
  • Сравнительный тест производительности на CIFAR-10 для базового v1, float_v2 и bnn_v2
  • Консольный инструмент для обучения, вывода, инспекции моделей и замеров производительности
  • Два поколения API (v1 и v2) для параллельного развития R&D и сохранения базовой совместимости
  • Unit, integration и acceptance-тесты для проверки корректности и воспроизводимости
  • Подготовка к публичному open source: MIT-лицензия, README, CHANGELOG, CONTRIBUTING, SECURITY, GOVERNANCE, issue/PR templates и GitHub Actions CI
  • Локальный readiness-check, который проверяет репозиторно-контролируемые пункты подготовки к публикации

Технический стек

  • Язык: C99
  • Сборка: CMake, Ninja
  • SIMD: AVX2 для x86, архитектура с несколькими вычислительными путями
  • Тестирование: собственный фреймворк, acceptance-тесты
  • Автоматизация: GitHub Actions, Makefile, readiness-check на Node.js
  • Окружение: devcontainer

Зачем нужен проект

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

BinnaryNaiveNN закрывает этот разрыв как легковесный слой вывода:

  • локальный вывод на периферийных устройствах без облака
  • сверхлегкие классификаторы для существующих C/C++ систем
  • недорогие встраиваемые и промышленные внедрения без специализированного ускорителя
  • исследования низкобитных архитектур там, где важно соотношение accuracy / size / latency / power

Как помогает в коммерческом продукте

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

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

Проект особенно полезен в таких кейсах:

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

Как проект может зарабатывать деньги

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

Основные модели:

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

Бизнес-результат при этом измеримый: меньше расходов на облачные вычисления, дешевле устройство, быстрее запуск локальных функций ИИ и лучше контроль над чувствительными данными.

Как он устроен

Архитектурно проект разделен на два слоя.

Первый слой - базовый v1-контур: компактная полносвязная модель с тернарными весами -1/0/1, int8-активациями и обучением через STE. Ключевое решение здесь - разделение представления для обучения и представления для вывода. Во время обучения используются скрытые вещественные веса для обратного распространения ошибки, а в рабочем режиме модель хранится в компактном формате с упакованными весами. Это позволяет совмещать градиентное обучение с дешевым дискретным путем вывода.

Второй слой - v2-контур для более современной сверточной архитектуры на CIFAR-10. Он нужен не как замена старого API, а как отдельная исследовательская ветка, где можно изучать более сильные низкобитные архитектуры без разрушения базового контракта. В bnn_v2 часть слоев бинаризована, а граничные слои остаются вещественными, чтобы удержать баланс между компактностью и качеством.

На уровне компонентов проект включает:

  • bitpack для упаковки low-bit представления
  • ternary и inference-kernels для тернарного dot product
  • model и model_io для собственного формата .bnn
  • dataset и бинарный формат .bds для ускоренной загрузки данных
  • platform-слой с выровненным выделением памяти, пулом потоков, таймерами и определением возможностей процессора

Горячий путь вывода спроектирован как производительное рабочее ядро: без лишних выделений памяти, с выбором вычислительного пути и с SIMD-ускорением там, где оно окупается. Для небольших слоев используется скалярный запасной путь, для широких - AVX2, что дает управляемый компромисс между переносимостью и пропускной способностью.

Для v2 добавлен отдельный путь XNOR + popcount:

  • бинарные значения пакуются по 32 штук в uint32_t
  • совпадения знаков считаются через XNOR
  • скалярное произведение восстанавливается через popcount

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

Готовность к open source

Проект приведен к форме, в которой внешний пользователь может не только посмотреть код, но и повторить базовый сценарий:

  • README.md начинается с one-liner, демо, установки, быстрого старта, возможностей, ограничений, совместимости, ссылок на документацию и лицензии
  • docs/usage.md описывает установку, CLI, быстрый старт, тесты и troubleshooting
  • docs/architecture.md фиксирует публичные API-границы, модули, потоки данных, зависимости и известные ограничения
  • docs/release.md описывает SemVer, deprecation policy, changelog и шаги релиза
  • docs/publication.md содержит GitHub About, topics, homepage, social preview, announcement plan и метрики, которые требуют ручного действия владельца
  • CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md и GOVERNANCE.md задают правила участия, безопасности, поддержки и принятия решений
  • .github/ содержит CI, Dependabot, issue forms и PR template
  • scripts/check_readiness.mjs проверяет, что репозиторно-контролируемая часть чек-листа не деградировала

Важное продуктовое решение: крупные бинарные файлы CIFAR-10 не хранятся в репозитории. Acceptance-бенчмарк чисто пропускается без датасета, а для полноценного запуска принимает внешний путь через BNN_CIFAR10_DIR. Это уменьшает размер репозитория и делает сборку воспроизводимой без скрытых локальных артефактов.

Почему это зрелый инженерный кейс

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

  • системное программирование на C99
  • прикладное машинное обучение и низкобитное квантование
  • инженерия производительности и SIMD-оптимизация
  • проектирование рабочих форматов моделей и наборов данных
  • поддержка совместимости между поколениями API
  • разработка с опорой на измерение производительности и тестовую дисциплину
  • упаковка исследовательского кода в публичный инженерный продукт: лицензия, документация, CI, security policy, contribution flow и релизная дисциплина

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