Что такое сплавленное ядро ​​(или сплавленный слой) в глубоком обучении? - PullRequest
1 голос
/ 14 июня 2019

Я читаю документацию Apex AMP :

Сборка только для Python:

  • Слитые ядра, необходимые для использования apex.optimizers.FusedAdam.
  • Слитые ядра требуется использовать apex.normalization.FusedLayerNorm.
  • Слитые ядра, которые улучшить производительность и числовую стабильность apex.parallel.SyncBatchNorm.
  • Слитые ядра, улучшающие производительность apex.parallel.DistributedDataParallel и apex.amp. DistributedDataParallel, amp и SyncBatchNorm по-прежнему будут использоваться, но они могут быть медленнее.

Кажется также, что существует оптимизатор "FusedAdam" :

Оптимизатор Адама в Pytorch (как и все оптимизаторы Pytorch) содержит out optimizer.step () путем циклического перебора параметров и запуска серия ядер для каждого параметра. Это может потребовать сотни небольшие запуски, которые в основном связаны с циклом Python на стороне процессора и издержки запуска ядра, что приводит к плохому использованию устройства. В настоящее время реализация FusedAdam в Apex выравнивает параметры для шага оптимизации, затем выполняет Сам шаг оптимизации через объединенное ядро, объединяющее все Адама операции. Таким образом, циклические параметры, а также Внутренние серии операций Адама для каждого параметра сливаются такими этот optimizer.step () требует всего несколько запусков ядра.

Текущая реализация (в Apex master) хрупкая и работает только с усилителем opt_level O2. У меня есть ветка WIP, чтобы она работала для любого opt_level (https://github.com/NVIDIA/apex/pull/351). Я рекомендую ждать, пока это не объединится, затем попробовать.

Это частично объясняет это. У меня осталось больше вопросов:

Что подразумевается под ядром? Слой или оптимизатор?

Является ли идея слитого слоя такой же, как у плавленого оптимизатора?

1 Ответ

2 голосов
/ 14 июня 2019
  • «Ядро» здесь для вычислительных ядер: https://en.wikipedia.org/wiki/Compute_kernel Такие операции, как свертка, часто реализуются с использованием вычислительных ядер для повышения эффективности. Вычислительные ядра могут быть написаны с использованием C, CUDA, OpenCL или даже сборки для максимальной эффективности. Поэтому неудивительно, что «сборка только для Python» не поддерживает ...

  • «Фьюзинг» означает обобщение этапов вычисления. По сути, это хитрость реализации для более эффективного выполнения кода путем объединения аналогичных операций в одной аппаратной (GPU, CPU или TPU) операции. Следовательно, "fusedLayer" - это уровень, в котором операции получают выгоду от реализации "fused".

...