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

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

Сторонние необходимые условия

Необходимый

Этот пример генерирует CUDA® MEX и имеет следующие сторонние требования.

  • CUDA включил NVIDIA® графический процессор и совместимый драйвер.

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

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

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

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

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.

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

type('resnet_predict.m')
% Copyright 2020 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 (GPU Coder) функция, чтобы создать 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: View report

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

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();

Генерация кода при помощи Библиотеки NVIDIA TensorRT с расчетом вывода в 8-битной целочисленной точности поддерживает эти дополнительные сети:

  • Сети детектора объектов, такие как YOLOv2 и SSD.

  • Регрессия и сети семантической сегментации.

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

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

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 = 50;
codegen -config cfg logonet_predict -args {ones(227,227,3,'int8')} -report
Code generation successful: View report

Запустите предсказание 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;