С помощью GPU Coder™ можно сгенерировать оптимизированный код для предсказания множества обученных нейронных сетей для глубокого обучения от Deep Learning Toolbox™. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, слоев и параметров, которые вы задаете во входе SeriesNetwork
(Deep Learning Toolbox) или DAGNetwork
(Deep Learning Toolbox) объект. Можно настроить генератор кода, чтобы использовать преимущества NVIDIA® TensorRT™ библиотеку вывода эффективности для графических процессоров NVIDIA. TensorRT обеспечивает улучшенную задержку, пропускную способность и эффективность памяти за счет объединения слоев сети и оптимизации выбора ядра. Можно также сконфигурировать генератор кода, чтобы использовать преимущества режимов точности TensorRT (FP32, FP16 или INT8), чтобы еще больше улучшить эффективность и уменьшить требования к памяти. Сгенерированный код может быть интегрирован в ваш проект как исходный код, статические или динамические библиотеки или исполняемые файлы, которые можно развернуть на различных платформах графического процессора NVIDIA.
Примечание
Рабочий процесс TensorRT не поддерживается в MATLAB® онлайн.
Сгенерируйте код для сверточных сетей с помощью одного из методов:
Стандарт codegen
функция, которая генерирует CUDA® код из функции точки входа MATLAB.
Приложение GPU Coder, которое генерирует код CUDA из функции точки входа MATLAB.
Примечание
В предыдущих релизах вы можете нацелиться на библиотеку TensorRT, используя cnncodegen
функция. С R2020b и далее рекомендуется использовать codegen
команда вместо команды cnncodegen
функционирует, потому что в будущем релизе, cnncodegen
функция сгенерирует код С++ и создаст статическую библиотеку только для ARM® Процессор Mali GPU.
В этом примере вы используете GPU Coder, чтобы сгенерировать код CUDA для предварительно обученного googlenet
(Deep Learning Toolbox) глубокую сверточную нейронную сеть и классифицировать изображение. GoogLeNet обучен на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила представления богатых функций для широкой области значений изображений. Сеть принимает изображение как вход, а затем выводит метку для объекта в изображении с вероятностями для каждой из категорий объектов. В этом примере показано, как сгенерировать код для предварительно обученной сети с помощью codegen
команда и приложение GPU Coder.
Этот пример использует 32-битные числа с плавающей точностью (значение по умолчанию) в качестве точности для тензорных входов. Чтобы узнать больше об использовании 8-битной целочисленной точности для тензоров, смотрите Предсказание Глубокого Обучения Используя пример NVIDIA TensorRT.
Этот пример генерирует CUDA MEX, который имеет следующие дополнительные требования.
Deep Learning Toolbox.
Модель Deep Learning Toolbox для пакета поддержки GoogLeNet Network.
Пакет поддержки интерфейса GPU Coder для библиотек глубокого обучения.
CUDA включает графический процессор NVIDIA и совместимый драйвер. Для 8-битной целочисленной точности графический процессор CUDA должен иметь вычислительные возможности 6,1, 6,3 или выше. Для половинной точности требуется графический процессор CUDA с минимальной вычислительной способностью 7.0.
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментов CUDA, cuDNN и библиотеки TensorRT. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Установка необходимых продуктов.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел Переменные окружения.
Загрузите предварительно обученную сеть GoogLeNet. Можно выбрать загрузку другой предварительно обученной сети для классификации изображений. Если у вас нет необходимых пакетов поддержки, программное обеспечение предоставляет ссылку для загрузки.
net = googlenet;
Объект net
содержит DAGNetwork
объект. Используйте analyzeNetwork
(Deep Learning Toolbox) функция для отображения интерактивной визуализации сетевой архитектуры, для обнаружения ошибок и проблем в сети, а также для отображения подробной информации о слоях сети. Информация о слое включает размеры активации слоя и настраиваемые параметры, общее количество настраиваемых параметров и размеры параметров состояния рекуррентных слоев.
analyzeNetwork(net);
Изображение, которое вы хотите классифицировать, должно иметь тот же размер, что и вход сигнала сети. Для GoogLeNet, размер imageInputLayer
(Deep Learning Toolbox) составляет 224 на 224 на 3. The Classes
свойство выхода classificationLayer
(Deep Learning Toolbox) содержит имена классов, выученных сетью. Просмотрите 10 случайных имен классов из 1000.
classNames = net.Layers(end).Classes; numClasses = numel(classNames); disp(classNames(randperm(numClasses,10)))
'speedboat' 'window screen' 'isopod' 'wooden spoon' 'lipstick' 'drake' 'hyena' 'dumbbell' 'strawberry' 'custard apple'
Для получения дополнительной информации смотрите Список слоев глубокого обучения (Deep Learning Toolbox).
Напишите функцию точки входа в MATLAB, которая:
Использует coder.loadDeepLearningNetwork
функция для загрузки модели глубокого обучения и создания и настройки класса CNN. Для получения дополнительной информации смотрите Загрузка предварительно обученных сетей для генерации кода.
Вызовы predict
(Deep Learning Toolbox), чтобы предсказать ответы.
Для примера:
function out = googlenet_predict(in) %#codegen persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('googlenet'); end % pass in input out = predict(mynet,in);
Постоянный объект mynet
загружает DAGNetwork
объект. При первом вызове функции точки входа создается и настраивается постоянный объект. При последующих вызовах функции тот же объект повторно используется для вызова predict
на входах, избегая восстановления и перезагрузки объекта сети.
Примечание
Генерация кода требует, чтобы сеть была загружена в постоянный объект.
Вы также можете использовать activations
(Deep Learning Toolbox) метод для активации сети для определенного слоя. Для примера следующая строка кода возвращает активацию сети для слоя, указанной в layerIdx
.
out = activations(mynet,in,layerIdx,'OutputAs','Channels');
Вы также можете использовать classify
(Deep Learning Toolbox) метод для предсказания меток классов для данных в in
используя обученную сеть, mynet
.
[out,scores] = classify(mynet,in);
Для сетей LSTM можно также использовать predictAndUpdateState
(Deep Learning Toolbox) и resetState
(Deep Learning Toolbox) методы. Для указаний по применению и ограничений этого метода смотрите соответствующую запись в таблице Поддерживаемые функции.
codegen
Чтобы сконфигурировать настройки сборки, такие как имя выходного файла, расположение и тип, вы создаете объекты строения кодера. Чтобы создать объекты, используйте coder.gpuConfig
функция. Для примера при генерации CUDA MEX при помощи codegen
команда, использование cfg = coder.gpuConfig('mex');
Другие доступные опции:
cfg = coder.gpuConfig('lib');
, чтобы создать объект строения генерации кода для использования с codegen
при генерации статической библиотеки CUDA C/C + +.
cfg = coder.gpuConfig('dll');
, чтобы создать объект строения генерации кода для использования с codegen
при генерации динамической библиотеки CUDA C/C + +.
cfg = coder.gpuConfig('exe');
, чтобы создать объект строения генерации кода для использования с codegen
при генерации исполняемого файла CUDA C/C + +.
Чтобы задать параметры генерации кода для TensorRT, установите DeepLearningConfig
свойство для coder.TensorRTConfig
объект, который вы создаете при помощи coder.DeepLearningConfig
.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt'); cfg.DeepLearningConfig.DataType = 'fp32';
Задайте точность расчетов вывода в поддерживаемых слоях при помощи DataType
свойство. При выполнении вывода в 32-битных плавающих точках используйте 'fp32'
. Для половинной точности используйте 'fp16'
. Для 8-битного целого числа используйте 'int8'
. Значение по умолчанию 'fp32'
. INT8
для точности требуется графический процессор CUDA с минимальной вычислительной способностью 6.1. FP16
для точности требуется графический процессор CUDA с минимальной вычислительной способностью 7.0. Используйте ComputeCapability
свойство GpuConfig
объект, чтобы задать соответствующее вычислительное значение возможностей.
Когда вы выбираете 'INT8'
опция, TensorRT квантует данные с плавающей точкой, чтобы int8
. Повторная калибровка выполняется с уменьшенным набором калибровочных данных. Данные калибровки должны присутствовать в местоположении данных изображения, заданном DataPath
. Предварительная обработка изображений должна быть выполнена перед повторной калибровкой, и шаги предварительной обработки должны быть включены в файл точки входа перед генерацией кода.
Примечание
Генерация кода для INT8
тип данных не поддерживает несколько нейронных сетей для глубокого обучения в функции точки входа.
Смотрите прогноз глубокого обучения с помощью примера NVIDIA TensorRT для 8-битного целочисленного предсказания для сети классификации логотипов с помощью TensorRT.
Запуск codegen
команда. The codegen
команда генерирует код CUDA из googlenet_predict.m
Функция точки входа MATLAB.
codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
The -report
опции codegen
чтобы сгенерировать отчет генерации кода, который можно использовать для отладки кода MATLAB.
The -args
опции codegen
для компиляции файла googlenet_predict.m
при помощи классов, размеров и сложности, заданных для входа in. Значение (224,224,3)
соответствует размеру входного слоя сети GoogLeNet.
The -config
опции codegen
использовать указанный объект строения для генерации кода.
Примечание
Можно задать входы половинной точности для генерации кода. Однако тип генератора кода приводит входы к одинарной точности. Deep Learning Toolbox использует арифметику с одной точностью и плавающей точкой для всех расчетов в MATLAB. Во время генерации кода можно включить вывод с половинными точностями (16-битные с плавающей точкой) входами путем определения DataType
свойство coder.TensorRTConfig
как 'fp16'
.
Генератор кода по умолчанию использует размещение основного столбца. Чтобы использовать основную строку размещения передайте -rowmajor
опция для codegen
команда. Кроме того, сконфигурируйте код для размещения основной строки, изменив cfg.RowMajor
параметр в объекте строения генерации кода.
Когда генерация кода успешна, можно просмотреть результат отчета генерации кода, нажав View Report в Командном Окне MATLAB. Отчет отображается в окне Средство Просмотра. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. См. «Отчеты генерации кода».
Code generation successful: View report
Сеть DAG генерируется как класс C++, содержащий массив из 144 классов слоев. Фрагмент объявления класса из googlenet_predict_types.h
показан файл.
googlenet_predict_types.h
Файл
The setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта.
The predict()
способ вызывает предсказание для каждого из 144 слоев в сети.
The DeepLearningNetwork.cu
файл содержит определения функций объекта для b_googlenet_0
класс.
Двоичные файлы экспортируются для слоев с такими параметрами, как полносвязные и свертки в сети. Для образца, файлов cnn_googlenet_conv*_w
и cnn_googlenet_conv*_b
соответствуют весам и параметрам смещения для convolutional
слои в сети. Генератор кода помещает эти двоичные файлы в codegen
папка.
Примечание
В Windows® системы, некоторые антивирусные программы, такие как Bit Defender, могут неправильно идентифицировать некоторые файлы веса как зараженные и удалить их. Эти случаи являются ложными срабатываниями, и файлы могут быть помечены как безопасные в вашей антивирусной программе.
В сгенерированном коде googlenet_predict.cu
, функцию точки входа googlenet_predict()
создает статический объект b_googlenet_0 типа классов и вызывает настройку и предсказание на этом сетевом объекте.
Чтобы задать функцию точки входа и задать входные типы, выполните процедуру в приложении См. Генерацию кода при помощи приложения GPU Coder.
На Generate Code шаге:
Установите Build type
на MEX
.
Нажмите More Settings. На панели Deep Learning установите Target library равным TensorRT.
Закройте окно настроек. Чтобы сгенерировать код CUDA, нажмите Generate.
Для 'lib'
, 'dll'
, и 'exe'
target, генератор кода создает *_rtw.mk
сделать файл в codegen
папка. В этом файле make расположение сгенерированного кода задается при помощи START_DIR
переменная, найденная в MACROS
раздел. По умолчанию эта переменная указывает на путь к текущей рабочей папке, в которой генерируется код. Если вы планируете переместить сгенерированные файлы и использовать make-файл для сборки, замените сгенерированное значение START_DIR
с соответствующим местоположением пути.
Изображение, которое вы хотите классифицировать, должно иметь тот же размер, что и вход сигнала сети. Считайте изображение, которое вы хотите классифицировать, и измените его размер на вход сети. Это изменение размера немного изменяет соотношение сторон изображения.
im = imread("peppers.png");
inputLayerSize = net.Layers(1).InputSize;
im = imresize(im,inputLayerSize(1:2));
Вызов GoogLeNet предсказать на вход изображении.
predict_scores = googlenet_predict_mex(im);
Отобразите пять лучших предсказанных меток и связанные с ними вероятности в качестве гистограммы. Поскольку сеть классифицирует изображения в так много категорий объектов, и многие категории аналогичны, обычно при оценке сетей учитывается точность в пять лучших. Сеть классифицирует изображение как болгарский перец с высокой вероятностью.
[scores,indx] = sort(predict_scores, 'descend'); classNamesTop = classNames(indx(1:5)); h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,scores(5:-1:1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top 5 predictions using GoogLeNet')