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