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