В этом примере показано, как развернуть нейронную сеть для глубокого обучения и получить результаты предсказания с помощью соединения 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, программирует поток битов на 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
как сеть и поток битов для вашей целевой платы 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
функция. Существует значительное ускорение в развертывании сети, когда вы используете 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)