Использование Intel Movidius для нейронных сетей

  • Tutorial

Введение


Мы занимаемся разработкой глубоких нейронных сетей для анализа фото, видео и текстов. В прошлом месяце мы купили для одного из проектов очень интересную штуковину:
Intel Movidius Neural Compute Stick.
Intel MNCS

Это специализированное устройство для нейросетевых вычислений. По сути, внешняя видеокарточка, заточенная под нейронные сети, очень компактная и недорогая (~$83). Первыми впечатлениями от работы с Movidius’ом мы и хотим поделиться. Всех заинтересовавшихся прошу под кат.

Вычислительные мощности устройства


В плане вычислений нейронки чрезвычайно прожорливы: для их обучения нужны GPU, а для использования в реальных задачах – тоже GPU или мощные CPU. Movidius NCS позволяет использовать глубокие нейросети на устройствах, которые были первоначально на это не рассчитаны, например: Raspberry Pi, DJI Phantom 4, DJI Spark. Речь идёт только про этап предсказания (inference заранее обученной сети): обучение нейросетей на Movidius пока что не поддерживается.

Производительность чипа – около 100 гигафлопс, 10^9 FLOPS, (это примерно соответствует уровню топовых суперкомпьютеров начала 90ых, сейчас это порядка сотен петафлопс, 10^15).

Для справки: FLOPS – это количество вычислительных операций или инструкций, выполняемых над операндами с плавающей точкой (FP) в секунду. Для углубления в тему советую интеловскую статью.

Железка построена на базе чипа Myriad 2. В конфигурацию Myriad 2 входит 12 специализированных программируемых векторных процессоров. Компоненты SoC подключены к высокоскоростному внутреннему соединению, работающему с минимальными задержками. Myriad 2 позиционируется как сопроцессор совместно с процессором приложений в мобильных устройствах, или как автономный процессор в устройствах носимой или встраиваемой электроники.

Myriad 2
Сам процессор Myriad 2

Ну а в форм-факторе флешки (Neural Compute Stick) его можно использовать для встраивания нейросетей в беспилотники, например, вместе с Raspberry Pi.

Приступим к установке и запуску первой программы на NCS


Что нам понадобится


  • Intel Movidius. Узнать, где он продаётся, можно по ссылке. Мы брали на Амазоне.
  • Ubuntu 16.04 LTS или Raspbian OS. Официально поддерживаются только они, но в принципе можно попробовать использовать и на других линуксах.
  • SDK с официального репозитория компании. Его мы скачаем дальше из консоли.
  • Экспортированный из Tensorflow или Caffe бинарник с графом весов нейросети. Последняя версия Movidius поддерживает только форматы моделей Tensorflow или Caffe. Поскольку мы будем запускать стандартный пример, строить самим граф нам не придётся.

Подготовка


Подключаем Movidius в разъем USB 3.0. Далее пишем в консоли:

$ git clone https://github.com/movidius/ncsdk.git
$ cd ncsdk
$ sudo make install

Эти команды установят:

  • NCS Libraries → /usr/local/lib
  • NCS Toolkit binaries → /usr/local/bin
  • NCS Include files → /usr/local/include
  • NCS Python API → /opt/movidius

А также добавят путь к python-либе Мовидиуса в PYTHONPATH.

Запустим пример


В той же папке выполним команду для построения примеров:

$ make examples

Чтобы подготовить стандартный пример – обученную на ImageNet реализацию inception_v1 – выполним следующие команды:

$ cd examples/tensorflow/inception_v1
$ make all

Последняя команда использует описание сетки и уже обученные веса и компилирует бинарный граф, который мы можем потом уже запустить на Myriad 2 VPU.

Теперь мы запустим тестовый скрипт run.py. Коротко расскажу, что происходит в скрипте в целом (некоторые части скрипта опущены):

#Подключаем библиотеки NCS, numpy, sys и opencv
from mvnc import mvncapi as mvnc
import sys
import numpy
import cv2

#/Кусок кода опущен/

#Указываем путь к бинарному графу
graph_filename = 'graph'

#Указываем путь к папке с картинкой
image_filename = path_to_images + 'mouse.jpg'

#Проверяется доступность NCS-устройства, а затем производится его открытие,
#в ином случае выкидывается ошибка
devices = mvnc.EnumerateDevices()
if len(devices) == 0:
    print('No devices found')
    quit()
