Этот пример показывает, как сгенерировать код CUDA® от объекта DAGNetwork и развернуть сгенерированный код на плату NVIDIA® Jetson TX2 с помощью Пакета Поддержки GPU Coder™ для NVIDIA графические процессоры. Этот пример использует resnet50 нейронную сеть для глубокого обучения, чтобы классифицировать изображения от видеопотока веб-камеры USB.
Требования требуемой платы
NVIDIA Джетсон Tegra TX2 встроил платформу.
Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если требуемая плата не может быть соединена с локальной сетью).
Камера USB, чтобы соединиться с TX2.
NVIDIA инструментарий CUDA установлен на плате.
Библиотека NVIDIA cuDNN (v5 или выше) на цели.
OpenCV 3.0 или более высокая библиотека по цели для чтения и отображения изображений/видео.
Переменные окружения на цели для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек и их настройки, смотрите Предпосылки Установки и Setup для плат NVIDIA.
Требования узла разработки
GPU Coder для генерации кода. Для обзора и примеров, посетите страницу продукта GPU Coder.
Deep Learning Toolbox™, чтобы использовать объект DAGNetwork.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
NVIDIA инструментарий CUDA на хосте.
Переменные окружения на хосте к компиляторам и библиотекам. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Переменные окружения.
Следующая строка кода создает папку в вашей текущей рабочей директории (хост) и копирует все соответствующие файлы в этот folder.if, вы не можете сгенерировать файлы в этой папке, изменить вашу текущую рабочую директорию, запущенную снова ниже команды.
gpucoderdemo_setup('gpucoderdemo_resnet50');
Используйте функцию checkHardwareSupportPackageInstall
, чтобы проверить, что хост-система совместима, чтобы запустить этот пример.
checkHardwareSupportPackageInstall();
Пакет Поддержки GPU Coder для NVIDIA графические процессоры использует связь SSH по TCP/IP, чтобы выполнить команды при создании и выполнении сгенерированного кода CUDA по платформе Джетсона. Необходимо поэтому соединить целевую платформу с той же сетью как хост - компьютер или использовать кабель перекрестного соединения Ethernet, чтобы соединить плату непосредственно с хостом - компьютером. Обратитесь к документации NVIDIA относительно того, как настроить и сконфигурировать вашу плату.
Чтобы связаться с оборудованием NVIDIA, необходимо создать живой аппаратный объект связи при помощи функции jetson. Необходимо знать, что имя хоста или IP-адрес, имя пользователя и пароль требуемой платы создают живой аппаратный объект связи.
hwobj= jetson('host-name','username','password');
Примечание:
В случае отказа связи о сообщении об ошибке диагностики сообщают относительно командной строки MATLAB. Если связь прервалась, наиболее вероятной причиной является неправильный IP-адрес или имя узла.
Когда существует несколько живых объектов связи для различных целей, генератор кода выполняет удаленную сборку на цели, для которой был создан недавний живой объект. Чтобы выбрать аппаратное управление по выполнению удаленной сборки, используйте метод setupCodegenContext()
соответствующего живого аппаратного объекта. Если только один живой объект связи был создан, не необходимо вызвать этот метод.
hwobj.setupCodegenContext;
Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('jetson'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
функция resnet50_wrapper.m использует предварительно обученную Сеть ResNet-50, чтобы классифицировать изображения. ResNet-50 является Сетью DAG, обученной больше чем на миллионе изображений от базы данных ImageNet. Вывод содержит категориальное множество каждого класса, которому принадлежит изображение.
type resnet50_wrapper
function out = resnet50_wrapper(im) %#codegen % Wrapper function to call ResNet50 predict function. % Copyright 2019 The MathWorks, Inc. % This example uses OpenCV for reading frames from a web camera % and displaying output image. Update buildinfo to link with % OpenCV library available on target. opencv_link_flags = '`pkg-config --cflags --libs opencv`'; coder.updateBuildInfo('addLinkFlags',opencv_link_flags); % To avoid multiple loads of the network for each run, we use % persistent rnet persistent rnet; if isempty(rnet) rnet = resnet50(); end out = rnet.predict(im); end
Эта программа использует resnet50_wrapper.m как функция точки входа для генерации кода. Чтобы сгенерировать исполняемый файл CUDA, который может быть развернут на цели NVIDIA, создайте объект настройки Кодера GPU для генерации исполняемого файла.
cfg = coder.gpuConfig('exe');
Используйте функцию coder.hardware, чтобы создать объект настройки для платформы Джетсона и присвоить его свойству Hardware
объекта cfg
Джетсона графического процессора.
cfg.Hardware = coder.hardware('NVIDIA Jetson');
Установите Настройку Глубокого обучения на 'cudnn' или tensorrt'
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
В этом примере генерация кода сделана с помощью изображения в качестве входа. Однако поток веб-камеры питается вход исполняемый файл после развертывания.
Демонстрационное изображение вводится для генерации кода
im=single(imread('peppers.png'));
im=imresize(im,[224,224]);
Пользовательский основной файл закодирован, чтобы снять видео, как введено и классифицирует каждый кадр на видео последовательность. Пользовательский основной файл является оберткой, которая вызывает предсказать функцию в сгенерированном коде. Отправьте шаги обработки, такие как отображение вывода на входном кадре, добавляются в основном использовании файла интерфейсы OpenCV.
cfg.CustomSource=fullfile('codegen','exe','resnet50_wrapper','examples','main.h'); cfg.CustomSource=fullfile('main.cu');
Чтобы сгенерировать код CUDA и развернуть его на цель, используйте codegen, функционируют и передают объект настройки графического процессора кода. После того, как генерация кода происходит на хосте, сгенерированные файлы скопированы и основаны на цели в директории рабочей области.
codegen -config cfg -args {im} resnet50_wrapper -report
Скопируйте synsetWords текстовый файл с хоста - компьютера на целевое устройство при помощи команды putFile
.
hwobj.putFile('synsetWords.txt',hwobj.workspaceDir);
Используйте метод runApplication
аппаратного объекта запустить приложение на целевом компьютере. Приложение будет расположено в директории рабочей области.
hwobj.runApplication('resnet50_wrapper');
Используйте метод killApplication
аппаратного объекта уничтожить запущенное приложение на цели.
hwobj.killApplication('resnet50_wrapper');
Запустите функцию cleanup
, чтобы удалить сгенерированные файлы и возвратиться к исходной папке.
cleanup