Обзор
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 productmodelиmodel_ioдля собственного формата.bnndatasetи бинарный формат.bdsдля ускоренной загрузки данныхplatform-слой с выровненным выделением памяти, пулом потоков, таймерами и определением возможностей процессора
Горячий путь вывода спроектирован как производительное рабочее ядро: без лишних выделений памяти, с выбором вычислительного пути и с SIMD-ускорением там, где оно окупается. Для небольших слоев используется скалярный запасной путь, для широких - AVX2, что дает управляемый компромисс между переносимостью и пропускной способностью.
Для v2 добавлен отдельный путь XNOR + popcount:
- бинарные значения пакуются по
32штук вuint32_t - совпадения знаков считаются через
XNOR - скалярное произведение восстанавливается через
popcount
Это переводит часть вычислений из вещественного умножения с накоплением в дешевые побитовые операции и делает v2 хорошей платформой для экспериментов с периферийными сверточными сетями, где пропускная способность памяти и цена инструкции критичнее абсолютной универсальности.
Готовность к open source
Проект приведен к форме, в которой внешний пользователь может не только посмотреть код, но и повторить базовый сценарий:
README.mdначинается с one-liner, демо, установки, быстрого старта, возможностей, ограничений, совместимости, ссылок на документацию и лицензииdocs/usage.mdописывает установку, CLI, быстрый старт, тесты и troubleshootingdocs/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 templatescripts/check_readiness.mjsпроверяет, что репозиторно-контролируемая часть чек-листа не деградировала
Важное продуктовое решение: крупные бинарные файлы CIFAR-10 не хранятся в репозитории. Acceptance-бенчмарк чисто пропускается без датасета, а для полноценного запуска принимает внешний путь через BNN_CIFAR10_DIR. Это уменьшает размер репозитория и делает сборку воспроизводимой без скрытых локальных артефактов.
Почему это зрелый инженерный кейс
Для портфолио проект ценен не только темой низкобитных нейросетей, а уровнем инженерной ответственности. Здесь есть сразу несколько классов задач:
- системное программирование на
C99 - прикладное машинное обучение и низкобитное квантование
- инженерия производительности и SIMD-оптимизация
- проектирование рабочих форматов моделей и наборов данных
- поддержка совместимости между поколениями API
- разработка с опорой на измерение производительности и тестовую дисциплину
- упаковка исследовательского кода в публичный инженерный продукт: лицензия, документация, CI, security policy, contribution flow и релизная дисциплина
То есть это не просто реализация нейросети, а работа на стыке системного программирования, машинного обучения и инженерии продукта: как взять идею низкобитного вывода и превратить ее в управляемое, тестируемое и встраиваемое рабочее ядро, которое имеет смысл в реальном коммерческом продукте.
