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

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

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

  • Стандарт codegen функция, которая генерирует код CUDA из MATLAB® функция точки входа.

  • Приложение GPU Coder, которое генерирует код CUDA из функции точки входа MATLAB.

Примечание

В предыдущих релизах вы можете нацелиться на библиотеку cuDNN с помощью cnncodegen функция. С R2020b и далее рекомендуется использовать codegen команда вместо команды cnncodegen функционирует, потому что в будущем релизе, cnncodegen функция сгенерирует код С++ и создаст статическую библиотеку только для ARM® Процессор Mali GPU.

Сгенерируйте код и классифицируйте изображения при помощи GoogLeNet

В этом примере вы используете GPU Coder, чтобы сгенерировать код CUDA для предварительно обученного googlenet (Deep Learning Toolbox) глубокую сверточную нейронную сеть и классифицировать изображение. GoogLeNet обучен на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила представления богатых функций для широкой области значений изображений. Сеть принимает изображение как вход, а затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов. В этом примере показано, как сгенерировать код для предварительно обученной сети с помощью codegen команда и приложение GPU Coder.

Требования

Необходимый

Этот пример генерирует CUDA MEX, который имеет следующие дополнительные требования.

  1. Deep Learning Toolbox.

  2. Модель Deep Learning Toolbox для пакета поддержки GoogLeNet Network.

  3. Пакет поддержки интерфейса GPU Coder для библиотек глубокого обучения.

  4. CUDA включает графический процессор NVIDIA и совместимый драйвер. Для 8-битной целочисленной точности графический процессор CUDA должен иметь вычислительные возможности 6,1, 6,3 или выше.

Дополнительный

Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

  1. Набор инструментов CUDA и библиотеки cuDNN. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Установка необходимых продуктов.

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

Загрузка предварительно обученной сети

  1. Загрузите предварительно обученную сеть GoogLeNet. Можно выбрать загрузку другой предварительно обученной сети для классификации изображений. Если у вас нет необходимых пакетов поддержки, программное обеспечение предоставляет ссылку для загрузки.

    net = googlenet;
    

  2. Объект net содержит DAGNetwork объект. Используйте analyzeNetwork (Deep Learning Toolbox) функция для отображения интерактивной визуализации сетевой архитектуры, для обнаружения ошибок и проблем в сети, а также для отображения подробной информации о слоях сети. Информация о слое включает размеры активации слоя и настраиваемые параметры, общее количество настраиваемых параметров и размеры параметров состояния рекуррентных слоев.

    analyzeNetwork(net);
    

  3. Изображение, которое вы хотите классифицировать, должно иметь тот же размер, что и вход сигнала сети. Для GoogLeNet, размер imageInputLayer (Deep Learning Toolbox) составляет 224 на 224 на 3. The Classes свойство выхода classificationLayer (Deep Learning Toolbox) содержит имена классов, выученных сетью. Просмотрите 10 случайных имен классов из 1000.

    classNames = net.Layers(end).Classes;
    numClasses = numel(classNames);
    disp(classNames(randperm(numClasses,10)))
    
        'speedboat'
        'window screen'
        'isopod'
        'wooden spoon'
        'lipstick'
        'drake'
        'hyena'
        'dumbbell'
        'strawberry'
        'custard apple'
    

    Для получения дополнительной информации смотрите Список слоев глубокого обучения (Deep Learning Toolbox).

