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

С GPU Coder™ можно сгенерировать оптимизированный код для предсказания множества обученных нейронных сетей для глубокого обучения от Deep Learning Toolbox™. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) при помощи архитектуры, слоев и параметров, которые вы задаете во входе SeriesNetwork (Deep Learning Toolbox) или DAGNetwork Объект (Deep Learning Toolbox). Можно сконфигурировать генератор кода, чтобы использовать в своих интересах высокопроизводительную библиотеку вывода NVIDIA® TensorRT™ для NVIDIA графические процессоры. TensorRT обеспечивает улучшенную задержку, пропускную способность и КПД памяти путем объединения слоев сети и оптимизации выбора ядра. Можно также сконфигурировать генератор кода, чтобы воспользоваться преимуществом режимы точности TensorRT (FP32, FP16 или INT8), чтобы далее улучшать производительность и уменьшать требования к памяти. Сгенерированный код может быть интегрирован в ваш проект как исходный код, статические или динамические библиотеки или исполняемые файлы, что можно развернуть в разнообразие NVIDIA платформы графического процессора.

Примечание

Поток операций TensorRT не поддерживается на MATLAB® онлайн.

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

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

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

Примечание

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

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

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

Этот пример использует 32-битные плавания (значение по умолчанию) в качестве точности для входных параметров тензора. Чтобы узнать больше об использовании 8-битной целочисленной точности для тензоров, см. Предсказание Глубокого обучения при помощи примера NVIDIA TensorRT.

Требования

Необходимый

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

  1. Deep Learning Toolbox.

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

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

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

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

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

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

  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. Чтобы задать параметры генерации кода для TensorRT, установите DeepLearningConfig свойство к coder.TensorRTConfig возразите, что вы создаете при помощи coder.DeepLearningConfig.

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

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

    Когда вы выбираете 'INT8' опция, TensorRT квантует данные с плавающей точкой к int8. Перекалибровка выполняется с уменьшаемым набором калибровочных данных. Калибровочные данные должны присутствовать в месте данных изображения, заданном DataPath. Предварительная обработка изображений должна быть выполнена, прежде чем перекалибровка и шаги предварительной обработки должны быть включены в файл точки входа перед генерацией кода.

    Примечание

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

    См. Предсказание Глубокого обучения при помощи примера NVIDIA TensorRT для 8-битного целочисленного предсказания для сети классификации логотипов при помощи TensorRT.

  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. Во время генерации кода можно включить вывод с полуточностью (16-битный с плавающей точкой) входные параметры путем определения DataType свойство coder.TensorRTConfig как 'fp16'.

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

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

    Code generation successful: View report
    

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

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

 googlenet_predict_types.h Файл

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

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

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

Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_googlenet_conv*_w и cnn_googlenet_conv*_b соответствуйте весам и сместите параметры для convolutional слои в сети. Генератор кода помещает эти двоичные файлы в 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 к TensorRT.

  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')
    

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

Функции

Объекты

Похожие темы