С помощью GPU Coder™ можно создавать оптимизированный код для прогнозирования различных обученных сетей глубокого обучения из Deep Learning Toolbox™. Сгенерированный код реализует глубокую сверточную нейронную сеть (CNN) с помощью архитектуры, уровней и параметров, заданных на входе SeriesNetwork
(инструментарий глубокого обучения) или DAGNetwork
(Панель инструментов глубокого обучения). Можно настроить генератор кода для использования преимуществ высокопроизводительной библиотеки выводов NVIDIA ® TensorRT™ для графических процессоров NVIDIA. TensorRT обеспечивает повышенную задержку, пропускную способность и эффективность памяти за счет объединения сетевых уровней и оптимизации выбора ядра. Можно также настроить генератор кода таким образом, чтобы использовать режимы точности TensorRT (FP32, FP16 или INT8) для дальнейшего повышения производительности и снижения требований к памяти. Созданный код может быть интегрирован в проект в виде исходного кода, статических или динамических библиотек или исполняемых файлов, которые можно развернуть на различных платформах графического процессора NVIDIA.
Примечание
Рабочий поток TensorRT не поддерживается в MATLAB ® online.
Создайте код для сверточных сетей одним из следующих способов:
Стандарт codegen
функция, генерирующая код CUDA ® из функции точки входа MATLAB.
Приложение GPU Coder, которое генерирует код CUDA из функции точки входа MATLAB.
Примечание
В предыдущих выпусках можно использовать библиотеку TensorRT с помощью cnncodegen
функция. Начиная с R2020b, рекомендуется использовать codegen
вместо команды cnncodegen
функция, поскольку в будущей версии cnncodegen
функция генерирует код C++ и создает статическую библиотеку только для процессора графического процессора ARM ® Mali.
В этом примере кодер графического процессора используется для создания кода CUDA для предварительно обученного googlenet
(Deep Learning Toolbox) глубокая сверточная нейронная сеть и классификация изображения. GoogLeNet прошел обучение на более чем миллионе изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила богатые представления функций для широкого спектра изображений. Сеть принимает изображение в качестве входного, а затем выводит метку для объекта в изображении с вероятностями для каждой из категорий объектов. В этом примере показано, как создать код для предварительно обученной сети с помощью codegen
и приложение GPU Coder.
В этом примере в качестве точности входов тензора используются 32-битные плавающие значения (значение по умолчанию). Дополнительные сведения об использовании 8-разрядной целочисленной точности для тензоров см. в примере Прогноз глубокого обучения с использованием NVIDIA TensorRT.
В этом примере создается CUDA MEX со следующими дополнительными требованиями.
Инструментарий для глубокого обучения.
Модель набора инструментов для глубокого обучения для пакета поддержки сети GoogLeNet.
Пакет поддержки интерфейса кодера GPU для библиотек глубокого обучения.
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
(Глубоко Изучение Комплекта инструментов), 224 на 224 на 3. 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'
Дополнительные сведения см. в разделе Список слоев глубокого обучения (панель инструментов глубокого обучения).
Запишите в 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
(инструментарий глубокого обучения) и 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
тип данных не поддерживает несколько сетей глубокого обучения в функции начального уровня.
Пример 8-битного целочисленного прогнозирования для сети классификации логотипов с помощью TensorRT см. в разделе Прогнозирование глубокого обучения с использованием NVIDIA TensorRT.
Запустить 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
используя класс, размер и сложность, указанные для входных данных в. Стоимость (224,224,3)
соответствует размеру входного уровня сети GoogLeNet.
-config
опция инструктирует codegen
для использования указанного объекта конфигурации для создания кода.
Примечание
Для создания кода можно задать входные данные с полуконкретностью. Однако тип генератора кода приводит входные данные к одинарной точности. Инструментарий глубокого обучения использует арифметику с одинарной точностью и плавающей запятой для всех вычислений в MATLAB. Во время генерации кода можно включить вывод с входами с полуконкретностью (16-битной плавающей запятой), указав DataType
имущество coder.TensorRTConfig
как 'fp16'
.
По умолчанию генератор кода использует компоновку «основной столбец». Чтобы использовать макет основной строки, передайте -rowmajor
опции для codegen
команда. Либо настройте код для макета основной строки, изменив cfg.RowMajor
в объекте конфигурации генерации кода.
После успешного создания кода можно просмотреть полученный отчет о создании кода, щелкнув Просмотр отчета в окне команд MATLAB. Отчет отображается в окне Просмотр отчетов. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. См. раздел Отчеты по созданию кода.
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 ® некоторые антивирусные программы, такие как Bit Defender, могут неправильно идентифицировать некоторые файлы веса как зараженные и удалять их. Эти случаи являются ложными и файлы могут быть помечены в антивирусной программе как безопасные .
В созданном кодовом файле googlenet_predict.cu
, функция начальной точки googlenet_predict()
создает статический объект b_googlenet_0 типа класса и вызывает установку и прогнозирование для этого сетевого объекта.
Чтобы указать функцию точки входа и типы ввода, выполните процедуру в приложении. См. раздел Создание кода с помощью приложения кодера графического процессора.
На шаге Создать код:
Установите Build type
кому MEX
.
Щелкните Дополнительные параметры. На панели «Глубокое обучение» установите для параметра «Целевая библиотека» значение TensorRT.
Закройте окно настроек. Для создания кода CUDA нажмите кнопку «Создать».
Для 'lib'
, 'dll'
, и 'exe'
цели, генератор кода создает *_rtw.mk
создать файл в codegen
папка. В этом файле создания местоположение сгенерированного кода определяется с помощью 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')