Прогноз глубокого обучения с различными пакетными размерами

Этот пример демонстрирует генерацию кода с пакетными размерами, больше, чем 1. Эта демонстрация содержит два примера, во-первых, cnncodegen использования, чтобы сгенерировать код, который берет в пакете изображений, как введено. Второй пример создает файл MEX с помощью codegen и передает пакет изображений, как введено.

Предпосылки

  • CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Библиотека NVIDIA cuDNN.

  • Библиотека NVIDIA TensorRT.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.

  • Computer Vision Toolbox™ для видео средства чтения и средства просмотра используется в примере.

  • Deep Learning Toolbox™ для использования SeriesNetwork или объектов DAGNetwork.

  • Image Processing Toolbox™ для чтения и отображения изображений.

  • Этот пример пользуется библиотекой TensorRT, которая только поддержана в платформах Linux.

Проверьте среду графического процессора

Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'tensorrt';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Создайте папку и скопируйте соответствующие файлы

Следующий код создает папку в вашей текущей рабочей папке (pwd). Новая папка содержит только файлы, которые важны для этого примера. Если вы не хотите влиять на текущую папку (или если вы не можете сгенерировать файлы в этой папке), измените свою рабочую папку.

gpucoderdemo_setup('gpucoderdemo_resnet_batchsize');

Классификация с сетью ResNet-50

Пример использует популярную сеть DAG ResNet-50 для классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB® доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).

net = resnet50;
% To see all the layers, use |net.Layers|

Сгенерируйте код для NVIDIA графические процессоры с поддержкой TensorRT

Для цели NVIDIA с TensorRT, генерацией кода и выполнением выполняется на компьютере разработчика хоста. Чтобы запустить сгенерированный код, ваш компьютер разработчика должен иметь графический процессор NVIDIA с, вычисляют возможность по крайней мере 3,2. Используйте cnncodegen команду, чтобы сгенерировать код для платформы NVIDIA при помощи опции 'tensorrt'. По умолчанию команда cnncodegen генерирует код, который использует 32-битную точность плавающую для входных параметров тензора к сети. В предсказать вызове повторные изображения могут быть обработаны в пакетном режиме в один вызов и переданы как вход. Это запускает прогнозы по пакету входных параметров параллельно. Значение по умолчанию пакетного размера равняется 1.

% Input batch size can be specified using the |'batchsize'| option. This is
% the batch size that should be passed to the generated code. Here
% 15 images are considered as a batch, and so batch size is 15.
% Passing different batch size at runtime causes errors.

Примечание: Чтобы сгенерировать использование кода CuDNN, мы должны задать 'cudnn' вместо 'tensorrt' для опции 'targetlib'.

cnncodegen(net,'targetlib','tensorrt', 'batchsize', 15);
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWAdditionLayer.o" "MWAdditionLayer.cpp"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWBatchNormalizationLayer.o" "MWBatchNormalizationLayer.cpp"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWConvLayer.o" "MWConvLayer.cpp"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "cnn_api.o" "cnn_api.cpp"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWAdditionLayerImpl.o" "MWAdditionLayerImpl.cu"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWBatchNormalizationLayerImpl.o" "MWBatchNormalizationLayerImpl.cu"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWCNNLayerImpl.o" "MWCNNLayerImpl.cu"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWConvLayerImpl.o" "MWConvLayerImpl.cu"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "MWTargetNetworkImpl.o" "MWTargetNetworkImpl.cu"
nvcc -c  -rdc=true  -Xcompiler -fPIC -Xptxas "-w" -Xcudafe "--display_error_number --diag_suppress=2381 --diag_suppress=unsigned_compare_with_zero" -O3 -arch sm_35 -std=c++11 -I"/mathworks/devel/sbs/37/vravicha.lcmFirst/matlab/toolbox/gpucoder/gpucoderdemos/gpucoderdemo_resnet_batchsize2/codegen" -I"/mathworks/hub/share/apps/GPUTools/TensorRT/5.0.2.6/glnxa64/include"  -I"/mathworks/hub/3rdparty/R2019a/3840803/glnxa64/cuDNN/cuda/include" -o "cnn_exec.o" "cnn_exec.cpp"
nvcc -lib -Xlinker -rpath,"/bin/glnxa64",-L"/bin/glnxa64" -lc -Xnvlink -w -Wno-deprecated-gpu-targets -arch sm_35 -std=c++11 -o cnnbuild.a MWAdditionLayer.o MWBatchNormalizationLayer.o MWConvLayer.o cnn_api.o MWAdditionLayerImpl.o MWBatchNormalizationLayerImpl.o MWCNNLayerImpl.o MWConvLayerImpl.o MWTargetNetworkImpl.o cnn_exec.o -L".." -lcudnn -lnvcaffe_parser -lnvinfer_plugin -lnvinfer -lcublas -lcudart -lcusolver 
### Created: cnnbuild.a
### Successfully generated all binary outputs.

