БПФ распараллелено на картах объектов, мини-пакетах и ​​в каждом двумерном преобразовании - PullRequest
0 голосов
/ 13 февраля 2019

Проблемы с производительностью

Информация о системе - Я использую Kaggle Kernels для запуска кода тензорного потока с включенной опцией графического процессора.

Информация о среде:

Вы можете получить часть этой информации, используя нашу среду захвата script Вы также можете получить версию TensorFlow с python -c "import tensorflow as tf; print(tf.GIT_VERSION, tf.VERSION)"

Вывод:

b'v1.12.0-0-ga6d8ffae09 '1.12.0

Проблема

Контекст

Я воспроизвел это бумага , которая в основном изучает карты CNN в частотной области.Однако, когда я запускаю его и сравниваю время эпохи при обучении обычных CNN, которые работают в пространственной области, с использованием FFT, которые работают в частотной области, версия FFT намного медленнее.Для экспериментов я реализовал LeNet-5 и использовал набор данных MNIST.

╔═════════════════════╦═══════════════════════════════╦═════════════════╦═══════════╦═══════════╗
║     Experiment      ║          Description          ║ Avrg Epoch Time ║ Wall time ║    Acc    ║
╠═════════════════════╬═══════════════════════════════╬═════════════════╬═══════════╬═══════════╣
║ MNIST LeNet         ║ Baseline                      ║ 1.67633 s       ║ 25.2 s    ║ 98.79416% ║
║ MNIST Mathieu LeNet ║ Frequency Domain Convolutions ║ 5.69431 s       ║ 56.4 s    ║ 97.26562% ║
╚═════════════════════╩═══════════════════════════════╩═════════════════╩═══════════╩═══════════╝

Статья с более быстрым CNN поставляется со следующим примечанием:

Текущий графический процессорреализации FFT, такие как cuFFT, предназначены для распараллеливания по отдельным преобразованиям.Это может быть полезно для вычисления ограниченного числа преобразований на больших входах, но не подходит для нашей задачи, поскольку мы выполняем много БПФ на относительно небольших входах.Поэтому мы разработали собственную реализацию CUDA алгоритма FFT Кули-Тьюки, которая позволила нам распараллеливать карты характеристик, мини-пакеты и внутри каждого двумерного преобразования.Обратите внимание, что двумерные БПФ естественным образом пригодны для распараллеливания, поскольку их можно разложить на два набора одномерных БПФ (один над строками, а другой над столбцами), и каждый набор можно выполнять параллельно.

Я понятия не имел, как будет происходить оптимизация реализации, поэтому я поставил этот вопрос на рассмотрение онлайн-сообщества.Я предполагаю, что статья точна в своем утверждении, так как один из авторов является отцом CNN, LeCun.Итак, единственно возможная вещь, которую я мог сделать, учитывая ответ, который я получил, и мое отсутствие понимания фактической разработки CUDA, - это проверить реализацию тензорного потока и посмотреть, используется ли каким-либо образом cufftPlanMany.И это действительно как-то используется.

Задача

До этого момента я не знаю, как воспроизвести технику, описанную в этой статье.Если бы я знал.Если есть лучший способ для выполнения операций FFT, я считаю, что многие приложения могли бы извлечь из этого пользу.Кроме того, в статье упоминаются некоторые аспекты памяти их реализации.Но я думаю, что это отдельная проблема.

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

...