exponenta event banner

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

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

Предварительные условия для сторонних производителей

Необходимый

В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.

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

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

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

Проверка среды графического процессора

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

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

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

В этом примере используется сетевой ResNet-50 DAG для отображения классификации изображений с помощью TensorRT. Предварительно подготовленная модель ResNet-50 для MATLAB ® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте обозреватель надстроек.

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 создание объекта конфигурации кода GPU для цели 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 = 50;
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;