Как объединение CUDA-ядер ускоряет инференс LLM
Автоматический перевод
Эта статья была автоматически переведена с оригинальной английской версии.
Объединение CUDA-ядер совмещает операции, которые иначе выполнялись бы как отдельные GPU-ядра. Оно может сократить накладные расходы на запуск и исключить запись промежуточного тензора в память GPU с немедленным повторным чтением. Это помогает, когда такие затраты составляют заметную часть латентности инференса.
Проследите путь промежуточных данных
Рассмотрим сложение в остаточной связи с последующей нормализацией. Отдельные ядра могут записывать результат сложения в основную память GPU и снова читать его для нормализации. Совместимая объединённая реализация может повторно использовать промежуточные значения внутри ядра. Это сокращает передачи данных, но не отменяет математические операции и требования к их корректности.
Объединять можно и более крупные операции. DeepFusionKernel исследует объединение полного вычисления сети прямого распространения SwiGLU, включая матричные умножения. Это больше, чем объединение поэлементных функций активации.
FlashNorm использует другое преобразование: включает обученный коэффициент масштабирования RMSNorm в последующую линейную операцию и откладывает повторное масштабирование.
Проверьте, помогло ли объединение
| Что сравнить | Что покажет улучшение |
|---|---|
| Запуски ядер и интервалы между ними | Меньше накладных расходов между небольшими операциями |
| Чтения и записи HBM | Меньше промежуточных передач данных |
| Использование регистров и разделяемой памяти | Требуется ли объединённому ядру больше локальной памяти |
| Перенос данных из регистров в память и активные блоки | Сократило ли потребление ресурсов параллельное выполнение |
| Латентность полного запроса | Имело ли изменение ядра значение для пользователей |
Руководство по оптимизации Hopper объясняет ограничения ресурсов, от которых зависит объём одновременно выполняемой работы на GPU. Объединение операций может увеличить потребление регистров, вызвать перенос данных из регистров в память или ограничить число одновременно выполняемых блоков. Поэтому более крупное объединённое ядро может работать медленнее для некоторых форм тензоров.
Зафиксируйте модель, точность, GPU, длину входа и размер батча. Проверяйте не только время, но и численные результаты и качество выполнения задачи. Также сравните декодирование с небольшими батчами и префилл с более крупными: снижение накладных расходов на запуск может быть гораздо важнее для коротких операций, чем для длительных матричных вычислений.
Инженерное руководство: CUDA-ядра и их объединение связывает эти методы с квантизированными матричными ядрами.