В этом примере показано, как развернуть сеть глубокого обучения и получить результаты прогнозирования с помощью подключения 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 программирует поток битов на FPGA через JTAG. Битовый поток не является постоянным в циклах мощности. При каждом включении FPGA необходимо перепрограммировать поток битов.
MATLAB использует JTAG для управления AXI Master IP в конструкции FPGA, для связи с конструкцией, работающей на FPGA. Вы можете использовать AXI Master IP для чтения и записи ячеек памяти в встроенной памяти и процессоре глубокого обучения.
На этом рисунке показана высокоуровневая архитектура интерфейса JTAG.

Интерфейс 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. 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)