Заманчивый пример
http://www.nallatech.com/?s=Caffe+Integrationhttps://github.com/BVLC/caffe/ Удобно взять сверточную нейронную сеть (CNN) с архитектурой Caffe Integration на
http://caffe.berkeleyvision.org/ Ее разработали в лаборатории Berkeley Vision and Learning Center с многими энтузиастами.
При этом нужно отредактировать имеющийся XML-файл настроек, который описывает различные комбинации блоков в слоях нейронной сети. А это 4 слоя:
- слой свертки, сворачивающий маленькие кадрики с ядрами, соответствующими разным признакам, ка-то угол, линия.
- объединяющий слой, в котором группируются в подрегионы максимумы реакций сверточного слоя.
- слой детекторов,
- объединяющий слой в котором изображение интерпретируется как множество векторов.
Затем XML-файл компилируется с выдачей модели CNN под конкретную ПЛИС.
Другой возможностью быстро освоить CNN в ПЛИС является использование системы ImageNet, которая есть в свободном доступе вместе с тренировочными последовательностями и испытательными стендами.
В ней 5 сверточных слоя и 3 полносвязных слоя, на которые приходится более 99% времени работы сети.
В сверточных слоях стоят те же фильтры признаков размером 11×11, 5×5 или 3×3. Причем базовым фильтром является фильтр (3×3), а большие фильтры получаются повторением вычислений с этим фильтром.
Для реализации CNN в ПЛИС используются блоки DSP с умножителем с аккумулятором 18×18 bits. Новые ПЛИС Altera Arria 10 позволяют сконфигурировать в одном таком блоке 1 умножение с плавающей запятой или 2 умножения 18×19 с фиксированной запятой. А если коэффициенты уменьшить до 10 бит и менее, то такую операцию можно делать на сумматорах. Поэтому есть смысл соптимизировать алгоритм на фиксированную запятую, умножив этим самым производительность в 2-3 раза.
В системе ImageNet предлагается библиотека с интерфейсом OpenCL, в которой собраны модели свертывателей с разрядностью коэффициентов, начиная с 10 bit 3×3.
Так что в ПЛИС Arria10 GX 1150 помещается до ~512 сверточных блока из этой библиотеки.
В примере программирования CNN используется ускоритель на ПЛИС Nallatech 510T, который втыкается в РС или сервер как карта GPU. На ней стоят 2 FPGA Altera Arria 10 GX 1150 и внешня память, обмены с которой происходят со скоростью ~60 GBytes/sec. Типичное энергопотребление - 150W, т.е. более чем вдвое экономнее, чем у хорошего GPGPU.
В данном акселераторе обрабатываются параллельно 16 кадров, над каждым из которых трудятся 64 параллельных свертывателя. Так что выделются одновремено 8 особенностей изображения в 8 точках. Таким образом всего вычисляются 1024 свертки 3×3 параллельно.
В результате, на обработку каждого кадра тратится 9 миллисекунд, а с учетом распараллеливания кадров - в среднем, 748 микросекунд.Т.е. это более чем в 3 раза быстрее,чем на крутом GPU К40.