exponenta event banner

Запуск сетей только для свертки с использованием развертывания FPGA

Для понимания и отладки сверточных сетей использование и визуализация данных является полезным инструментом. В этом примере показано, как развернуть, запустить и отладить сеть только для свертки с помощью развертывания FPGA.

Предпосылки

  • Оценочный комплект Xilinx Zynq ZCU102

  • Пакет поддержки HDL Toolbox™ глубокого обучения для Xilinx FPGA и SoC

  • Глубокое обучение Toolbox™

  • Глубокое обучение HDL Toolbox™

  • Модель Toolbox™ глубокого обучения для сети Resnet-50

Resnet-50 Сеть

ResNet-50 - сверточная нейронная сеть глубиной 50 слоев. Эта предварительно обученная сеть может классифицировать изображения по 1000 категориям объектов (например, клавиатура, мышь, карандаш и т. д.). Сеть имеет размер входного изображения 224 на 224.

Загрузить сеть Resnet-50

Загрузите сеть ResNet-50.

rnet = resnet50;

Для визуализации структуры Resnet-50 сети в командной строке MATLAB введите:

analyzeNetwork(rnet)

Создание подмножества сети Resnet-50

Для проверки выходных данных max_pooling2d_1 создайте эту сеть, которая является подмножеством ResNet-50 сети:

layers = rnet.Layers(1:5);
outLayer = regressionLayer('Name','output');
layers(end+1) = outLayer;

snet = assembleNetwork(layers);

Создание целевого объекта

Создайте целевой объект с пользовательским именем и интерфейсом для подключения целевого устройства к хост-компьютеру. Опции интерфейса - JTAG и Ethernet. Для использования JTAG установите Xilinx™ Vivado™ Design Suite 2019.2. Чтобы задать траекторию инструмента Xilinx Vivado, введите:

%hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'D:/share/apps/HDLTools/Vivado/2019.2-mw-0/Win/Vivado/2019.2\bin\vivado.bat');
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');

Создание объекта рабочего процесса

Создание объекта dlhdl.Workflow класс. При создании объекта укажите сеть и имя битового потока. Укажите сохраненную предварительно подготовленную сеть ResNet-50 подмножества, snet, как сеть. Убедитесь, что имя битового потока соответствует типу данных и целевой плате FPGA. В этом примере целевой платой FPGA является плата Xilinx ZCU102 SOC. Битовый поток использует один тип данных.

hW = dlhdl.Workflow('network', snet, 'Bitstream', 'zcu102_single','Target',hTarget);

Компиляция измененной сети серии Resnet-50

Для компиляции измененной сети серии ResNet-50 запустите функцию компиляции dlhdl.Workflow объект.

hW.compile

dn = hW.compile
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
          offset_name          offset_address    allocated_space 
    _______________________    ______________    ________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"       
    "OutputResultOffset"        "0x01800000"     "24.0 MB"       
    "SystemBufferOffset"        "0x03000000"     "28.0 MB"       
    "InstructionDataOffset"     "0x04c00000"     "4.0 MB"        
    "ConvWeightDataOffset"      "0x05000000"     "4.0 MB"        
    "EndOffset"                 "0x05400000"     "Total: 84.0 MB"
dn = struct with fields:
       Operators: [1×1 struct]
    LayerConfigs: [1×1 struct]
      NetConfigs: [1×1 struct]

Передача битового потока в FPGA и загрузка веса сети

Для развертывания сети на оборудовании Xilinx ZCU102 выполните функцию развертывания dlhdl.Workflow объект. Эта функция использует выходные данные функции компиляции для программирования платы FPGA с помощью файла программирования. Он также загружает веса сети и отклонения. Функция развертывания программирует устройство FPGA, отображает сообщения о ходе выполнения и время, необходимое для развертывания сети.

hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA.
### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA.

Загрузить пример изображения

Загрузка и отображение изображения для использования в качестве входного изображения в последовательной сети.

I = imread('daisy.jpg');
imshow(I)

Выполнить прогнозирование

Выполнение функции прогнозирования dlhdl.Workflow объект.

[P, speed] = hW.predict(single(I),'Profile','on');
### Finished writing input activations.
### Running single input activations.
              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                    2813005                  0.01279                       1            2813015             78.2
    conv_module            2813005                  0.01279 
        conv1              2224168                  0.01011 
        max_pooling2d_1     588864                  0.00268 
 * The clock frequency of the DL processor is: 220MHz

Результирующие данные возвращаются в виде массива 3-D с индексацией третьего измерения по 64 изображениям элементов.

sz = size(P)
sz = 1×3

    56    56    64

Чтобы визуализировать все 64 элемента в одном изображении, данные преобразуются в 4 размера, что соответствует вводу в imtile функция

R = reshape(P, [sz(1) sz(2) 1 sz(3)]);
sz = size(R)
sz = 1×4

    56    56     1    64

Вход в imtile нормализовано с помощью mat2gray. Все значения масштабируются таким образом, что минимальная активация равна 0, а максимальная активация равна 1.

J = imtile(mat2gray(R), 'GridSize', [8 8]);

Чтобы показать эти активации с помощью imtile измените форму массива на 4-D. Третье измерение на входе в imtile представляет цвет изображения. Установите третий размер размером 1, поскольку активации не имеют цвета. Четвертое измерение индексирует канал. Размер сетки 8x8 выбран, так как требуется отобразить 64 элемента.

imshow(J)

Яркие черты указывают на сильную активацию. Для понимания и отладки сверточных сетей использование и визуализация данных является полезным инструментом.