Прогноз глубокого обучения с 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 (v7).

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

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

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

  • Deep Learning Toolbox™ для использования объекта DAGNetwork.

  • ResNet-50 поддерживают пакет Deep Learning Toolbox™ для использования предварительно обученной сети ResNet.

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

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

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

Создайте папку и скопируйте соответствующие файлы

Следующий код создает папку в вашей текущей рабочей папке (pwd). Новая папка содержит только файлы, которые важны для этого примера. Если вы не хотите влиять на текущую папку (или если вы не можете сгенерировать файлы в этой папке), измените свою рабочую папку.

gpucoderdemo_setup('gpucoderdemo_tensorrt_target');

О функции 'resnet_predict'

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

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

Запустите генерацию кода MEX для функции 'resnet_predict'

Чтобы сгенерировать код от функции resnet_predict, используйте объект coder.gpuConfig с объектом настройки глубокого обучения, созданным для целевой библиотеки TensorRT.

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, и его архитектура подобна тому из AlexNet. Эта сеть может распознать 32 логотипа при различных условиях освещения и углах камеры. Сеть предварительно обучена в одинарной точности, с плавающей точкой.

net = getLogoNet();

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

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