Перекрестное скомпилирование кода глубокого обучения для ARM Neon Target

В этом примере показано, как скомпилировать сгенерированный код глубокого обучения для создания библиотеки или исполняемого файла, а затем развернуть библиотеку или исполняемый файл на цели ARM ®, такой как Hikey 960 или Rock 960. Этот пример использует codegen команда.

Кросс-компиляция кода глубокого обучения для целей ARM ® включает следующие шаги:

  • Сконфигурируйте установленный набор инструментов кросс-компилятора для выполнения компиляции на хосте MATLAB ®. Компиляция происходит, когда вы запускаете codegen команда в MATLAB в хост-компьютер.

  • Используйте codegen Команда, чтобы создать сгенерированный код и создать библиотеку или исполняемый файл на хост-компьютер.

  • Скопируйте сгенерированную библиотеку или исполняемый файл и другие вспомогательные файлы на целевой компьютер. Если вы генерируете библиотеку на хост-компьютер, скомпилируйте скопированный make-файл на целевой файл, чтобы создать исполняемый файл.

  • Запустите сгенерированный исполняемый файл на целевом оборудовании ARM.

Можно использовать этот рабочий процесс для любой цели ARM Neon, которая поддерживает набор инструкций Neon 'SIMD. Этот пример поддерживается только для хост-платформ Linux ® .

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

  • Процессор ARM, поддерживающий расширение Neon 'SIMD

  • ARM Compute Library (на хост-компьютер)

  • MATLAB ® Coder™

  • Пакет поддержки MATLAB Coder Interface для глубокого обучения

  • Deep Learning Toolbox™

  • Пакет поддержки Deep Learning Toolbox Model для Inception-v3 Network

  • Image Processing Toolbox™

  • Для развертывания на объекте armv7 (32-разрядная архитектура Arm Architecture), g++-arm-linux-gnueabihf GNU/GCC toolchain

  • Для развертывания на объекте armv8 (64-разрядная архитектура Arm Architecture), GNU/GCC g++-aarch64-linux-gnu toolchain

  • Окружение переменные для перекрестных компиляторов и библиотек

Для получения информации о том, как установить набор инструментов кросс-компилятора и настроить связанную переменную окружения, смотрите Cross-Compile Deep Learning Code Который использует ARM Compute Library (MATLAB Coder).

Версия библиотеки ARM Compute, которую использует этот пример, может быть не последней версией, которая поддержки генерацию кода. Для получения информации о поддерживаемых версиях библиотек и о переменных окружения, смотрите Необходимые условия для глубокого обучения с MATLAB Coder (MATLAB Coder).

Код, линии в этом примере, комментируется. Раскомментируйте их перед запуском примера.

Этот пример не поддерживается в MATLAB Online.

The inception_predict_arm Функция точки входа

Этот пример использует Inception-V3 сеть классификации изображений. Предварительно обученная сеть Inception-V3 для MATLAB доступна в пакете поддержки Deep Learning Toolbox Model for Inception-V3 Network. The inception_predict_arm функция точки входа загружает Inception-V3 сеть в объект постоянной сети. При последующих вызовах функции постоянный объект используется повторно.

type inception_predict_arm
function out = inception_predict_arm(in)

persistent net;
if isempty(net)
    net = coder.loadDeepLearningNetwork('inceptionv3','inceptionv3');
end

out = net.predict(in);

end

Настройте объект строения глубокого обучения

Создайте coder.ARMNEONConfig объект. Укажите версию библиотеки ARM Compute.

dlcfg = coder.DeepLearningConfig('arm-compute');
dlcfg.ArmComputeVersion = '19.05';

Для классификации входа изображения peppers.pngпреобразуйте изображение в текстовый файл.

% generateImagetoTxt('peppers.png');

Первый подход: создайте статическую библиотеку для функции точки входа на хосте

В этом подходе вы сначала скомпилируете сгенерированный код, чтобы создать статическую библиотеку на хост-компьютер. Затем сгенерированная статическая библиотека, файлы библиотеки ARM Compute, make-файл и другие вспомогательные файлы передаются на целевой компьютер. Вы запускаете make-файл на целевом компьютере, чтобы сгенерировать исполняемый файл. Наконец, исполняемый файл запускается на целевом компьютере.

Настройка объекта строения генерации кода

Создайте объект строения генерации кода для статической библиотеки. Задайте целевой язык как C++.

cfg = coder.config('lib');
cfg.TargetLang = 'C++';

Присоедините объект строения глубокого обучения к объекту строения генерации кода.

cfg.DeepLearningConfig = dlcfg;

Сконфигурируйте набор инструментов Cross-Compiler

Сконфигурируйте набор инструментов кросс-компилятора на основе архитектуры ARM целевого устройства.

%   cfg.Toolchain =  'Linaro AArch64 Linux v6.3.1';% When the Arm Architecture is armv8

%   cfg.Toolchain =  'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7

Сгенерируйте статическую библиотеку на Хост-компьютер при помощи codegen

Используйте codegen команда, чтобы сгенерировать код для функции точки входа, создать сгенерированный код и создать статическую библиотеку для целевой архитектуры ARM.

% codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_lib -report

Скопируйте сгенерированную Cross-Compiled статическую библиотеку на целевой компьютер

Скопируйте статическую библиотеку, файлы интервала и файлы заголовков из сгенерированной папки arm_compute_cc_lib к целевому оборудованию ARM. В этом коде и других линиях кода линий которые следуют, замените:

  • пароль с вашим паролем

  • имя пользователя с именем пользователя

  • hostname с именем вашего устройства

  • targetDir с целевой папкой для файлов

