В этом примере показано создание кода для приложения глубокого обучения с помощью библиотеки TensorRT™ NVIDIA. Он использует codegen команда для генерации MEX-файла для выполнения прогнозирования с помощью ResNet-50 сети классификации изображений с помощью TensorRT. Второй пример демонстрирует использование codegen команда для создания MEX-файла, выполняющего 8-битное целочисленное предсказание с использованием TensorRT для сети классификации логотипов.
Необходимый
В этом примере создается CUDA MEX со следующими требованиями сторонних производителей.
Графический процессор NVIDIA ® с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Библиотека NVIDIA cuDNN и TensorRT.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Используйте coder.checkGpuInstall для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
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);
Создание кода 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. Используйте предварительно подготовленную сеть классификации логотипов для классификации логотипов на изображениях. Загрузить предварительно подготовленное 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;
coder.CodeConfig | coder.EmbeddedCodeConfig | coder.gpuConfig | coder.gpuEnvConfig | coder.TensorRTConfig