1. Описание сгенерированного кода

Предварительная настройка () и постнастройка () функции выполняют дополнительную настройку, требуемую для TensorRT. Классы слоя в папке сгенерированного кода вызывают в библиотеки TensorRT.

MainFile

Основной файл создает и настраивает сетевой объект CnnMain со слоями и весами. Это использует метод OpenCV VideoCapture, чтобы считать кадры из входного видео. Это запускает прогноз для каждого кадра, выбирающего вывод от итогового полносвязного слоя.

Кадры, полученные из объекта OpenCV VideoCapture, преобразованы от упакованного BGR (OpenCV) формат к плоскому RGB (MATLAB) формат. Буфер выделен и заполнен с данными изображения как показано. Этот необработанный буфер используется в качестве во входе к сети.

   void readBatchData(float *input, vector<Mat>& orig, int batchSize)
   {
        for (int i=0; i<batchSize; i++)
        {
           if (orig[i].empty())
           {
               orig[i] = Mat::zeros(ROWS,COLS, orig[i-1].type());
               continue;
           }
           Mat tmpIm;
           resize(orig[i], tmpIm, Size(COLS,ROWS));
           for (int j=0; j<ROWS*COLS; j++)
           {
               // BGR packed to RGB planar conversion
               input[CH*COLS*ROWS*i + 2*COLS*ROWS + j] = (float)(tmpIm.data[j*3+0]);
               input[CH*COLS*ROWS*i + 1*COLS*ROWS + j] = (float)(tmpIm.data[j*3+1]);
               input[CH*COLS*ROWS*i + 0*COLS*ROWS + j] = (float)(tmpIm.data[j*3+2]);
           }
        }
   }

2. Создайте и выполнитесь

Используйте make, чтобы создать исполняемый файл resnet_batchSize_exe.

system(['make ','tensorrt']);
or
system(['make ','cudnn']);

Запустите исполняемый файл с входным видеофайлом с пакетным размером в качестве первого аргумента и имени видеофайла в качестве второго аргумента. Например./resnet_batchSize_exe 15 testVideo.avi

system(['./resnet_batchSize_exe ', 15 , 'testVideo.avi']);

Сгенерируйте MEX CUDA для функции 'resnet_predict_mex'

Создайте объект настройки графического процессора для цели MEX и установите выходной язык на C++. На объекте настройки, набор DeepLearningConfig с targetlib 'tensorrt'. Чтобы сгенерировать MEX CUDA, используйте команду codegen и задайте вход как 4D матрица размера [224,224,3, batchSize]. Это значение соответствует входному размеру слоя resnet сети.

batchSize = 5;
cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');
codegen -config cfg resnet_predict -args {ones(224,224,3,batchSize,'uint8')} -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]);
%
% Concatenating 5 images since |batchSize = 5|
imBatch = cat(4,im,im,im,im,im);
predict_scores = resnet_predict_mex(imBatch);
%
% get top 5 probability scores and their labels, for each image in the batch
[val,indx] = sort(transpose(predict_scores), 'descend');
scores = val(1:5,:)*100;
net = resnet50;
classnames = net.Layers(end).ClassNames;
for i = 1:batchSize
    labels = classnames(indx(1:5,i));
    disp(['Top 5 predictions on image, ', num2str(i)]);
    disp(labels);
end
Top 5 predictions on image, 1
    'bell pepper'
    'cucumber'
    'acorn squash'
    'lemon'
    'zucchini'

Top 5 predictions on image, 2
    'bell pepper'
    'cucumber'
    'acorn squash'
    'lemon'
    'zucchini'

Top 5 predictions on image, 3
    'bell pepper'
    'cucumber'
    'acorn squash'
    'lemon'
    'zucchini'

Top 5 predictions on image, 4
    'bell pepper'
    'cucumber'
    'acorn squash'
    'lemon'
    'zucchini'

Top 5 predictions on image, 5
    'bell pepper'
    'cucumber'
    'acorn squash'
    'lemon'
    'zucchini'

Очистите статический сетевой объект, загруженный в памяти.

clear mex;

Предупреждение о необъединенном доступе состоит в том, потому что команда codegen генерирует столбец главный код. Однако в целях этого примера, это предупреждение может быть проигнорировано.

Команда выполнения: Очистка

Очистите mex, чтобы очистить статический сетевой объект, загруженный в памяти.

clear mex;
cleanup