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

С GPU Coder™ можно сгенерировать код для прогноза от уже обученной сверточной нейронной сети, предназначаясь для нескольких встроенных платформ то использование процессоры NVIDIA® Tegra®. GPU Coder использует в своих интересах библиотеки NVIDIA cuDNN для NVIDIA графические процессоры. Сгенерированный код реализует CNN с архитектурой, слоями и параметрами, заданными в сетевом объекте входа SeriesNetwork или DAGNetwork. Можно сгенерировать код для сверточных сетей при помощи одного из методов:

  • Стандартный codegen функционирует для генерации кода CUDA® из кода MATLAB®.

  • Команда cnncodegen, которая генерирует код CUDA и создает статическую библиотеку для CNN.

  • Приложение GPU Coder.

Когда вы генерируете код для нейронной сети при помощи codegen или приложения GPU Coder, сгенерированный код использует главное столбцом размещение для ваших данных массива. Чтобы совпадать с главным строкой размещением, которое использует библиотека глубокого обучения, генератор кода должен вставить операции, чтобы преобразовать главное столбцом размещение в главное строкой размещение. Эти операции преобразования могут ухудшить производительность сгенерированного кода. Генерация кода для глубоких нейронных сетей не поддерживает кодер главные строкой опции, такие как параметр конфигурации RowMajor.

Пример AlexNet

Этот пример показывает, как сгенерировать код от объекта SeriesNetwork при помощи codegen, cnncodegen и приложения. В этом примере SeriesNetwork реализует архитектуру AlexNet, обученную классификации набора данных ImageNet.

Требования

  • Deep Learning Toolbox™.

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

  • На Windows генерация кода для нейронных сетей для глубокого обучения с функцией codegen требует Microsoft® Visual Studio® 2015 или выше.

  • Инструментарий CUDA и cuDNN библиотеки. Для получения дополнительной информации смотрите Устанавливающие Необходимые как условие продукты.

  • Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.

О сети AlexNet

Модель Deep Learning Toolbox для Сети AlexNet обеспечивает предварительно обученную архитектуру AlexNet, обученную классификации набора данных ImageNet. Используйте функцию alexnet, чтобы получить предварительно обученную сеть.

net = alexnet;

Объект net содержит объект SeriesNetwork. Это содержит 25 слоев включая свертку, полностью соединенную, и классификация выходные слои. Вы видите детали архитектуры при помощи записи через точку.

net.Layers
25x1 Layer array with layers:

     1   'data'                 Image Input                   227x227x3 images
                                                               with 'zerocenter'
                                                               normalization
     2   'conv1'                 Convolution                   96 11x11x3 
                                                               convolutions 
                                                               with stride 
                                                               [4  4] and 
                                                               padding [0  0]
     3   'relu1'                 ReLU                          ReLU
     4   'norm1'                 Cross Channel Normalization   cross channel 
                                                               normalization 
                                                               with 5 channels 
                                                               per element
     5   'pool1'                 Max Pooling                   3x3 max pooling 
                                                               with stride 
                                                               [2  2] and 
                                                               padding [0  0]
     6   'conv2'                 Convolution                   256 5x5x48 
                                                               convolutions with
                                                               stride [1  1] and 
                                                               padding [2  2]
     7   'relu2'                 ReLU                          ReLU
     8   'norm2'                 Cross Channel Normalization   cross channel 
                                                               normalization 
                                                               with 5 channels 
                                                               per element
     9   'pool2'                 Max Pooling                   3x3 max pooling 
                                                               with stride 
                                                               [2  2] and 
                                                               padding [0  0]
    10   'conv3'                 Convolution                   384 3x3x256 
                                                               convolutions with 
                                                               stride [1  1] 
                                                               and padding 
                                                               [1  1]
    11   'relu3'                 ReLU                          ReLU
    12   'conv4'                 Convolution                   384 3x3x192 
                                                               convolutions with
                                                               stride [1  1] 
                                                               and padding [1  1]
    13   'relu4'                 ReLU                          ReLU
    14   'conv5'                 Convolution                   256 3x3x192
                                                               convolutions with
                                                               stride [1  1] and 
                                                               padding [1  1]
    15   'relu5'                 ReLU                          ReLU
    16   'pool5'                 Max Pooling                   3x3 max pooling
                                                               with stride [2  2]
                                                               and padding [0  0]
    17   'fc6'                   Fully Connected               4096 fully 
                                                               connected layer
    18   'relu6'                 ReLU                          ReLU
    19   'drop6'                 Dropout                       50% dropout
    20   'fc7'                   Fully Connected               4096 fully
                                                               connected layer
    21   'relu7'                 ReLU                          ReLU
    22   'drop7'                 Dropout                       50% dropout
    23   'fc8'                   Fully Connected               1000 fully
                                                               connected layer
    24   'prob'                  Softmax                       softmax
    25   'output'                Classification Output         crossentropyex 
                                                               with 'tench',
                                                               'goldfish', and 
                                                               998 other classes

Для получения дополнительной информации об этих слоях смотрите, Задают Слои Сверточной Нейронной сети (Deep Learning Toolbox).

Генерация кода Используя codegen

В этом методе вы написали функцию точки входа в MATLAB и используете функцию coder.loadDeepLearningNetwork, чтобы загрузить модель глубокого обучения, создать и настроить класс CNN. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.