% system('sshpass -p password scp -r arm_compute_cc_lib/*.bin arm_compute_cc_lib/*.lib arm_compute_cc_lib/*.h arm_compute_cc_lib/*.hpp username@hostname:targetDir/');

Скопируйте файлы вычислительной библиотеки ARM на целевой компьютер

Исполняемый файл использует файлы библиотеки ARM Compute во время выполнения. Целевая плата не нуждается в файлах заголовков при генерации исполняемого файла и запуске исполняемого файла. Скопируйте библиотеку в нужный путь.

% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);

Копирование вспомогательных файлов на целевой компьютер

Скопируйте эти файлы на целевое оборудование ARM:

  • Файлы make Makefile_Inceptionv3 чтобы сгенерировать исполняемый файл из статической библиотеки.

  • Вход изображений inputimage.txt которые необходимо классифицировать.

  • Текстовый файл synsetWords.txt, который содержит имена классов, возвращенные net.Layers(end).Classes

  • Основной файл оболочки main_inception_arm.cpp который вызывает код, сгенерированный для inception_predict_arm функция.

% system('sshpass -p password scp synsetWords.txt ./Makefile_Inceptionv3 ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');

Создайте исполняемый файл на целевом компьютере

Скомпилируйте файл make на целевом компьютере, чтобы сгенерировать исполняемый файл из статической библиотеки. Этот make-файл связывает статическую библиотеку с основным файлом оболочки main_inception_arm.cpp и генерирует исполняемый файл.

% system('sshpass -p password ssh username@hostname "make -C targetDir -f Makefile_Inceptionv3 arm_inceptionv3 "');

Запуск исполняемого файла на целевом компьютере

Запустите сгенерированный исполняемый файл в целевой системе. Убедитесь, что экспортируйте LD_LIBRARY_PATH, который указывает на файлы библиотеки ARM Compute, во время выполнения исполняемого файла.

% system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');

Второй подход: создайте исполняемый файл для функции точки входа на хосте

В этом подходе вы сначала скомпилируете сгенерированный код, чтобы создать исполняемый файл на хост-компьютер. Затем сгенерированный исполняемый файл, файлы библиотеки ARM Compute и другие вспомогательные файлы передаются на целевой компьютер. Наконец, исполняемый файл запускается на целевом компьютере.

Настройка объекта строения генерации кода

Создайте объект строения генерации кода для генерации исполняемого файла. Установите целевой язык как C++.

cfg = coder.config('exe');
cfg.TargetLang = 'C++';

Присоедините объект строения глубокого обучения к объекту строения генерации кода.

cfg.DeepLearningConfig = dlcfg;

Объявить основной файл оболочки main_inception_arm.cpp как пользовательский исходный файл.

cfg.CustomSource = 'main_inception_arm.cpp';

Сконфигурируйте набор инструментов Cross-Compiler

Сконфигурируйте набор инструментов кросс-компилятора на основе архитектуры ARM целевого устройства.

%   cfg.Toolchain =  'Linaro AArch64 Linux v6.3.1'; % When the Arm Architecture is armv8,

%   cfg.Toolchain =  'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7,

Сгенерируйте исполняемый файл на Хост-компьютер при помощи codegen

Используйте codegen команда для генерации кода для функции точки входа, создания сгенерированного кода и создания исполняемого файла для целевой архитектуры ARM.

% codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_exe -report

Скопируйте сгенерированный исполняемый файл на целевой компьютер

Скопируйте сгенерированный исполняемый файл и файлы интервала на целевое оборудование ARM. В этом коде и других линиях кода линий которые следуют, замените:

  • пароль с вашим паролем

  • имя пользователя с именем пользователя

  • hostname с именем вашего устройства

  • targetDir с целевой папкой для файлов

% system('sshpass -p password scp -r arm_compute_cc_exe/*.bin username@hostname:targetDir/');
% system('sshpass -p password scp inception_predict_arm.elf username@hostname:targetDir/');

Скопируйте файлы ARM Compute Library на целевой компьютер

Исполняемый файл использует файлы библиотеки ARM Compute во время выполнения. Он не использует заголовочные файлы во время выполнения. Скопируйте файлы библиотеки в нужный путь.

% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);

Копирование вспомогательных файлов на целевой компьютер

Скопируйте эти файлы на целевое оборудование ARM:

  • Вход изображений inputimage.txt которые необходимо классифицировать.

  • Текстовый файл synsetWords.txt, который содержит имена классов, возвращенные net.Layers(end).Classes

  • Основной файл оболочки main_inception_arm.cpp который вызывает код, сгенерированный для inception_predict_arm функция.

% system('sshpass -p password scp synsetWords.txt ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');

Запуск исполняемого файла на целевом компьютере

Запустите сгенерированный исполняемый файл в целевой системе. Убедитесь, что экспортируйте LD_LIBRARY_PATH, который указывает на файлы библиотеки ARM Compute, во время выполнения исполняемого файла.

% system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');

Перенесите выходные данные из целевого устройства в MATLAB

Скопируйте сгенерированный выход обратно в текущий Сеанс работы с MATLAB на хост-компьютер.

% system('sshpass -p password scp username@hostname:targetDir/out.txt ./');

Сопоставить Предсказание Счетов с метками

Сопоставьте пять лучших счетов предсказания с соответствующими метками в обученной сети.

% outputImage = mapPredictionScores;

% Display the overlayed Image with Classification Scores.  

% imshow(outputImage);

См. также

(MATLAB Coder) | (MATLAB Coder) | (MATLAB Coder)

Похожие темы