device = mvnc.Device(devices[0])
device.OpenDevice()

#Загружается предкомпилированный бинарный граф, экспортированный из TensorFlow
#(ещё поддерживается Caffe)
with open(path_to_networks + graph_filename, mode='rb') as f:
    graphfile = f.read()

#/Кусок кода опущен/

#Подключенный выше граф грузится на устройство
graph = device.AllocateGraph(graphfile)

#Изображение переводится в подходящий формат и загружается на чип
img = cv2.imread(image_filename).astype(numpy.float32)
dx,dy,dz= img.shape
delta=float(abs(dy-dx))
if dx > dy: #crop the x dimension
    img=img[int(0.5*delta):dx-int(0.5*delta),0:dy]
else:
    img=img[0:dx,int(0.5*delta):dy-int(0.5*delta)]
    
img = cv2.resize(img, (reqsize, reqsize))

img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#Нормализация изображения
for i in range(3):
    img[:,:,i] = (img[:,:,i] - mean) * std

print('Start download to NCS...')
graph.LoadTensor(img.astype(numpy.float16), 'user object')

#Получаем результат
output, userobj = graph.GetResult()

#Далее печатаем релевантный топ по категориям и закрываем NCS-устройство
top_inds = output.argsort()[::-1][:5]

print(''.join(['*' for i in range(79)]))
print('inception-v1 on NCS')
print(''.join(['*' for i in range(79)]))
for i in range(5):
    print(top_inds[i], categories[top_inds[i]], output[top_inds[i]])

print(''.join(['*' for i in range(79)]))
graph.DeallocateGraph()
device.CloseDevice()
print('Finished')

Когда мы собирали пример, мы вводили в консоль команду make all, после которой в консоль выводилась полезная информация, например, можно увидеть, как быстро данные проходят через каждый слой сети с помощью Detailed Per Layer Profile. Полезная для отладки и оптимизации штука.

Запускаем скрипт:

$ python3 run.py

Тестовая картинка загрузится на NCS, пройдёт через Inception, и в консоли отобразится результат распознавания (вероятностное распределение по 1000+1 категории датасета ImageNet).

Вывод консоли
Number of categories: 1001
Start download to NCS...
*******************************************************************************
inception-v1 on NCS
*******************************************************************************
674 mouse, computer mouse 0.99512
663 modem 0.0037899
614 joystick 0.00031853
528 desktop computer 0.00021553
623 lens cap, lens cover 0.0001626
*******************************************************************************
Finished


Тестовая картинка
imageЗагрузили эту фотку на Movidius и прогнали через Inception

Видно, что сеть с ~99% уверенностью полагает, что на картинке компьютерная мышь (благодаря нашей подсказке :) ), на втором месте с близкой к 0% уверенности – модем, и так далее. Сетка права, так что поздравляем вас с первой нейронкой, успешно запущенной на этом устройстве!

Заключение


В конце хотелось бы перечислить главные достоинства и недостатки устройства.

Сперва плохие новости:

  • Устройство официально поддерживает работу только с Raspbian OS или Ubuntu 16.04 LTS.
  • Устройство и его SDK на данный момент поддерживают только файлы с весами нейросетей в формате Caffe и Tensorflow.
  • На устройстве можно делать только предсказания (inference), а обучать модели нельзя.

Хорошие новости:

  • Вы можете запускать нейронки на Raspberry Pi!
  • Очень простой API на python/C.
  • Низкая потребляемая мощность (1 Вт), устройство питается от USB.
  • Очень быстрый для такого компактного устройства: например, препроцессинг фотографии ~800х800 и прогон её через Inception_v1 занимают ~120-130 миллисекунд.
  • Есть коллекция уже готовых для запуска open-source моделей (так называемый Model Zoo).
  • Интересно, что вы можете подключить сразу несколько NCS, которые прямо из коробки будут работать в параллельном режиме. Впрочем, мы это пока не тестировали.

image
Так Intel предлагает использовать Мовидиусы для ускорения вычислений

Само собой, у данного устройства есть аналоги.

Один из них – и пока самый многообещающий – это Gyrfalcon Technology Laceli, имеющий производительность в 28 раз больше, а энергетическую эффективность в 90 раз выше. Единственное препятствие для покупки – это то, что устройство ещё не вышло на рынок.

