Interference 1.1.0: новые возможности
26-го июля состоялся релиз новой версии библиотеки Interference. Библиотека реализует интерференционную модель нейронной сети, написана на C++ и является проектом с открытым исходным кодом (лицензия MIT). В версии 1.1.0 она претерпела огромное количество изменений, об основных из которых мы и расскажем.
1. Увеличение производительности в ~15 раз
В новой версии библиотеки мы существенно переработали систему взаимодействия элементов модели: теперь в основном используется динамическое выделение памяти и работа с указателями. Это особенно актуально при расчёте новых координат положений рецепторов. Мы анализировали скорость выполнения каждой операции по отдельности, чтобы понять, какие из них наиболее ресурсоёмкие, и оптимизировали их.
2. Поддержка многопоточности для многоядерных CPU
Новая версия библиотеки получила переработанную архитектуру, которая позволяет распараллеливать работу с данными. Это касается как процесса обучения модели, так и распознавания данных. Теперь каждый нейрон в сети может иметь свой поток выполнения, этот режим активируется вызовом метода doEnableMultithreading() для объекта класса inn::NeuralNet (или inn::Neuron, если нейрон находится вне сети). Без вызова этого метода, нейронная сеть будет работать в однопоточном режиме, как и раньше. В дальнейшем планируется сделать архитектуру более гибкой: появится возможность задавать количество потоков выполнения вручную (станет возможным случай, когда один поток обрабатывает несколько нейронов). Новая архитектура открывает путь появлению поддержки графических ускорителей в ближайшем будущем.
Сравнительная диаграмма скорости обработки данных при обучении модели. 18,2 мбит\сек в многопоточном режиме против 3,8 мбит\сек в однопоточном. При тестировании использовался стенд с CPU Intel Core i5-8500.
3. Поддержка архитектуры ARM
Добавление поддержки библиотекой архитектуры ARM является скорее формальностью — никаких изменений в коде для этого не потребовалось. Достаточно выбрать нужный компилятор и собрать им её. Мы тестировали библиотеку на микроконтроллере Freescale iMX 6 Solo под Linux, даже на таком маломощном чипе модель обучалась и распознавала изображения за разумное время. Это означает, что библиотеку уже можно использовать во встраиваемых решениях и при разработке «умных» устройств.
4. Пример системы распознавания изображений
Теперь в репозитории библиотеки на GitHub имеется директория «samples», которая, как можно догадаться, содержит примеры использования библиотеки. Пример пока только один — inn_vision. Он максимально подробно описывает, как использовать библиотеку Interference для распознавания изображений, а также даёт общее представление о том, как применять библиотеку Interference для решения практических задач с использованием машинного обучения.
Результат работы примера. Обученная на 10 картинках из датасета COIL-100 модель (для каждого объекта была взята только одна картинка) успешно распознала все объекты несмотря на отличающийся ракурс, а иногда и масштаб. Одинаковые объекты выделены рамками одного цвета.
5. Прочие улучшения
Помимо основных нововведений, библиотека также получила некоторые улучшения, связанные с удобством её использования. В репозитории GitHub появилась инструкция по сборке как самой библиотеки, так и примера (для Windows и Linux). Там же можно ознакомиться с полным списком изменений в версии 1.1.0. В ближайшем будущем станет доступна полноценная документация.
Следите за новостями!