Генерация кода для нейронных сетей для глубокого обучения с вычислительной библиотекой ARM

С MATLAB® Coder™ можно сгенерировать код для предсказания от уже обученной сверточной нейронной сети (CNN), нацеленной на встроенную платформу, использующую ARM® процессор, поддерживающий расширение NEON. Генератор кода использует преимущества ARM Compute Library для компьютерного зрения и машинного обучения. Сгенерированный код реализует CNN, который имеет архитектуру, слои и параметры, указанные во входе SeriesNetwork (Deep Learning Toolbox) или DAGNetwork (Deep Learning Toolbox) сетевой объект.

Сгенерируйте код с помощью одного из следующих методов:

Требования

  • Интерфейс MATLAB Coder для библиотек глубокого обучения. Чтобы установить пакет поддержки, выберите его в меню Add-Ons MATLAB.

  • Библиотека ARM Compute Library для компьютерного зрения и машинного обучения должна быть установлена на целевом компьютере.

  • Deep Learning Toolbox™.

  • Переменные окружения для компиляторов и библиотек.

Примечание

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

Генерация кода при помощи codegen

Чтобы сгенерировать код для глубокого обучения на ARM-цели при помощи codegen:

  • Написание функции точки входа, которая загружает предварительно обученный CNN и вызовы predict. Для примера:

    function out = squeezenet_predict(in)
    %#codegen
    
    persistent net;
    opencv_linkflags = '`pkg-config --cflags --libs opencv`';
    coder.updateBuildInfo('addLinkFlags',opencv_linkflags);
    if isempty(net)
        net = coder.loadDeepLearningNetwork('squeezenet', 'squeezenet');
    end
    
    out = net.predict(in);
    end
    

  • Если вашим целевым компьютером является Raspberry Pi™, можно воспользоваться пакетом поддержки MATLAB для Raspberry Pi Hardware. С пакетом поддержки, codegen перемещает сгенерированный код в Raspberry Pi и создает исполняемую программу на Raspberry Pi. Когда вы генерируете код для цели, которая не имеет пакета аппаратной поддержки, вы должны запустить команды, чтобы переместить сгенерированные файлы и создать исполняемую программу.

  • Генерация MEX не поддерживается для генерации кода для глубокого обучения на целевых устройствах ARM.

  • Для ARM, для входов к predict (Deep Learning Toolbox) с несколькими изображениями или наблюдениями (N > 1), а MiniBatchSize больше 1 не поддерживается. Задайте MiniBatchSize от 1.

Генерация кода для глубокого обучения на Raspberry Pi

Когда у вас есть MATLAB Support Package for Raspberry Pi Hardware, чтобы сгенерировать код для глубокого обучения на Raspberry Pi:

  1. Для подключения к Raspberry Pi используйте raspi(Пакет поддержки MATLAB для оборудования Raspberry Pi). Для примера:

    r = raspi('raspiname','username','password');
    

  2. Создайте объект строения генерации кода для библиотеки или исполняемого файла при помощи coder.config. Установите TargetLang свойство к 'C++'.

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

  3. Создайте объект строения глубокого обучения при помощи coder.DeepLearningConfig. Установите ArmComputeVersion и ArmArchitecture свойства. Установите DeepLearningConfig свойство объекта строения генерации кода к coder.ARMNEONConfig объект. Для примера:

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

  4. Чтобы сконфигурировать аппаратные настройки генерации кода для Raspberry Pi, создайте coder.Hardware объект, при помощи coder.hardware. Установите Hardware свойство объекта строения генерации кода к coder.Hardware объект.

    hw = coder.hardware('Raspberry Pi');
    cfg.Hardware = hw;
    

  5. Если вы генерируете исполняемую программу, предоставьте основную программу на C++. Для примера:

    cfg.CustomSource = 'main.cpp';

  6. Чтобы сгенерировать код, используйте codegen. Задайте объект строения генерации кода при помощи -config опция. Для примера:

    codegen -config cfg squeezenet_predict -args {ones(227, 227, 3,'single')} -report

    Примечание

    Можно задать входы половинной точности для генерации кода. Однако тип генератора кода приводит входы к одинарной точности. Deep Learning Toolbox использует арифметику с одной точностью и плавающей точкой для всех расчетов в MATLAB.

Генерация кода, когда у вас нет пакета аппаратной поддержки

