Я читаю документацию 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). Я рекомендую
ждать, пока это не объединится, затем попробовать.
Это частично объясняет это. У меня осталось больше вопросов:
Что подразумевается под ядром? Слой или оптимизатор?
Является ли идея слитого слоя такой же, как у плавленого оптимизатора?