С GPU Coder™ можно сгенерировать оптимизированный код для прогноза множества обученных нейронных сетей для глубокого обучения от Deep Learning Toolbox™. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) при помощи архитектуры, слоев и параметров, которые вы задаете во входе SeriesNetwork
или DAGNetwork
объект. Можно сконфигурировать генератор кода, чтобы использовать в своих интересах высокопроизводительную библиотеку вывода NVIDIA® TensorRT™ для NVIDIA графические процессоры. TensorRT обеспечивает улучшенную задержку, пропускную способность и КПД памяти путем объединения сетевых слоев и оптимизации выбора ядра. Можно также сконфигурировать генератор кода, чтобы воспользоваться преимуществом режимы точности TensorRT (FP32, FP16 или INT8), чтобы далее улучшать производительность и уменьшать требования к памяти. Сгенерированный код может быть интегрирован в ваш проект как исходный код, статические или динамические библиотеки или исполняемые файлы, что можно развернуть в разнообразие NVIDIA платформы графического процессора.
Поток операций TensorRT не поддержан на MATLAB® онлайн.
Сгенерируйте код для сверточных сетей при помощи одного из методов:
Стандартный codegen
функция, которая генерирует код CUDA® от функции точки входа MATLAB.
cnncodegen
команда, которая генерирует код CUDA и создает статическую библиотеку для заданного сетевого объекта.
Приложение GPU Coder, которое генерирует код CUDA от функции точки входа MATLAB.
Когда вы генерируете код для нейронной сети при помощи codegen
или приложение GPU Coder, сгенерированный код использует упорядоченное по столбцам размещение в ваших данных массива. Чтобы совпадать с упорядоченным по строкам размещением, которое использует библиотека глубокого обучения, генератор кода должен вставить операции, чтобы преобразовать упорядоченное по столбцам размещение в упорядоченное по строкам размещение. Эти операции преобразования могут ухудшить производительность сгенерированного кода. Генерация кода для глубоких нейронных сетей не поддерживает кодер упорядоченные по строкам опции, такие как RowMajor
параметр конфигурации.
В этом примере вы используете GPU Coder, чтобы сгенерировать код CUDA для предварительно обученного googlenet
глубокая сверточная нейронная сеть и классифицирует изображение. GoogLeNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа, и затем выводит метку для объекта в изображении с вероятностями для каждой из категорий объектов. Этот пример показывает вам, как сгенерировать код для предварительно обученной сети при помощи codegen
команда, cnncodegen
команда и приложение GPU Coder.
Этот пример использует 32-битные плавания (значение по умолчанию) в качестве точности для входных параметров тензора. Чтобы узнать больше об использовании 8-битной целочисленной точности для тензоров, см. Прогноз Глубокого обучения при помощи примера NVIDIA TensorRT.
Deep Learning Toolbox.
Модель Deep Learning Toolbox для пакета Сетевой поддержки GoogLeNet.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить пакеты поддержки, выберите пакет поддержки из меню MATLAB Add-Ons.
Инструментарий CUDA, cuDNN, и библиотеки TensorRT. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Устанавливающие Необходимые как условие продукты.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Переменные окружения.
Загрузите предварительно обученную сеть GoogLeNet. Можно принять решение загрузить различную предварительно обученную сеть для классификации изображений. Если у вас нет необходимых пакетов поддержки установленными, программное обеспечение обеспечивает ссылку на загрузку.
net = googlenet;
Объект net
содержит DAGNetwork
объект. Используйте analyzeNetwork
функционируйте, чтобы отобразить интерактивную визуализацию сетевой архитектуры, обнаружить ошибки и проблемы в сети, и отобразить подробную информацию о сетевых слоях. Информация о слое включает размеры активаций слоя и learnable параметров, общего количества learnable параметров и размеров параметров состояния текущих слоев.
analyzeNetwork(net);
Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Для GoogLeNet, размера imageInputLayer
224 224 3. Classes
свойство выхода classificationLayer
содержит имена классов, изученных сетью. Просмотрите 10 случайных имен классов из общего количества 1 000.
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
предсказать ответы.
Например:
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
метод к сетевым активациям для определенного слоя. Например, следующая строка кода возвращает сетевые активации для слоя, заданного в layerIdx
. Для указаний и ограничений по применению activations
метод, смотрите соответствующую запись в таблице Supported Functions.
out = activations(mynet,in,layerIdx,'OutputAs','Channels');
codegen
Чтобы сконфигурировать настройки сборки, такие как имя выходного файла, местоположение и тип, вы создаете объекты настройки кодера. Чтобы создать объекты, используйте coder.gpuConfig
функция. Например, при генерации MEX CUDA при помощи codegen
команда, используйте cfg = coder.gpuConfig('mex');
Другие доступные параметры:
cfg = coder.gpuConfig('lib');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации C/C++ CUDA статическая библиотека.
cfg = coder.gpuConfig('dll');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации C/C++ CUDA динамическая библиотека.
cfg = coder.gpuConfig('exe');
, чтобы создать настройку генерации кода возражают для использования с codegen
при генерации исполняемого файла C/C++ CUDA.
Чтобы задать параметры генерации кода для 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
тип данных не поддерживает несколько нейронных сетей для глубокого обучения в функции точки входа.
Запустите codegen
команда. codegen
команда генерирует код CUDA от googlenet_predict.m
Функция точки входа MATLAB.
codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
-report
опция сообщает codegen
чтобы сгенерировать генерацию кода сообщают, что можно использовать, чтобы отладить код MATLAB.
-args
опция сообщает codegen
скомпилировать файл googlenet_predict.m
при помощи класса размер и сложность заданы для входа in. Значение (224,224,3)
соответствует входному размеру слоя сети GoogLeNet.
-config
опция сообщает codegen
чтобы использовать заданную настройку возражают для генерации кода.
Когда генерация кода успешна, можно просмотреть получившийся отчет генерации кода путем нажатия на View Report в Окне Команды MATLAB. Отчет отображен в окне Report Viewer. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и обеспечивает ссылки на проблематичный код MATLAB. См. Отчеты Генерации кода (MATLAB Coder).
Code generation successful: View report
Сеть DAG сгенерирована как класс C++, содержащий массив 144 классов слоя. Отрывок объявления класса от googlenet_predict_types.h
файл показывают.
googlenet_predict_types.h
Файл
setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта.
predict()
метод вызывает прогноз для каждого из этих 144 слоев в сети.
DeepLearningNetwork.cu
файл содержит определения объектных функций для b_googlenet_0
класс.
Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_googlenet_conv*_w
и cnn_googlenet_conv*_b
соответствуйте весам и сместите параметры для convolutional
слои в сети. Генератор кода помещает эти двоичные файлы в codegen
папка.
В системах Windows® некоторое антивирусное программное обеспечение, таких как Битный Защитник может неправильно идентифицировать некоторые файлы веса, как заражено и удалить их. Эти случаи являются ложными положительными сторонами, и файлы могут быть отмечены как безопасные в вашей антивирусной программе.
В файле сгенерированного кода googlenet_predict.cu
, функция точки входа googlenet_predict()
создает статический объект b_googlenet_0 типа класса и вызывает настройку, и предскажите на этом сетевом объекте.
Чтобы задать функцию точки входа и определение входных типов, завершите процедуру в приложении. Смотрите Генерацию кода при помощи Приложения GPU Coder.
На шаге Generate Code:
Установите Build type
к MEX
.
Нажмите More Settings. В панели Deep Learning, набор Target library к TensorRT.
Закройте окно настроек. Чтобы сгенерировать код CUDA, нажмите Generate.
cnncodegen
Чтобы сгенерировать код с cuDNN библиотекой, используйте targetlib
опция cnncodegen
команда. cnncodegen
команда генерирует код CUDA и создает статическую библиотеку для SeriesNetwork
или DAGNetwork
объект.
Загрузите предварительно обученную сеть. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.
Вызовите cnncodegen
с 'targetlib'
заданный как 'tensorrt'
. Например:
net = googlenet; cnncodegen(net,'targetlib','tensorrt');
cnncodegen
команда генерирует код, make-файл, cnnbuild_rtw.mk
, и создает файл библиотеки cnnbuild
. Это помещает все сгенерированные файлы в codegen
папка.
Сеть DAG сгенерирована как класс C++ (CnnMain
) содержа массив 144 классов слоя. Отрывок объявления класса от cnn_exec.hpp
файл показывают.
он setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта.
predict()
метод вызывает прогноз для каждого из этих 144 слоев в сети.
cnn_exec.cpp
файл содержит определения объектных функций для CnnMain
класс.
Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_CnnMain_conv*_w
и cnn_CnnMain_conv*_b
соответствуйте весам и сместите параметры для convolutional
слои в сети. Генератор кода помещает эти двоичные файлы в codegen
папка. Генератор кода создает файл библиотеки cnnbuild
и места все сгенерированные файлы в codegen
папка.
Для 'lib'
, 'dll'
, и 'exe'
цели, генератор кода создает *_rtw.mk
make-файл в codegen
папка. В этом make-файле местоположение сгенерированного кода задано при помощи START_DIR
переменная найдена в MACROS
раздел. По умолчанию эта переменная указывает на путь текущей рабочей папки, где код сгенерирован. Если вы планируете переместить сгенерированные файлы и использовать make-файл, чтобы создать, замените сгенерированное значение START_DIR
с соответствующим местоположением пути.
Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Считайте изображение, что вы хотите классифицировать и изменить размер его к входному размеру сети. Это изменение размеров немного изменяет соотношение сторон изображения.
im = imread("peppers.png");
inputLayerSize = net.Layers(1).InputSize;
im = imresize(I,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')
cnncodegen
| codegen
| coder.TensorRTConfig
| coder.loadDeepLearningNetwork