Прогноз глубокого обучения при помощи NVIDIA TensorRT

Этот пример показывает генерацию кода для применения глубокого обучения при помощи библиотеки NVIDIA TensorRT™. Это использует codegen команда, чтобы сгенерировать файл MEX, чтобы выполнить прогноз с ResNet-50 отображает сеть классификации при помощи TensorRT. Второй пример демонстрирует использование codegen команда, чтобы сгенерировать файл MEX, который выполняет 8-битный целочисленный прогноз при помощи TensorRT для сети классификации логотипов.

Предпосылки

  • CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше. Для 8-битного целочисленного примера, NVIDIA графический процессор с вычисляют возможность 6.1 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • NVIDIA cuDNN и библиотека TensorRT.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).

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

  • Этот пример не поддержан в MATLAB® онлайн.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'tensorrt';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

resnet_predict Функция точки входа

Этот пример использует сеть DAG ResNet-50, чтобы показать классификацию изображений при помощи TensorRT. Предварительно обученная модель ResNet-50 для MATLAB® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).

Функция resnet_predict.m загружает сеть ResNet-50 в персистентный сетевой объект и снова использует постоянный объект на последующих вызовах прогноза.

type('resnet_predict.m')
% Copyright 2018 The MathWorks, Inc.

function out = resnet_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, avoiding reconstructing and reloading the
% network object.

persistent mynet;

if isempty(mynet)
    % Call the function resnet50 that returns a DAG network
    % for ResNet-50 model.
    mynet = coder.loadDeepLearningNetwork('resnet50','resnet');
end

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

Запустите генерацию кода MEX

Сгенерировать код CUDA для resnet_predict функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig функция, чтобы создать TensorRT объект настройки глубокого обучения и присвоение это к DeepLearningConfig свойство объекта настройки графического процессора кода. Запустите codegen команда, задающая входной размер [224,224,3]. Это значение соответствует входному размеру слоя сети ResNet-50.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');
codegen -config cfg resnet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/resnet_predict/html/report.mldatx').

Выполните прогноз на тестовом изображении

im = imread('peppers.png');
im = imresize(im, [224,224]);
predict_scores = resnet_predict_mex(double(im));
%
% get top 5 probability scores and their labels
[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
net = resnet50;
classnames = net.Layers(end).ClassNames;
labels = classnames(indx(1:5));

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;

Сгенерируйте код TensorRT для прогноза INT8

Сгенерируйте код TensorRT, который запускает вывод в int8 точности. Используйте предварительно обученную сеть классификации логотипов, чтобы классифицировать логотипы на изображения. Загрузите предварительно обученный LogoNet сеть и сохраняет его как logonet.mat файл. Сеть была разработана в MATLAB. Эта сеть может распознать 32 логотипа при различных условиях освещения и углах камеры. Сеть предварительно обучена в одинарной точности формат с плавающей точкой.

net = getLogonet();

TensorRT требует, чтобы калибровочный набор данных калибровал сеть, которая обучена в с плавающей точкой, чтобы вычислить вывод в 8-битной целочисленной точности. Установите тип данных на int8 и путь к калибровочному набору данных при помощи DeepLearningConfig. logos_dataset подпапка, содержащая изображения, сгруппированные их соответствующими метками классификации. Для поддержки int8 графический процессор вычисляет возможность, должен быть 6.1 или выше.

unzip('logos_dataset.zip');
cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.GpuConfig.ComputeCapability = '6.1';
cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');
cfg.DeepLearningConfig.DataType = 'int8';
cfg.DeepLearningConfig.DataPath = 'logos_dataset';
cfg.DeepLearningConfig.NumCalibrationBatches = 300;
codegen -config cfg logonet_predict -args {ones(227,227,3,'int8')} -report
Code generation successful: To view the report, open('codegen/mex/logonet_predict/html/report.mldatx').

Запустите прогноз INT8 на тестовом изображении

im = imread('gpucoder_tensorrt_test.png');
im = imresize(im, [227,227]);
predict_scores = logonet_predict_mex(int8(im));
%
% get top 5 probability scores and their labels
[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
classnames = net.Layers(end).ClassNames;
labels = classnames(indx(1:5));

Очистите статический сетевой объект, который загрузился в памяти.

clear mex;
Для просмотра документации необходимо авторизоваться на сайте