БПФ распараллелено на картах объектов, мини-пакетах и ​​в каждом двумерном преобразовании

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

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

Информация об окружающей среде:

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

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

проблема

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

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

0 ответов

Другие вопросы по тегам