exponenta event banner

Создание кода для сетей глубокого обучения с помощью вычислительной библиотеки ARM

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

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

Требования

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

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

  • Toolbox™ глубокого обучения.

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

Примечание

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

Создание кода с помощью 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. С пакетом поддержки, codegen перемещает сгенерированный код в Raspberry Pi и строит исполняемую программу на Raspberry Pi. При создании кода для конечного объекта, не имеющего пакета аппаратной поддержки, необходимо выполнить команды для перемещения созданных файлов и построения исполняемой программы.

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

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

Создание кода для глубокого обучения на Raspberry Pi

Если у вас есть пакет поддержки MATLAB для оборудования Raspberry Pi, чтобы создать код для глубокого обучения на 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

    Примечание

    Для создания кода можно задать входные данные с полуконкретностью. Однако тип генератора кода приводит входные данные к одинарной точности. Инструментарий глубокого обучения использует арифметику с одинарной точностью и плавающей запятой для всех вычислений в MATLAB.

Создание кода при отсутствии пакета поддержки оборудования

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

  1. Создание кода только на хосте Linux ® .

  2. Создайте объект конфигурации для библиотеки. Например:

    cfg = coder.config('lib');

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

  3. Настройте создание кода для создания кода C++ и только исходного кода.

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

  4. Чтобы задать создание кода с помощью библиотеки вычислений ARM, создайте 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

Пример см. в разделе Создание кода для глубокого обучения по целям ARM.

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

Последовательная сеть создается как класс 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();
};

setup() метод класса устанавливает дескрипторы и выделяет память для каждого уровня сетевого объекта. predict() способ вызывает прогнозирование для каждого из уровней в сети. Предположим, что создается код для функции точки входа, squeezenet_predict. В созданном файле «для вас »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

  1. Выполните шаги Выбрать исходные файлы (Select Source Files) и Определить типы ввода (Define Input Types).

  2. Перейдите к шагу Создать код. (Пропустите шаг Проверка ошибок времени выполнения, поскольку генерация MEX не поддерживается для генерации кода с помощью библиотеки вычислений ARM.)

  3. Установите язык на C++.

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

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

    • Для платы аппаратных средств выберите Raspberry Pi.

    • Чтобы получить доступ к настройкам Raspberry Pi, щелкните Дополнительные настройки. Затем щелкните Оборудование. Укажите адрес устройства, имя пользователя, пароль и каталог построения.

    Если у вас нет пакета поддержки для цели ARM:

    • Убедитесь, что тип построения - Static Library или Dynamic Library и установите флажок Только генерировать код.

    • Для платы аппаратных средств выберите None - Select device below.

    • Для параметра «Поставщик устройства» выберите ARM Compatible.

    • Для типа устройства:

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

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

    Примечание

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

  5. В области «Глубокое обучение» задайте для параметра «Целевая библиотека» значение ARM Compute. Укажите версию библиотеки вычислений ARM и архитектуру вычислений ARM.

  6. Создайте код.

См. также

| |

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