Генерация CUDA кода из алгоритма MATLAB
Генерация CUDA кода из алгоритма MATLAB

GPU Coder  - инструмент генерации оптимизированного CUDA кода из кода MATLAB для задач глубокого обучения, обработки изображений и систем автономного вождения. 

  • Сгенерированный код вызывает оптимизированные библиотеки NVIDIA CUDA, включая cuDNN, cuSolver и cuBLAS.;
  • Сгенерированный код может быть интегрирован в ваш проект в виде исходного кода, статических или динамических библиотек;
  • Код может использоваться для запуска ваших алгоритмов на графических процессорах: NVIDIA Tesla и NVIDIA Tegra;
  • Сгенерированный CUDA код ускорит ваши вычисления; 
  • GPU Coder позволяет использовать существующий CUDA код в ваших алгоритмах MATLAB и включать его в сгенерированный CUDA код.

Использование GPU Coder совместно с Embedded Coder дает вам возможность проверять поведение сгенерированного кода на его численную эквивалентность эталонной модели при помощи тестирования в режиме «Программа в контуре» (SIL).

Генерация CUDA кода из алгоритма MATLAB Генерация CUDA кода из алгоритма MATLAB

Генерация CUDA кода из алгоритмов MATLAB

Пример генерации CUDA кода из MATLAB функции для алгоритма хромакея
Пример генерации CUDA кода из MATLAB функции для алгоритма хромакея
Пример генерации CUDA кода из MATLAB функции для алгоритма хромакея Пример генерации CUDA кода из MATLAB функции для алгоритма хромакея

Перевод кода MATLAB в CUDA код на первом шаге включает в себя задание ряда требований к реализации алгоритма, например, задание размерности и типа входных данных. Приложение GPU Coder или интерфейс его командной строки проведет вас в интерактивном режиме через все шаги процесса генерации кода, оставляя вас в рамках уже знакомой среды MATLAB.

GPU Coder помогает вам подготовить алгоритм к генерации CUDA кода. GPU Coder анализирует ваш MATLAB код и автоматически предлагает подходящие типы данных и их размерность для входных переменных. Вы можете предварительно убедиться, что ваш алгоритм готов к генерации кода, сгенерировав из него MEX функцию, которая упаковывает скомпилированный код для вызова его внутри MATLAB. При генерации кода GPU Coder создает отчет о генерации кода, в котором указывает возникающие ошибки, если они есть, которые необходимо устранить, чтобы подготовить алгоритм MATLAB к генерации CUDA кода. После вы устраняете ошибки и заново пробуете сгенерировать MEX функцию и так несколько раз до тех пор, пока ваш алгоритм не будет готов к генерации кода.

После вы можете генерировать CUDA код из вашего алгоритма MATLAB в виде исходного CUDA C кода, статической или динамической библиотеки, или в виде MEX функции для повышения производительности и ускорения вычисления вашего MATLAB кода. Сгенерированный код может использоваться в таких приложениях, как глубокое обучение, компьютерное зрение и системы автономного вождения.

Создавайте, обучайте и развертывайте сети глубокого обучения используя GPU Coder совместно с Deep Learning Toolbox

Сегментация изображения сетью – SegNet
Сегментация изображения сетью – SegNet

Используйте GPU Coder совестно с Deep Learning Toolbox для развертывания обученных нейронных сетей на графических процессорах NVIDIA, таких как Tesla и Tegra. Используйте метод передачи обучения для переобучения существующих сетей: AlexNet или VGG-16/19 для решения ваших задач.

Например, вы можете классифицировать только те объекты из набора, которые являются наиболее важными для вас, вместо 1000 объектов, на которых изначально обучалась сеть. Также есть возможность с нуля создать архитектуру нейронной сети и обучить сеть для новой задачи, предварительно собрав базу данных с метками для обучения сети.

 Помимо обученной нейронной сети, GPU Coder также может генерировать код для предварительной и постобработки данных, поэтому на выходе вы получаете готовый алгоритм для решения вашей задачи. Например, вам может потребоваться предварительное повышение контраста для входного изображения. После предобработанные изображения можно подавать на вход нейронных сетей AlexNet или VGG-16 для детектирования и классификации объектов.

Сегментация изображения сетью – SegNet Сегментация изображения сетью – SegNet

