Недавно я решил заняться изучением глубокого обучения. На работе мне выдали новую карточку с поддержкой CUDA и шеф выразил пожелание что эта вершина инженерной мысли позволит нашей лаборатории сделать рывок вперёд, ну или по крайней мере, не отстать от массы конкурентов. У меня уже был некоторый опыт общения с Tensor Flow, но в этот раз я решил попробовать Torch. Привлекало что он написан на языке Lua и C, является достаточно легковесным и легко расширяемым через FFI. И ещё мне не нравится Python.  Недавно на Хабрахабр я наткнулся на статью, в процессе обсуждения которой я вспомнил что где-то в тумбочке у меня пилится Raspberry Pi, модель B+ и мне захотелось посмотреть — а смогу ли я поднять на ней torch и запустить что-нибудь несложное.  Естественно первым делом я захотел посмотреть как на моем десктопе с новой карточкой GPU будет тренироваться alexnet и другие известные сети. На гитхабе есть небольшой проект в котором несколько популярных сетей реализованы на Torch. Поигравшись с ними, я перешёл на решение своих задач, но про них я тут говорить не буду.  А теперь переходим к малинке (Raspberry PI модель B+). Копируем инсталлятор torch на малинку: Первым делом, я решил что мне не хочется ждать пока стандартный установщик Torch скомпилирует OpenBLAS и установит QT со всеми зависимостями, поэтому я решил проделать это вручную: Запускаем компиляцию torch: У меня компиляция всего занимает примерно час.  И тут нас ждёт первый облом: создатели torch: не предполагали что его будут компилировать на архитектуре arm, но без поддержки NEON: Пришлось пофиксить это дело. И после этого, всё заработало! Если вам лень делать это всё самому и хочется быстро попробовать пример, я сделал архив с пред-компилированным torch для Raspberry PI -B (без поддержки NEON): https://github.com/vfonov/deep-pi/releases/download/v1/torch_intstall_raspbian_arm6l_20161218.tar.gz, распаковывается в /home/pi  Для проверки я решил посмотреть скорость тренировки распознавания рукописных цифр MNIST, соответствующий пример есть в наборе демок для Torch:  В общем неплохо, для сравнения — на десктопе с i5-4590 CPU @ 3.30GHz, без использования GPU:  Т.е в этом примере малинка работает примерно в 5 раз медленнее чем современный десктоп.  Теперь настал черёд заставить малинку распознавать изображения с помощью натренированной googlenet. Тут меня ждал второй подвох: в Alexnet такое огромное количество параметров, что памяти малинки уже не хватает. Но тут на выручку приходит squeezenet и Network-in-Network, автор последней даже сделал натренерованную модель в формате для torch. Для начала надо преобразовать модель так чтобы её можно было использовать на архитектуре ARM (тренировать на Raspberry PI не стоит — результаты будут готовы лет через сто).  На десктопе надо загрузить модель в бинарном формате torch, и записать в формате ‘ascii’, потом на малинке — преобразовать обратно: Desktop: Raspberry PI: Версию для arm можно загрузить тут. Я сделал маленький скриптик для проверки работоспособности на малинке:
Полный текст тут. И вуаля, запускаем с изображением из тестового набора ImageNET: T.e за 14 сек малинка удачно справилась с процедурой распознавания образов!  Настало время сделать пример поинтересней: приделываем интерфейс к камере из пакета camera и веб интерфейс из пакета display, и у нас получается интерактивная машина, раз в 14 секунд объявляющая миру что она видит. Надо только установить пакет для работы с камерой (luarocks install camera) и для визуализации через веб-интерфейс (luarocks install display). Полный текст тут.  Перед запуском надо запустить демона из пакета display: nohup th -ldisplay.start 8000 0.0.0.0 & Тестовая установка:   Результат:    Итак у нас получилась недорогая машинка для распознавания образов, которой вы можете порадовать ваших друзей во время новогодних праздников. Естественно, задача классификации изображения может быть заменена на что-то более продуктивное, например можно легко сделать систему для идентификации человека по физиономии, несколько примеров есть тут или можно идентифицировать фигуры людей на камере наблюдения за вашим огородом. Для оптимизации производительности можно попробовать использовать nnpack, или даже сделать интерфейс к векторному ускорителю встроенному в процессор малинки как тут.  Цитаты из "Понедельник начинается в субботу" и "Сказка о тройке" А. и Б. Стругацких.
Описание процедуры на английском и репозиторий со всеми исходниками находится на гитхабе. Продвинутый пользователь