Глубокое обучение при помощи NVIDIA TensorRT

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

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

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

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

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

The 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 (GPU Coder) функция для создания TensorRT объект строения глубокого обучения и присвоение его DeepLearningConfig свойство объекта строения кода GPU. Запуск 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;