В этом примере показано, как развернуть нейронную сеть для глубокого обучения и получить результаты предсказания с помощью соединения Ethernet с целевым устройством. Можно значительно ускорить развертывание и времена предсказания для больших нейронных сетей для глубокого обучения при помощи Ethernet по сравнению с JTAG. Этот пример показывает рабочий процесс на плате ZCU102 SoC. Пример также работает над другими платами, поддержанными Deep Learning HDL Toolbox. Смотрите Поддерживаемые Сети, Слои и Советы.
Комплект разработчика Xilinx ZCU102 SoC. Для справки с настройкой платы смотрите Ведомого Setup 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, программирует поток битов на FPGA по JTAG. Поток битов не является персистентным через, подвергает циклу включения и выключения питания. Необходимо повторно программировать поток битов каждый раз, когда FPGA включен.
MATLAB использует JTAG, чтобы управлять Основным IP AXI в проекте FPGA, связаться с проектом, работающим на FPGA. Можно использовать Основной IP AXI, чтобы считать и написать ячейки памяти в процессоре глубокого обучения и встроенной памяти.
Этот рисунок показывает высокоуровневую архитектуру интерфейса JTAG.
Интерфейс 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 as t
он сеть и поток битов для вашей целевой платы 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™ 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
функция. Существует значительное ускорение в netwok развертывании, когда вы используете 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)