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

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

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

  • Комплект разработчика Xilinx ZCU102 SoC. Для справки с настройкой платы смотрите Ведомую Настроенную SD-карту (Пакет поддержки Deep Learning HDL Toolbox для FPGA Xilinx и Устройств SoC).

  • Пакет поддержки Deep Learning HDL Toolbox™ для FPGA Xilinx и 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, чтобы управлять Основным IP AXI в проекте FPGA, связаться с проектом, работающим на FPGA. Можно использовать Основной IP AXI, чтобы считать и написать ячейки памяти в процессоре глубокого обучения и встроенной памяти.

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

Интерфейс Ethernet

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

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

Рисунок ниже показывает высокоуровневую архитектуру Ethernet interface.\

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

Этот пример использует предварительно обученную серийную сеть 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. dlhdl.Target объект представляет эту связь между хостом - компьютером и FPGA. Создайте два целевых объекта, один для связи через интерфейс JTAG и один для связи через интерфейс Ethernet. Чтобы использовать связь JTAG, установите Набор Проекта Xilinx™ Vivado™ 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 и использует персистентный метод программирования так, чтобы поток битов был повторно запрограммирован каждый раз, когда плата включена. При развертывании различных нейронных сетей для глубокого обучения при помощи того же потока битов и аппаратного интерфейса, можно пропустить программирование потока битов, которое далее ускоряет развертывание сети.

Запуститесь предсказание, например, отображают

Запустите предсказание для изображения в качестве примера при помощи 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)