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

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

Примечание

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

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

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

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

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

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

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

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

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

Требования

  1. Deep Learning Toolbox.

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

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

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

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

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

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

    net = googlenet;
    

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

    analyzeNetwork(net);
    

  3. Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Для GoogLeNet, размера imageInputLayer 224 224 3. Classes свойство выхода classificationLayer содержит имена классов, изученных сетью. Просмотрите 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 предсказать ответы.

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

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

Генерация кода при помощи 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 тип данных не поддерживает несколько нейронных сетей для глубокого обучения в функции точки входа.

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

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

    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.

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

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

  1. Загрузите предварительно обученную сеть. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.

  2. Вызовите cnncodegen с 'targetlib' заданный как 'tensorrt'. Например:

    net = googlenet;
    cnncodegen(net,'targetlib','tensorrt');
    

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

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

Сеть DAG сгенерирована как класс C++ (CnnMain) содержа массив 144 классов слоя. Отрывок объявления класса от cnn_exec.hpp файл показывают.

 cnn_exec.hpp Файл

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

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

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

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

Сгенерированный 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(I,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')
    

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

| | |

Похожие темы