Ускорение обучения моделей глубокого обучения с Parallel Computing Toolbox

Ускорение процесса обучения при использовании Parallel Computing Toolbox
Ускорение процесса обучения при использовании Parallel Computing Toolbox
Ускорение процесса обучения при использовании Parallel Computing Toolbox Ускорение процесса обучения при использовании Parallel Computing Toolbox

Обучение нейронной сети может занять много времени, от нескольких дней до недель. С Parallel Computing Toolbox вы можете использовать GPU ядра на своем компьютере, на кластере или в облаке, чтобы значительно сократить время обучения сети и ускорить сам процесс. Использование GPU ядер может сократить время обучения сети для задачи классификации изображений с нескольких дней до часов.

Создание ядер, минимизация пересылок данных в памяти, и распределение памяти на GPU

Пример генерации CUDA кода из алгоритма MATLAB
Пример генерации CUDA кода из алгоритма MATLAB

GPU Coder создает CUDA ядра, которые минимизируют пересылку данных в памяти между CPU и GPU и оптимизируют использование памяти на GPU. GPU Coder автоматически анализирует и идентифицирует код и автоматически выделяет сегменты кода MATLAB для запуска на CPU и на GPU. При желании пользователи могут с помощью специальных прагм вручную указать весь код или его часть для запуска на GPU. Код MATLAB, распознанный для запуска на GPU, преобразуется в CUDA ядра и создается из таких программных конструкций, как циклы FOR, поэлементные матричные операции, векторные операции, операции, редукции и т.д. и алгоритмы более высокого уровня, такие как БПФ и функции обработки изображений.

GPU Coder анализирует зависимость данных CPU - GPU ядра, данные используемые совместно процессором и графическим процессором, располагаться в памяти графического процессора с помощью функций cudaMalloc или cudaMallocManaged. GPU Coder определяет минимальное число мест, где данные должны быть скопированы между CPU и GPU с помощью функций cudaMemcpy. Если вы используете общую память в CUDA, GPU Coder также определяет минимальное число вызовов функции cudaDeviceSync, необходимой для корректного поведения кода. GPU Coder поддерживает различные пространства памяти GPU, от локальной до глобальной памяти. В каждом ядре GPU Coder отображает данные в область памяти для увеличения пропускной способности памяти.

Пример генерации CUDA кода из алгоритма MATLAB Пример генерации CUDA кода из алгоритма MATLAB

Поддержка оптимизированных библиотек

Сгенерированный код использует оптимизированные библиотеки NVIDIA CUDA, включая TensorRT, cuDNN, cuSolver, cuFFT, cuBLAS и Thrust.

  • NVIDIA TensorRT  - высокопроизводительная библиотека для глубокого обучения, обеспечивающая низкую задержку при выполнении и высокую пропускную способность для приложений с глубоким обучением;
  • NVIDIA cuDNN представляет собой ускоренную на GPU библиотеку примитивов для глубоких нейронных сетей и предоставляет хорошо настроенные реализации для стандартных операций: свертка, пулинг, нормализация, активация слоя и т.д;
  • NVIDIA cuSOLVER - набор решателей, как обычных, так и для разреженных систем, для ускорения приложений компьютерного зрения и линейной оптимизации;
  • NVIDIA cuFFT предназначена для высокопроизводительных вычислений быстрого преобразования Фурье;
  • NVIDIA cuBLAS – библиотека стандартных алгоритмов линейной алгебры (BLAS) с ускорением на графическом процессоре;
  • Thrust - библиотека шаблонов C++ для CUDA, которая предоставляет обширную коллекцию примитивов для параллельной обработки данных: сканирование, сортировка, прореживание и т.д. для реализации высокопроизводительных параллельных приложений с минимальными затратами на программирование.

Шаблоны для CUDA ядер

Вы можете добиться дополнительного ускорения, используя шаблоны для CUDA ядер при разработке алгоритмов MATLAB. Шаблоны для CUDA ядер вы можете использовать в таких операций, как свертка, медианная фильтрация и методы конечных элементов. Сгенерированный код использует разделяемую память для улучшения пропускной способности памяти и локальности данных. Матрично-матричные операции могут использоваться в таких операций, как вычисление суммы абсолютных разностей (SAD), суммы квадратов разностей (SSD). В этом случае сгенерированный код переиспользует данные и улучшает пропускную способность памяти.