Чтобы сгенерировать код для глубокого обучения, когда у вас нет пакета аппаратной поддержки для целевого устройства:

  1. Сгенерируйте код на Linux® только хост.

  2. Создайте объект строения для библиотеки. Для примера:

    cfg = coder.config('lib');

    Не используйте объект строения для исполняемой программы.

  3. Сконфигурируйте генерацию кода, чтобы сгенерировать код С++ и сгенерировать только исходный код.

    cfg.GenCodeOnly = true;
    cfg.TargetLang = 'C++';

  4. Чтобы задать генерацию кода с помощью ARM Compute Library, создайте coder.ARMNEONConfig объект при помощи coder.DeepLearningConfig. Установите ArmComputeVersion и ArmArchitecture свойства. Установите DeepLearningConfig свойство объекта строения генерации кода к coder.ARMNEONConfig объект.

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

  5. Чтобы сконфигурировать параметры генерации кода, специфичные для целевого компьютера, установите ProdHWDeviceType свойство HardwareImplementation объект.

    • Для архитектуры ARMv7 используйте 'ARM Compatible->ARM Cortex'.

    • для архитектуры ARMv8 используйте 'ARM Compatible->ARM 64-bit (LP64)'.

    Для примера:

    cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM 64-bit (LP64)';

  6. Чтобы сгенерировать код, используйте codegen. Задайте объект строения генерации кода при помощи -config опция. Для примера:

    codegen -config cfg squeezenet_predict -args {ones(227, 227, 3, 'single')} -d arm_compute

Для получения примера смотрите Code Generation for Deep Learning on ARM Targets.

Сгенерированный код

Сеть серии генерируется как класс C++, содержащий массив классов слоев.

class b_squeezenet_0
{
 public:
  int32_T batchSize;
  int32_T numLayers;
  real32_T *inputData;
  real32_T *outputData;
  MWCNNLayer *layers[68];
 private:
  MWTargetNetworkImpl *targetImpl;
 public:
  b_squeezenet_0();
  void presetup();
  void postsetup();
  void setup();
  void predict();
  void cleanup();
  real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex);
  ~b_squeezenet_0();
};

The setup() метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. The predict() метод вызывает предсказание для каждого из слоев в сети. Предположим, что вы генерируете код для функции точки входа, squeezenet_predict. В сгенерированном файле «for you», squeezenet_predict.cpp, функцию точки входа squeeznet_predict() создает статический объект b_squeezenet_0 типа классов и вызывает setup и predict на сетевом объекте.

static b_squeezenet_0 net;
static boolean_T net_not_empty;

// Function Definitions
//
// A persistent object net is used to load the DAGNetwork object.
//  At the first call to this function, the persistent object is constructed and
//  set up. When the function is called subsequent times, the same object is reused
//  to call predict on inputs, avoiding reconstructing and reloading the
//  network object.
// Arguments    : const real32_T in[154587]
//                real32_T out[1000]
// Return Type  : void
//
void squeezenet_predict(const real32_T in[154587], real32_T out[1000])
{
  //  Copyright 2018 The MathWorks, Inc.
  if (!net_not_empty) {
    DeepLearningNetwork_setup(&net);
    net_not_empty = true;
  }

  DeepLearningNetwork_predict(&net, in, out);
}

Двоичные файлы экспортируются для слоев, которые имеют параметры, такие как полносвязные и свертки в сети. Например, файлы с именами, имеющими шаблон cnn_squeezenet_*_w и cnn_squeezenet_*_b соответствуют весам и параметрам смещения для слоев свертки в сети.

cnn_squeezenet_conv10_b            
cnn_squeezenet_conv10_w            
cnn_squeezenet_conv1_b             
cnn_squeezenet_conv1_w             
cnn_squeezenet_fire2-expand1x1_b   
cnn_squeezenet_fire2-expand1x1_w   
cnn_squeezenet_fire2-expand3x3_b   
cnn_squeezenet_fire2-expand3x3_w   
cnn_squeezenet_fire2-squeeze1x1_b  
cnn_squeezenet_fire2-squeeze1x1_w 
...

Генерация кода для квантованных нейронных сетей для глубокого обучения

Смотрите Генерацию кода для квантованных нейронных сетей для глубокого обучения.

Генерация кода при помощи приложения MATLAB Coder

  1. Выполните Select Source Files и Define Input Types шаги.

  2. Переходите к Generate Code шагу. (Пропустите шаг Check for Run-Time Issues, поскольку генерация MEX не поддерживается для генерации кода с помощью библиотеки ARM Compute Library.)

  3. Установите Language значение C++.

  4. Укажите целевое оборудование ARM.

    Если вашим целевым компьютером является Raspberry Pi, и вы установили пакет поддержки MATLAB для Raspberry Pi Hardware:

    • Для Hardware Board выберите Raspberry Pi.

    • Для доступа к настройкам Raspberry Pi нажмите More Settings. Затем нажмите Hardware. Задайте Device Address, Username, Password и Build directory.

    Когда у вас нет пакета поддержки для вашего ARM-целевого устройства:

    • Убедитесь, что Build type Static Library или Dynamic Library и установите флажок Generate code only.

    • Для Hardware Board выберите None - Select device below.

    • Для Device vendor выберите ARM Compatible.

    • Для Device type:

      • Для архитектуры ARMv7 выберите ARM Cortex.

      • Для архитектуры ARMv8 выберите ARM 64-bit (LP64).

    Примечание

    Если вы генерируете код для глубокого обучения на ARM-цели и не используете пакет аппаратной поддержки, сгенерируйте код только на хосте Linux.

  5. На панели Deep Learning задайте Target library ARM Compute. Задайте ARM Compute Library version и ARM Compute Architecture.

  6. Сгенерируйте код.

См. также

| |

Похожие темы