Как объединение CUDA-ядер ускоряет инференс LLM

Автоматический перевод

Эта статья была автоматически переведена с оригинальной английской версии.

Объединение CUDA-ядер совмещает операции, которые иначе выполнялись бы как отдельные GPU-ядра. Оно может сократить накладные расходы на запуск и исключить запись промежуточного тензора в память GPU с немедленным повторным чтением. Это помогает, когда такие затраты составляют заметную часть латентности инференса.

Проследите путь промежуточных данных

Рассмотрим сложение в остаточной связи с последующей нормализацией. Отдельные ядра могут записывать результат сложения в основную память GPU и снова читать его для нормализации. Совместимая объединённая реализация может повторно использовать промежуточные значения внутри ядра. Это сокращает передачи данных, но не отменяет математические операции и требования к их корректности.

Объединять можно и более крупные операции. DeepFusionKernel исследует объединение полного вычисления сети прямого распространения SwiGLU, включая матричные умножения. Это больше, чем объединение поэлементных функций активации.

FlashNorm использует другое преобразование: включает обученный коэффициент масштабирования RMSNorm в последующую линейную операцию и откладывает повторное масштабирование.

Проверьте, помогло ли объединение

Что сравнитьЧто покажет улучшение
Запуски ядер и интервалы между нимиМеньше накладных расходов между небольшими операциями
Чтения и записи HBMМеньше промежуточных передач данных
Использование регистров и разделяемой памятиТребуется ли объединённому ядру больше локальной памяти
Перенос данных из регистров в память и активные блокиСократило ли потребление ресурсов параллельное выполнение
Латентность полного запросаИмело ли изменение ядра значение для пользователей

Руководство по оптимизации Hopper объясняет ограничения ресурсов, от которых зависит объём одновременно выполняемой работы на GPU. Объединение операций может увеличить потребление регистров, вызвать перенос данных из регистров в память или ограничить число одновременно выполняемых блоков. Поэтому более крупное объединённое ядро может работать медленнее для некоторых форм тензоров.

Зафиксируйте модель, точность, GPU, длину входа и размер батча. Проверяйте не только время, но и численные результаты и качество выполнения задачи. Также сравните декодирование с небольшими батчами и префилл с более крупными: снижение накладных расходов на запуск может быть гораздо важнее для коротких операций, чем для длительных матричных вычислений.

Инженерное руководство: CUDA-ядра и их объединение связывает эти методы с квантизированными матричными ядрами.