Генерация кода для Нейронных сетей для глубокого обучения при помощи 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 функция. От R2021a вперед, cnncodegen функция генерирует Код С++ и make-файлы только для ARM® Процессор GPU Мали.

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

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

Требования

Необходимый

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

  1. Deep Learning Toolbox.

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

  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. Classes свойство выхода classificationLayer (Deep Learning Toolbox) содержит имена классов, изученных сетью. Просмотрите 10 случайных имен классов из общего количества 1 000.

    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) методы. Для указаний и ограничений по применению их метод смотрите соответствующую запись в таблице Supported Functions.

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

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

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

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

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

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

  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 команда. codegen команда генерирует код CUDA от googlenet_predict.m Функция точки входа MATLAB.

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

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

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

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

    Примечание

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

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

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

    Code generation successful: View report
    

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

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

 googlenet_predict_types.h Файл

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

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

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

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

Примечание

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

В файле сгенерированного кода 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' цели, генератор кода создает *_rtw.mk make-файл в 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')
    

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

Функции

Объекты

Похожие темы