Ускорение рабочего процесса прототипирования для больших сетей с помощью Ethernet

В этом примере показов, как развернуть нейронную сеть для глубокого обучения и получить результаты предсказания с помощью подключения Ethernet к целевому устройству. Вы можете значительно ускорить развертывание и прогнозирование для больших нейронных сетей для глубокого обучения с помощью Ethernet по сравнению с JTAG. В этом примере показан рабочий процесс на ZCU102 плате СнК. Пример также работает с другими платами, поддерживаемыми Deep Learning HDL Toolbox. См. «Поддерживаемые сети, слои, платы и инструменты».

Необходимые условия

  • Xilinx ZCU102 комплект для разработки на SoC. Для получения помощи с настройкой платы смотрите Guided SD Card Set Up (Deep Learning HDL Toolbox Support Package for Xilinx FPGA and SoC Devices).

  • Пакет поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC

  • Deep Learning HDL Toolbox™

  • Модель Deep Learning Toolbox™ для сети AlexNet

Введение

Deep Learning HDL Toolbox устанавливает связь между платой хоста-компьютера и платой FPGA для нейронных сетей для глубокого обучения прототипов на оборудовании. Это подключение используется для развертывания нейронных сетей для глубокого обучения и запуска предсказаний. Связь предоставляет две услуги:

  • Программирование битового потока на FPGA

  • Связь с проектом, выполняемым на FPGA от MATLAB

Существует два оборудовании интерфейса для установления соединения между платой хоста-компьютера и платой FPGA: JTAG и Ethernet.

Интерфейс JTAG

Интерфейс JTAG программирует битовый поток на FPGA через JTAG. Битовый поток не является постоянным через циклы степени. Необходимо перепрограммировать битовый поток каждый раз, когда FPGA включен.

MATLAB использует JTAG для управления AXI Master IP в проекте FPGA, для связи с проектом, выполняемым на FPGA. Вы можете использовать AXI Master IP для чтения и записи местоположений памяти в встроенном процессоре памяти и глубокого обучения.

Этот рисунок показывает архитектуру интерфейса JTAG высокого уровня.

Интерфейс Ethernet

Интерфейс Ethernet использует процессор ARM для отправки и получения информации от проекта, работающего на FPGA. Процессор ARM работает на операционной системе Linux. Для взаимодействия с FPGA можно использовать сервисы операционной системы Linux. При использовании интерфейса Ethernet битовый поток загружается на карту SD. Битовый поток является постоянным через циклы степени и перепрограммируется каждый раз, когда FPGA включен. Процессор ARM сконфигурирован с правильным деревом устройств, когда битовый поток запрограммирован.

Для связи с проектом, работающим на FPGA, MATLAB использует соединение Ethernet между процессором хоста-компьютера и ARM. Процессор ARM запускает сервис LIBIIO, который взаимодействует с IP-адресом datamover в проекте FPGA. IP-адрес datamover используется для быстрой передачи данных между хостом-компьютером и FPGA, что полезно при прототипировании больших нейронных сетей для глубокого обучения, которые имели бы длительное время передачи по JTAG. Процессор ARM генерирует транзакции чтения и записи для доступа к местоположениям памяти как в встроенной памяти, так и в процессоре глубокого обучения.

На рисунке ниже показана архитектура интерфейса Ethernet высокого уровня.\

Загрузка и компиляция нейронной сети для глубокого обучения

Этот пример использует предварительно обученную последовательную сеть alexnet. Эта сеть является большой сетью, которая имеет значительное улучшение времени передачи при развертывании ее в FPGA с помощью Ethernet. Загрузка alexnet, выполните команду:

snet = alexnet;

Для просмотра слоев сети введите:

analyzeNetwork(snet);
% The saved network contains 25 layers including input, convolution, ReLU, cross channel normalization,
% max pool, fully connected, and the softmax output layers.

Чтобы развернуть нейронную сеть для глубокого обучения на целевой плате FPGA, создайте dlhdl.Workflow объект, который имеет предварительно обученную сеть snet как сеть и битовый поток для целевой платы FPGA. Этот пример использует битовый поток 'zcu102_single', который имеет один тип данных и сконфигурирован для платы ZCU102. Чтобы запустить этот пример на другой плате, используйте битовый поток для вашей платы.

hW = dlhdl.Workflow('Network', snet, 'Bitstream', 'zcu102_single');

Compile сеть alexnet для развертывания в FPGA.

hW.compile;
          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"        
    "OutputResultOffset"        "0x01800000"     "4.0 MB"         
    "SystemBufferOffset"        "0x01c00000"     "28.0 MB"        
    "InstructionDataOffset"     "0x03800000"     "4.0 MB"         
    "ConvWeightDataOffset"      "0x03c00000"     "16.0 MB"        
    "FCWeightDataOffset"        "0x04c00000"     "224.0 MB"       
    "EndOffset"                 "0x12c00000"     "Total: 300.0 MB"

Выходные выходы отображают размер скомпилированной сети, который составляет 300 МБ. Все 300 МБ передается в FPGA при помощи deploy способ. Из-за большого размера сети передача может занять значительное количество времени при использовании JTAG. При использовании Ethernet передача происходит быстро.

Развертывание нейронной сети для глубокого обучения в FPGA

Перед развертыванием сети необходимо сначала установить соединение с платой FPGA. The dlhdl.Target объект представляет это соединение между хостом-компьютером и FPGA. Создайте два целевых объекта, один для соединения через интерфейс JTAG и один для соединения через интерфейс Ethernet. Чтобы использовать соединение JTAG, установите Xilinx™ Vivado™ Design Suite 2019.2 и установите путь к установленному исполняемому файлу Xilinx Vivado, если он еще не установлен.

% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.2\bin\vivado.bat');
hTargetJTAG = dlhdl.Target('Xilinx', 'Interface', 'JTAG')
hTargetJTAG = 
  Target with properties:

       Vendor: 'Xilinx'
    Interface: JTAG

hTargetEthernet = dlhdl.Target('Xilinx', 'Interface', 'Ethernet')
hTargetEthernet = 
  Target with properties:

       Vendor: 'Xilinx'
    Interface: Ethernet
    IPAddress: '192.168.1.100'
     Username: 'root'
         Port: 22

Чтобы развернуть сеть, присвойте целевой объект dlhdl.Workflow объект и выполните deploy способ. Развертывание происходит в два этапа. Во-первых, битовый поток программируется на FPGA. Затем сеть передается в бортовую память.

Выберите интерфейс JTAG и время выполнения операции. Эта операция может занять несколько минут.

hW.Target = hTargetJTAG;
tic;
hW.deploy;
### Programming FPGA Bitstream using JTAG...
### Programming the FPGA bitstream has been completed successfully.
### Loading weights to FC Processor.
### 8% finished, current time is 29-Jun-2020 16:33:14.
### 17% finished, current time is 29-Jun-2020 16:34:20.
### 25% finished, current time is 29-Jun-2020 16:35:38.
### 33% finished, current time is 29-Jun-2020 16:36:56.
### 42% finished, current time is 29-Jun-2020 16:38:13.
### 50% finished, current time is 29-Jun-2020 16:39:31.
### 58% finished, current time is 29-Jun-2020 16:40:48.
### 67% finished, current time is 29-Jun-2020 16:42:02.
### 75% finished, current time is 29-Jun-2020 16:43:10.
### 83% finished, current time is 29-Jun-2020 16:44:23.
### 92% finished, current time is 29-Jun-2020 16:45:39.
### FC Weights loaded. Current time is 29-Jun-2020 16:46:31
elapsedTimeJTAG = toc
elapsedTimeJTAG = 1.0614e+03

Используйте интерфейс Ethernet путем установки dlhdl.Workflow целевой объект, для hTargetEthernet и выполнение deploy функция. При использовании Ethernet для развертывания битового потока и сети в FPGA происходит значительное ускорение развертывания сети.

hW.Target = hTargetEthernet;
tic;
hW.deploy;
### Programming FPGA Bitstream using Ethernet...
Downloading target FPGA device configuration over Ethernet to SD card ...
# Copied /tmp/hdlcoder_rd to /mnt/hdlcoder_rd
# Copying Bitstream hdlcoder_system.bit to /mnt/hdlcoder_rd
# Set Bitstream to hdlcoder_rd/hdlcoder_system.bit
# Copying Devicetree devicetree_dlhdl.dtb to /mnt/hdlcoder_rd
# Set Devicetree to hdlcoder_rd/devicetree_dlhdl.dtb
# Set up boot for Reference Design: 'AXI-Stream DDR Memory Access : 3-AXIM'

Downloading target FPGA device configuration over Ethernet to SD card done. The system will now reboot for persistent changes to take effect.


System is rebooting . . . . . .
### Programming the FPGA bitstream has been completed successfully.
### Loading weights to FC Processor.
### 8% finished, current time is 29-Jun-2020 16:47:08.
### 17% finished, current time is 29-Jun-2020 16:47:08.
### 25% finished, current time is 29-Jun-2020 16:47:09.
### 33% finished, current time is 29-Jun-2020 16:47:10.
### 42% finished, current time is 29-Jun-2020 16:47:10.
### 50% finished, current time is 29-Jun-2020 16:47:11.
### 58% finished, current time is 29-Jun-2020 16:47:13.
### 67% finished, current time is 29-Jun-2020 16:47:13.
### 75% finished, current time is 29-Jun-2020 16:47:15.
### 83% finished, current time is 29-Jun-2020 16:47:16.
### 92% finished, current time is 29-Jun-2020 16:47:18.
### FC Weights loaded. Current time is 29-Jun-2020 16:47:18
elapsedTimeEthernet = toc
elapsedTimeEthernet = 47.5854

Переход от JTAG к Ethernet- deploy функция перепрограммирует битовый поток, который составляет большую часть прошедшего времени. Перепрограммирование происходит из-за различных методов, которые используются для программирования битового потока для различных аппаратных интерфейсов. Интерфейс Ethernet конфигурирует процессор ARM и использует постоянный метод программирования, так что битовый поток перепрограммируется каждый раз, когда плата включена. При развертывании различных нейронных сетей для глубокого обучения с помощью одного и того же интерфейса bitstream и оборудования можно пропустить программирование bitstream, что еще больше ускоряет развертывание сети.

Запуск предсказания для примера изображения

Запустите предсказание для примера изображения при помощи predict способ.

imgFile = 'zebra.JPEG';
inputImg = imresize(imread(imgFile), [227,227]);
imshow(inputImg)

prediction = hW.predict(single(inputImg));
### Finished writing input activations.
### Running single input activations.
[val, idx] = max(prediction);
result = snet.Layers(end).ClassNames{idx}
result = 
'zebra'

Отпустите все аппаратные ресурсы, связанные с dlhdl.Target объекты.

release(hTargetJTAG)
release(hTargetEthernet)