Создайте функцию точки входа

  1. Напишите функцию точки входа в MATLAB, которая:

    1. Использует coder.loadDeepLearningNetwork функция для загрузки модели глубокого обучения и создания и настройки класса CNN. Для получения дополнительной информации смотрите Загрузка предварительно обученных сетей для генерации кода.

    2. Вызовы predict (Deep Learning Toolbox), чтобы предсказать ответы.

  2. Для примера:

    function out = googlenet_predict(in) %#codegen
    
    persistent mynet;
    
    if isempty(mynet)
        mynet = coder.loadDeepLearningNetwork('googlenet');
    end
    
    % pass in input   
    out = predict(mynet,in); 
    

    Постоянный объект mynet загружает DAGNetwork объект. При первом вызове функции точки входа создается и настраивается постоянный объект. При последующих вызовах функции тот же объект повторно используется для вызова predict на входах, избегая восстановления и перезагрузки объекта сети.

    Примечание

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

  3. Вы также можете использовать activations (Deep Learning Toolbox) метод для активации сети для определенного слоя. Для примера следующая строка кода возвращает активацию сети для слоя, указанной в layerIdx.

    out = activations(mynet,in,layerIdx,'OutputAs','Channels');
    

  4. Вы также можете использовать classify (Deep Learning Toolbox) метод для предсказания меток классов для данных в in используя обученную сеть, mynet.

    [out,scores] = classify(mynet,in);
    

    Для сетей LSTM можно также использовать predictAndUpdateState (Deep Learning Toolbox) и resetState (Deep Learning Toolbox) методы. Для указаний по применению и ограничений этого метода смотрите соответствующую запись в таблице Поддерживаемые функции.

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

  1. Чтобы сконфигурировать настройки сборки, такие как имя выходного файла, расположение и тип, вы создаете объекты строения кодера. Чтобы создать объекты, используйте coder.gpuConfig функция. Для примера при генерации CUDA MEX с помощью codegen команда, использование cfg = coder.gpuConfig('mex');

    Другие доступные опции:

    1. cfg = coder.gpuConfig('lib');, чтобы создать объект строения генерации кода для использования с codegen при генерации статической библиотеки CUDA C/C + +.

    2. cfg = coder.gpuConfig('dll');, чтобы создать объект строения генерации кода для использования с codegen при генерации динамической библиотеки CUDA C/C + +.

    3. cfg = coder.gpuConfig('exe');, чтобы создать объект строения генерации кода для использования с codegen при генерации исполняемого файла CUDA C/C + +.

  2. Чтобы задать параметры генерации кода для cuDNN, установите DeepLearningConfig свойство для coder.CuDNNConfig объект, который вы создаете при помощи coder.DeepLearningConfig.

    cfg = coder.gpuConfig('mex');
    cfg.TargetLang = 'C++';
    cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
    cfg.DeepLearningConfig.AutoTuning = true;
    cfg.DeepLearningConfig.DataType = 'fp32';
    

    Задайте точность расчетов вывода в поддерживаемых слоях при помощи DataType свойство. При выполнении вывода в 32-битных плавающих точках используйте 'fp32'. Для 8-битного целого числа используйте 'int8'. Значение по умолчанию 'fp32'. INT8 для точности требуется графический процессор CUDA с минимальной вычислительной способностью 6.1. Используйте ComputeCapability свойство GpuConfig объект, чтобы задать соответствующее вычислительное значение возможностей.

    Примечание

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

    При выполнении вывода в INT8 точность использования cuDNN версии 8.1.0, проблемы в библиотеке NVIDIA могут привести к значительному снижению эффективности.

  3. Запуск codegen команда. The codegen команда генерирует код CUDA из googlenet_predict.m Функция точки входа MATLAB.

    codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
    

    1. The -report опции codegen чтобы сгенерировать отчет генерации кода, который можно использовать для отладки кода MATLAB.

    2. The -args опции codegen для компиляции файла googlenet_predict.m при помощи классов, размеров и сложности, заданных для входа in. Значение (224,224,3) соответствует размеру входного слоя сети GoogLeNet.

    3. The -config опции codegen использовать указанный объект строения для генерации кода.

    Примечание

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

    Генератор кода по умолчанию использует размещение основного столбца. Чтобы использовать основную строку размещения передайте -rowmajor опция для codegen команда. Кроме того, сконфигурируйте код для размещения основной строки, изменив cfg.RowMajor параметр в объекте строения генерации кода.

  4. Когда генерация кода успешна, можно просмотреть результат отчета генерации кода, нажав View Report в Командном Окне MATLAB. Отчет отображается в окне Средство Просмотра. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. См. «Отчеты генерации кода».

    Code generation successful: View report
    

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

