Этот пример показывает генерацию кода для применения глубокого обучения при помощи библиотеки NVIDIA TensorRT™. Это использует codegen
команда, чтобы сгенерировать файл MEX, чтобы выполнить предсказание с ResNet-50 отображает сеть классификации при помощи TensorRT. Второй пример демонстрирует использование codegen
команда, чтобы сгенерировать файл MEX, который выполняет 8-битное целочисленное предсказание при помощи TensorRT для сети классификации логотипов.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA® включил NVIDIA® графический процессор и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
NVIDIA cuDNN и библиотека TensorRT.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование (GPU Coder) и Подготовка Необходимых как условие продуктов (GPU Coder).
Используйте 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. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).
Функция 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);
Сгенерировать код 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: 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 точности. Используйте предварительно обученную сеть классификации логотипов, чтобы классифицировать логотипы на изображения. Загрузите предварительно обученный 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').
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;