exponenta event banner

Cross Compile Deep Learning Code для целей ARM Neon

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

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

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

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

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

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

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

Предпосылки

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

  • Вычислительная библиотека ARM (на хост-компьютере)

  • MATLAB ® Coder™

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

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

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

  • Toolbox™ обработки изображений

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

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

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

Сведения об установке цепочки инструментов кросс-компилятора и настройке связанной переменной среды см. в разделе Cross-Compile Deep Learning Code That Uses ARM Compute Library (MATLAB Coder).

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

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

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

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

В этом примере используется сеть классификации изображений Inception-V3. Предварительно подготовленная Inception-V3 сеть для MATLAB доступна в пакете поддержки Deep Learning Toolbox Model for Inception-V3 Network. 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.

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

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

% generateImagetoTxt('peppers.png');

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

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

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

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

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

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

cfg.DeepLearningConfig = dlcfg;

Настройка цепочки инструментов кросс-компилятора

Настройте цепочку инструментов кросс-компилятора на основе архитектуры 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 команда для создания кода для функции начальной точки, создания сгенерированного кода и создания статической библиотеки для целевой архитектуры ARM.

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

Копирование созданной кросс-скомпилированной статической библиотеки на оконечное оборудование

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

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

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

  • имя хоста с именем устройства

  • 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 во время выполнения. Целевая плата не нуждается в файлах заголовков при создании исполняемого файла и запуске исполняемого файла. Скопируйте библиотеку по нужному пути.

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

Копирование поддерживающих файлов на целевое оборудование

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

  • Makefile 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-файл на целевом объекте для создания исполняемого файла из статической библиотеки. Этот makefile связывает статическую библиотеку с основным файлом оболочки main_inception_arm.cpp и генерирует исполняемый файл.

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

Запуск исполняемого файла на конечном объекте

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

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

Второй подход: Создание исполняемого файла для функции Entry-Point на хосте

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

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

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

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

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

cfg.DeepLearningConfig = dlcfg;

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

cfg.CustomSource = 'main_inception_arm.cpp';

Настройка цепочки инструментов кросс-компилятора

Настройте цепочку инструментов кросс-компилятора на основе архитектуры 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

Копирование созданного исполняемого файла на целевое оборудование

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

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

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

  • имя хоста с именем устройства

  • 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 на целевое оборудование

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

% 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.

% 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) | (Кодер MATLAB) | (Кодер MATLAB)

Связанные темы