Сеть DAG генерируется как класс C++, содержащий массив из 78 классов слоев. Генератор кода уменьшает количество слоев при помощи оптимизации слияния слоев свертки и ReLU. Фрагмент объявления класса из googlenet_predict_types.h показан файл.

 googlenet_predict_types.h Файл

  • The setup() метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта.

  • The predict() способ вызывает предсказание для каждого из 78 слоев в сети.

  • The DeepLearningNetwork.cu файл содержит определения функций объекта для b_googlenet_0 класс.

Двоичные файлы экспортируются для слоев с такими параметрами, как полносвязные и свертки в сети. Для образца, файлов cnn_googlenet_conv*_w и cnn_googlenet_conv*_b соответствуют весам и параметрам смещения для FusedConvReLU слои в сети. Генератор кода помещает эти двоичные файлы в codegen папка.

Примечание

В Windows® системы, некоторые антивирусные программы, такие как Bit Defender, могут неправильно идентифицировать некоторые файлы веса как зараженные и удалить их. Эти случаи являются ложными срабатываниями, и файлы могут быть помечены как безопасные в вашей антивирусной программе.

В сгенерированном коде googlenet_predict.cu, функцию точки входа googlenet_predict() создает статический объект b_googlenet_0 типа классов и вызывает настройку и предсказание на этом сетевом объекте.

 googlenet_predict.cu Файл

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

Чтобы задать функцию точки входа и задать входные типы, выполните процедуру в приложении См. Генерацию кода при помощи приложения GPU Coder.

На Generate Code шаге:

  1. Установите Build type на MEX.

  2. Нажмите More Settings. На панели Deep Learning установите Target library равным cuDNN.

  3. Закройте окно настроек. Чтобы сгенерировать код CUDA, нажмите Generate.

Сгенерированный make-файл

Для 'lib', 'dll', и 'exe' target, генератор кода создает *_rtw.mk сделать файл в codegen папка. В этом файле make расположение сгенерированного кода задается при помощи START_DIR переменная, найденная в MACROS раздел. По умолчанию эта переменная указывает на путь к текущей рабочей папке, в которой генерируется код. Если вы планируете переместить сгенерированные файлы и использовать make-файл для сборки, замените сгенерированное значение START_DIR с соответствующим местоположением пути.

Запуск сгенерированного MEX

  1. Изображение, которое вы хотите классифицировать, должно иметь тот же размер, что и вход сигнала сети. Считайте изображение, которое вы хотите классифицировать, и измените его размер на вход сети. Это изменение размера немного изменяет соотношение сторон изображения.

    im = imread("peppers.png");
    inputLayerSize = net.Layers(1).InputSize;
    im = imresize(im,inputLayerSize(1:2));
    
  2. Вызов GoogLeNet предсказать на вход изображении.

    predict_scores = googlenet_predict_mex(im);
    
  3. Отобразите пять лучших предсказанных меток и связанные с ними вероятности в качестве гистограммы. Поскольку сеть классифицирует изображения в так много категорий объектов, и многие категории аналогичны, обычно при оценке сетей учитывается точность в пять лучших. Сеть классифицирует изображение как болгарский перец с высокой вероятностью.

    [scores,indx] = sort(predict_scores, 'descend');
    classNamesTop = classNames(indx(1:5));
    
    h = figure;
    h.Position(3) = 2*h.Position(3);
    ax1 = subplot(1,2,1);
    ax2 = subplot(1,2,2);
    
    image(ax1,im);
    barh(ax2,scores(5:-1:1))
    xlabel(ax2,'Probability')
    yticklabels(ax2,classNamesTop(5:-1:1))
    ax2.YAxisLocation = 'right';
    sgtitle('Top 5 predictions using GoogLeNet')
    

См. также

Функции

Объекты

Похожие темы