Еще один конкурент, который давно присутствует на рынке – это NVIDIA Jetson TX2. Отличия:

  • Очень разные ценовые категории (559$ против 83$)
  • Разные мощности (два ядра CPU на архитектуре Denver 2, четыре ядра ARM Cortex A57 и 256-ядерный Pascal GPU против одного Myriad 2)
  • Разный форм-фактор: Jetson гораздо больше, NCS компактный
  • Оба устройства решают одну и ту же задачу – задачу внедрения нейронок на борт чего-либо: автомобиля, беспилотника и пр.

Если интересно, напишем в ближайшем будущем еще одну статью про использование Jetson TX2 для нейронных сетей. Спасибо за внимание и хорошего дня)

P. S. Intel объявил о старте конкурса по оптимизации нейросетей для Intel Movidius Neural Compute Stick. Регистрация до 26 января, окончание конкурса – 15 марта.
Нейросети Ашманова 10,75
Занимаемся машинным обучением и нейросетями.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 14
  • +1
    Сравнение с Jetson не очень корректное — там arm ядра для работы ОС и софта общего назначения, помимо них есть ядро с блоками CUDA, на которых и проходит основная работа с нейронками.
    • 0
      Да, согласен, забыли написать. Мы ведь на Jetson именно GPU используем в своих задачах. Спасибо, сейчас поправлю.
    • 0
      А где же сравнение производительности сабжа с софтовой реализацией на «обычном» компьютере? В той же задаче распознавания, с такой же сеткой.
      • 0
        Там отличие примерно на порядок: 10-15 миллисекунд на компьютере с GTX 1080 Ti.
        • +1
          Не не, 1080 — это уже совсем другая весовая категория. Хотя было бы весело, если бы производительность одинаковая была. :)
          Я имел ввиду сетку без аппаратного ускорения, на ЦП.
      • 0
        Из статьи абсолютно непонятно, насколько полезный девайс. С таким же успехом он мог бы ничего не делать, картинка прогоняется через CPU, пишем статью и результат.
        Хотя бы какие-то сравнительные графики с рассчетом на CPU (каком?), Jetson'е том же, популярные GPU (GTX 1080Ti, например).
        А так в целом можно резюмировать: есть девайс, его можно воткнуть в комп, он небольшой.
        • +1
          Будучи человеком, далёким от машинного обучения, я понял что этот девайс нужен для тех, кто хочет использовать несложные нейронки в embedded устройствах.

          Сравнивать ни с чем не нужно, потому что в своём роде девайс уникальный. На малине в софтовом режиме схожие задачи загрузят процессор на 100% или посадят батарейку. Если очень хочется прицепить машинное зрение на дрон — подключаем эту штуку и наслаждаемся. Других вариантов особо нет.
          • 0
            Какой-то форм-фактор для малинок странный, могли бы уже сделать его в голом виде.
        • 0
          Если интересно сравнение с CPU, то по нашим сведениям для CPU only на базе Cortex A57 quad core, этот тест будет примерно на порядок медленнее. Поэтому в железке есть реальный смысл, получить прирост в 10 раз на такой плате с ARM процессором имеет реальный экономический стимул.
          • 0
            Производительность чипа – около 100 гигафлопс
            А каких флопс, float mull(+add), или что-то другое?
            • +1
              Я не спец по чипам, это надо спецификацию Myriad 2 подробно смотреть, но в нейронках практически только умножения и сложения, так что, вероятно, да.
              • 0
                Вопрос скорее про тип данных, а не операций. В спецификации там
                Support for 16/32-bit floating point and 8/16/32-bit integer operations
                Вероятно, заявленная пиковая производительность достигается на половинной точности, а не одинарной (float).
            • 0
              Вот удивительно, в 90х суперкомпьютеры на сотню гигафлопс занимали огромные здания, жрали гигаватты электричества, но обрабатывали всякие невероятные научные данные по всяким невероятным формулам. Сегодня это маленький чип с ноготок, который ничего не потребляет, но при этом всё что из него можно выжать — чтобы он сказал что же у нас на фоточке нарисовано. По заранее обученной модели. Странные эти флопсы.
              • 0
                Видимо, эти невероятные формулы таки несколько проще формулы, позволяющей определить, что нарисовано на картинке :-)

                з.ы. да и к тому же — здесь таки, похоже, какое-то сильно специализированное решение. Что странного в уделывании им системы общего назначения?

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое