exponenta event banner

Создание кода для сетей глубокого обучения с помощью TensorRT

С помощью 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.

Создание кода и классификация изображений с помощью GoogLeNet

В этом примере кодер графического процессора используется для создания кода CUDA для предварительно обученного googlenet (Deep Learning Toolbox) глубокая сверточная нейронная сеть и классификация изображения. GoogLeNet прошел обучение на более чем миллионе изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и животные). Сеть изучила богатые представления функций для широкого спектра изображений. Сеть принимает изображение в качестве входного, а затем выводит метку для объекта в изображении с вероятностями для каждой из категорий объектов. В этом примере показано, как создать код для предварительно обученной сети с помощью codegen и приложение GPU Coder.

В этом примере в качестве точности входов тензора используются 32-битные плавающие значения (значение по умолчанию). Дополнительные сведения об использовании 8-разрядной целочисленной точности для тензоров см. в примере Прогноз глубокого обучения с использованием NVIDIA TensorRT.

Требования

Необходимый

В этом примере создается CUDA MEX со следующими дополнительными требованиями.

  1. Инструментарий для глубокого обучения.

  2. Модель набора инструментов для глубокого обучения для пакета поддержки сети GoogLeNet.

  3. Пакет поддержки интерфейса кодера GPU для библиотек глубокого обучения.

  4. CUDA поддерживает графический процессор NVIDIA и совместимый драйвер. Для 8-разрядной целочисленной точности графический процессор CUDA должен иметь вычислительную способность 6.1, 6.3 или выше. Для половинной точности требуется графический процессор CUDA с минимальной вычислительной способностью 7.0.

Дополнительный

Для построений, отличных от MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

  1. Инструментарий CUDA, библиотеки cuDNN и TensorRT. Сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Установка необходимых продуктов.

  2. Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделе Переменные среды.

Загрузить предварительно обученную сеть

  1. Загрузите предварительно подготовленную сеть GoogLeNet. Можно загрузить другую предварительно подготовленную сеть для классификации изображений. Если необходимые пакеты поддержки не установлены, программа предоставляет ссылку для загрузки.

    net = googlenet;
    

  2. Объект net содержит DAGNetwork объект. Используйте analyzeNetwork Функция (Deep Learning Toolbox) используется для отображения интерактивной визуализации сетевой архитектуры, обнаружения ошибок и проблем в сети, а также для отображения подробной информации о сетевых уровнях. Информация о слое включает в себя размеры активизаций слоя и обучаемых параметров, общее количество обучаемых параметров и размеры параметров состояния повторяющихся слоев.

    analyzeNetwork(net);
    

  3. Изображение, которое требуется классифицировать, должно иметь тот же размер, что и входной размер сети. Для 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'
    

    Дополнительные сведения см. в разделе Список слоев глубокого обучения (панель инструментов глубокого обучения).

Создание функции точки входа

  1. Запишите в MATLAB функцию точки входа, которая:

    1. Использует coder.loadDeepLearningNetwork функция для загрузки модели глубокого обучения, а также для построения и настройки класса CNN. Дополнительные сведения см. в разделе Загрузка предварительно обученных сетей для создания кода.

    2. Требования predict (Deep Learning Toolbox) для прогнозирования ответов.

  2. Например:

    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 на входах, избегая реконструкции и перезагрузки сетевого объекта.

    Примечание

    Создание кода требует загрузки сети в постоянный объект.

  3. Вы также можете использовать activations Метод (Deep Learning Toolbox) для активации сети для определенного уровня. Например, следующая строка кода возвращает сетевые активации для слоя, указанного в layerIdx.

    out = activations(mynet,in,layerIdx,'OutputAs','Channels');
    

  4. Вы также можете использовать classify Метод (Deep Learning Toolbox) для прогнозирования меток классов для данных изображения в in использование обученной сети, mynet.

    [out,scores] = classify(mynet,in);
    

    Для сетей LSTM можно также использовать predictAndUpdateState (инструментарий глубокого обучения) и resetState Методы (Deep Learning Toolbox). Примечания по использованию и ограничения этого метода см. в соответствующей записи в таблице Поддерживаемые функции.

Создание кода с помощью codegen

  1. Для настройки таких параметров построения, как имя выходного файла, расположение и тип, создаются объекты конфигурации кодера. Для создания объектов используйте coder.gpuConfig функция. Например, при создании CUDA MEX с помощью codegen команда, использование cfg = coder.gpuConfig('mex');

    Другие доступные варианты:

    1. cfg = coder.gpuConfig('lib');, для создания объекта конфигурации генерации кода для использования с codegen при создании статической библиотеки CUDA C/C + +.

    2. cfg = coder.gpuConfig('dll');, для создания объекта конфигурации генерации кода для использования с codegen при создании динамической библиотеки CUDA C/C + +.

    3. cfg = coder.gpuConfig('exe');, для создания объекта конфигурации генерации кода для использования с codegen при создании исполняемого файла CUDA C/C + +.

  2. Чтобы задать параметры генерации кода для 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.

  3. Запустить codegen команда. codegen команда генерирует код CUDA из googlenet_predict.m Функция начальной точки MATLAB.

    codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
    

    1. -report опция инструктирует codegen для создания отчета о создании кода, который можно использовать для отладки кода MATLAB.

    2. -args опция инструктирует codegen для компиляции файла googlenet_predict.m используя класс, размер и сложность, указанные для входных данных в. Стоимость (224,224,3) соответствует размеру входного уровня сети GoogLeNet.

    3. -config опция инструктирует codegen для использования указанного объекта конфигурации для создания кода.

    Примечание

    Для создания кода можно задать входные данные с полуконкретностью. Однако тип генератора кода приводит входные данные к одинарной точности. Инструментарий глубокого обучения использует арифметику с одинарной точностью и плавающей запятой для всех вычислений в MATLAB. Во время генерации кода можно включить вывод с входами с полуконкретностью (16-битной плавающей запятой), указав DataType имущество coder.TensorRTConfig как 'fp16'.

    По умолчанию генератор кода использует компоновку «основной столбец». Чтобы использовать макет основной строки, передайте -rowmajor опции для codegen команда. Либо настройте код для макета основной строки, изменив cfg.RowMajor в объекте конфигурации генерации кода.

  4. После успешного создания кода можно просмотреть полученный отчет о создании кода, щелкнув Просмотр отчета в окне команд 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 типа класса и вызывает установку и прогнозирование для этого сетевого объекта.

 googlenet_predict.cu Файл

Создание кода с помощью приложения

Чтобы указать функцию точки входа и типы ввода, выполните процедуру в приложении. См. раздел Создание кода с помощью приложения кодера графического процессора.

На шаге Создать код:

  1. Установите Build type кому MEX.

  2. Щелкните Дополнительные параметры. На панели «Глубокое обучение» установите для параметра «Целевая библиотека» значение TensorRT.

  3. Закройте окно настроек. Для создания кода CUDA нажмите кнопку «Создать».

Созданный Makefile

Для 'lib', 'dll', и 'exe' цели, генератор кода создает *_rtw.mk создать файл в codegen папка. В этом файле создания местоположение сгенерированного кода определяется с помощью START_DIR переменная, найденная в MACROS раздел. По умолчанию эта переменная указывает на путь к текущей рабочей папке, в которой создается код. Если планируется переместить созданные файлы и использовать make-файл для построения, замените созданное значение START_DIR с соответствующим расположением пути.

Запуск сгенерированного MEX

  1. Изображение, которое требуется классифицировать, должно иметь тот же размер, что и входной размер сети. Прочитайте изображение, которое требуется классифицировать, и измените его размер до входного размера сети. Это изменение размера немного изменяет пропорции изображения.

    im = imread("peppers.png");
    inputLayerSize = net.Layers(1).InputSize;
    im = imresize(im,inputLayerSize(1:2));
    
  2. Вызовите функцию прогнозирования GoogLeNet на входном изображении.

    predict_scores = googlenet_predict_mex(im);
    
  3. Отображение пяти лучших прогнозируемых меток и связанных с ними вероятностей в виде гистограммы. Поскольку в сети изображения классифицируются по множеству категорий объектов, а многие категории схожи, при оценке сетей обычно учитывается пять основных показателей точности. Сеть классифицирует изображение как колокольный перец с высокой вероятностью.

    [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')
    

См. также

Функции

Объекты

Связанные темы