Вы затем используете метод predict, чтобы предсказать ответы. Можно также использовать метод activations для сетевых активаций для определенного слоя. Например,

out = activations(mynet,in,layerIdx,'OutputAs','Channels');
возвращает сетевые активации для слоя, заданного в layerIdx. Для указаний и ограничений по применению метода activations смотрите соответствующую запись в таблице Supported Functions.

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

Функция alexnet_predict.m берет вход изображений и запускает прогноз на изображении с помощью нейронной сети для глубокого обучения alexnet. Функция загружает сетевой объект в персистентную переменную mynet. На последующих вызовах функции постоянный объект снова используется для прогноза.

function out = alexnet_predict(in) %#codegen

% A persistent object mynet is used to load the series network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call predict on inputs, thus avoiding reconstructing and reloading the
% network object.

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('alexnet','alexnet');
end

% pass in input   
out = predict(mynet,in); 

Создайте объект GPU Configuration для цели MEX, устанавливающей выходной язык на C++. Чтобы задать параметры генерации кода для cuDNN, установите свойство DeepLearningConfig на объект coder.CuDNNConfig, который вы создаете с coder.DeepLearningConfig. Запустите команду codegen, задающую вход размера [227,227,3]. Этот входной размер соответствует входному размеру слоя сети AlexNet.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); 
codegen -config cfg alexnet_predict -args {ones(227,227,3)} -report

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

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

class b_alexnet
{
   ...
   public:
     b_alexnet();
     ...     
     void setup();
     void predict();
     void cleanup();
     ...     
     ~b_alexnet();
};

Метод setup() класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. Метод predict() вызывает прогноз для каждого из этих 25 слоев в сети. Функция точки входа alexnet_predict() в файле сгенерированного кода alexnet_predict.cu создает статический объект b_alexnet типа класса и вызывает настройку, и предскажите на этом сетевом объекте.

static b_alexnet_0 mynet;
static boolean_T mynet_not_empty;

// Function Definitions

//
// A persistent object mynet is used to load the series network object.
//  At the first call to this function, the persistent object is constructed and
//  setup. When the function is called subsequent times, the same object is reused
//  to call predict on inputs, thus avoiding reconstructing and reloading the
//  network object.
// Arguments    : const real_T in[154587]
//                real32_T out[1000]
// Return Type  : void
//
void alexnet_predict(const real_T in[154587], real32_T out[1000])
{
  if (!mynet_not_empty) {
    DeepLearningNetwork_setup(&mynet);
    mynet_not_empty = true;
  }

  //  pass in input
  DeepLearningNetwork_predict(&mynet, in, out);
}

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

Примечание

В системах Windows® некоторое антивирусное программное обеспечение, таких как Битный Защитник может неправильно идентифицировать некоторые файлы веса, как заражено и удаляет их. Однако было определено, что эти случаи являются ложными положительными сторонами и что файлы безопасны. Можно отметить эти файлы как безопасные в антивирусной программе.

cnn_alexnet_conv1_b            
cnn_alexnet_conv1_w            
cnn_alexnet_conv2_b            
cnn_alexnet_conv2_w            
cnn_alexnet_conv3_b            
cnn_alexnet_conv3_w            
cnn_alexnet_conv4_b            
cnn_alexnet_conv4_w            
cnn_alexnet_conv5_b            
cnn_alexnet_conv5_w            

Сгенерируйте код при помощи приложения

Выполните обычные шаги для определения функции точки входа и определения входных типов. Смотрите Генерацию кода при помощи Приложения GPU Coder. На шаге Generate Code:

  • Установите Language на C++.

  • Нажмите More Settings. В панели Deep Learning, набор Target library к cuDNN.

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

Генерация кода Используя cnncodegen

Можно использовать опцию targetlib команды cnncodegen, чтобы сгенерировать код с cuDNN библиотекой. Команда cnncodegen генерирует код CUDA и создает статическую библиотеку для данного SeriesNetwork или сетевого объекта DAGNetwork.

cnncodegen(net,'targetlib','cudnn');

Команда cnncodegen генерирует код и make-файл, cnnbuild_rtw.mk. Это помещает все сгенерированные файлы в папку codegen.

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

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

class CnnMain
{
  ...
  public:
    CnnMain();
    ...
    void setup();
    void predict();
    void cleanup();
    ~CnnMain();
};

Метод setup() класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. Метод predict() вызывает прогноз для каждого из этих 25 слоев в сети.

void CnnMain::predict()
{
    int32_T idx;
    for (idx = 0; idx < 25; idx++) {
        this->layers[idx]->predict();
    }
}

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

cnn_CnnMain_avg         cnn_CnnMain_conv5_w     
cnn_CnnMain_conv1_b     cnn_CnnMain_fc6_b       
cnn_CnnMain_conv1_w     cnn_CnnMain_fc6_w       
cnn_CnnMain_conv2_b     cnn_CnnMain_fc7_b       
cnn_CnnMain_conv2_w     cnn_CnnMain_fc7_w       
cnn_CnnMain_conv3_b     cnn_CnnMain_fc8_b       
cnn_CnnMain_conv3_w     cnn_CnnMain_fc8_w       
cnn_CnnMain_conv4_b     cnn_CnnMain_labels.txt  
cnn_CnnMain_conv4_w     
cnn_CnnMain_conv5_b 

Смотрите также

| | |

Похожие темы