exponenta event banner

Ускорение процесса создания прототипов для крупных сетей с помощью Ethernet

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

Предпосылки

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

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

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

  • Модель 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-адресом памяти данных в конструкции FPGA. IP-память данных используется для быстрой передачи данных между хост-компьютером и 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. 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 и использует метод постоянного программирования, так что поток битов перепрограммируется при каждом включении платы. При развертывании различных сетей глубокого обучения с использованием одного и того же битового потока и аппаратного интерфейса можно пропустить программирование битового потока, что еще больше ускорит развертывание сети.

Прогон прогнозирования для примера изображения

Выполните прогноз для примера изображения с помощью 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)