Функции MATLAB поддерживающие генерацию кода

Поддержка языка и инструментов MATLAB для генерации кода
Поддержка языка и инструментов MATLAB для генерации кода
Поддержка языка и инструментов MATLAB для генерации кода Поддержка языка и инструментов MATLAB для генерации кода

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

Подключение внешнего кода CUDA в сгенерированный код

Вы можете использовать директиву coder.ceval для включения внешнего CUDA кода в ваш сгенерированный код. Внешний код может быть уже существующим рукописным кодом для сред разработки, для которых вы генерируете и интегрируете код, или любой другой CUDA код, указанный пользователем, который используется в процесс сборки в GPU Coder. Сгенерированный код будет содержать вызовы внешних CUDA функций в соответствующих местах.

Также можно подключить внешний CUDA код в MATLAB для моделирования и проверки его поведения, написав функцию MATLAB, которая использует coder.ceval для вызова внешнего CUDA кода, а затем сгенерировать из функции MEX файл.

Генерация MEX функций для ускорения и верификации кода

Генерация MEX-функции из MATLAB
Генерация MEX-функции из MATLAB
Генерация MEX-функции из MATLAB Генерация MEX-функции из MATLAB

MEX-функция это скомпилированный С или CUDA код для выполнения внутри MATLAB, и может быть вызвана вместо кода MATLAB в следующих задачах:

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

Тестирование алгоритма в виде MEX-функции перед генерацией кода, позволяет обнаруживать и исправлять ошибки, возникающие при выполнении кода, которые намного сложнее диагностировать в сгенерированном коде. Запуск MEX-функции в MATLAB позволяет выполнять проверки целостности памяти для C/C++ кода, выполняются проверки границ массивов, их размерности и размера стека, и если нарушение обнаруживаются, MATLAB останавливает выполнение и выдает диагностическое сообщение.

Запуск сгенерированного кода на NVIDIA GPU Tesla и Tegra

Запуск сгенерированного CUDA кода на NVIDIA Jetson
Запуск сгенерированного CUDA кода на NVIDIA Jetson

Вы можете скомпилировать сгенерированный код с помощью продуктов NVIDIA и запустить его на графических процессорах, таких как NVIDIA Tesla и NVIDIA Tegra. Для графических процессоров (видеокарт), установленных на хост-компьютере, где установлен MATLAB, вы можете скомпилировать его с помощью компилятора NVIDIA. Если сгенерированный код вызывает сторонние библиотеки, такие как cuDNN, cuFFT, cuSolver или cuBLAS, вам необходимо предварительно установить эти библиотеки перед началом компиляции сгенерированного кода.

На встраиваемых графических платформах вы можете вручную подключить сгенерированный код в проект и скомпилировать его на целевой платформе с помощью инструментов NVIDIA. Кроме того, с помощью пакета поддержки для встраиваемых графических процессоров NVIDIA вы можете использовать кросс-компиляцию и запускать сгенерированный CUDA код в виде отдельного приложения или библиотеки для встраиваемых GPU на таких платах, как NVIDIA Drive или NVIDIA Jetson. Пакет поддержки также позволяет удаленно взаимодействовать с платой NVIDIA, управлять периферийными устройствами на плате и быстро создавать на ее основе прототипы устройств.

Запуск сгенерированного CUDA кода на NVIDIA Jetson Запуск сгенерированного CUDA кода на NVIDIA Jetson

Использование GPU Coder совместно с Embedded Coder

Пример трассируемости кода MATLAB – CUDA
Пример трассируемости кода MATLAB – CUDA
Пример трассируемости кода MATLAB – CUDA Пример трассируемости кода MATLAB – CUDA

Используя GPU Coder совместно с Embedded Coder, есть возможность дополнительно оптимизировать эффективность кода и настроить сгенерированный код. Используйте интерактивный отчет о генерации кода с трассируемостью кода для представления о том, как ваш MATLAB код транслируется в сгенерированный CUDA C код.

Embedded Coder также позволяет проверять поведение сгенерированного кода на его численную эквивалентность эталонной модели с помощью тестирования в режиме «Программа в контуре» (SIL) для проверки сгенерированного CUDA кода, предназначенного для запуска на встраиваемых GPU.