Что такое Flash-Decoding и когда он ускоряет LLMs?
Автоматический перевод
Эта статья была автоматически переведена с оригинальной английской версии.
Flash-Decoding распараллеливает аттеншн при декодировании по закэшированной последовательности ключей и значений. Разные блоки GPU обрабатывают разные части длинной истории, а затем объединяют частичные результаты аттеншна с численно корректной нормализацией. Это может ускорить генерацию с малыми батчами, если длинный кэш даёт больше работы, чем текущая схема выполнения аттеншна обрабатывает эффективно.
Он ускоряет операцию аттеншна. Итоговое ускорение сервинга также зависит от времени, которое занимают остальные части модели.
Почему декодированию нужна другая схема выполнения
Во время префилла множество позиций запроса можно обрабатывать параллельно. При обычном декодировании каждая активная последовательность добавляет одну новую позицию запроса. Поэтому малый батч может давать слишком мало независимых блоков для эффективной загрузки GPU, хотя каждый запрос должен прочитать длинную историю.
Flash-Decoding создаёт дополнительные единицы работы, разделяя эту историю. Каждая единица вычисляет частичный результат и значение нормализации log-sum-exp. Редукция объединяет их в результат, который должен дать аттеншн по полной истории. См. объяснение Flash-Decoding от авторов из Стэнфорда.
При короткой истории дополнительная работа с частичными результатами и редукцией может превышать выигрыш. Более крупный батч уже может давать достаточно параллельной работы. Ни один из этих случаев не гарантирует ускорения от дальнейшего разделения последовательности.
Как понимать опубликованный результат
Авторы сообщили о сквозном ускорении до восьми раз в своей оценке CodeLlama-34B с батчем размера один на четырёх GPUs A100 при длинах последовательности от 512 до 64K. В сравнении использовались выбранные ими базовый вариант и конфигурация выполнения. Это не означает восьмикратного ускорения относительно современного сервера с уже оптимизированным бэкендом декодирования.
При тестировании своего сервера:
- проверьте, действительно ли выбранный бэкенд аттеншна использует этот метод;
- сравнивайте одну и ту же модель, конфигурацию GPU, точность кэша и длины последовательностей;
- тестируйте как батч размера один, так и реалистичное число одновременных запросов;
- измеряйте время ядра аттеншна отдельно от полного шага декодирования;
- измеряйте латентность выходных токенов и численную корректность.
После ускорения ядра аттеншна чтение весов, вычисления feed-forward или коммуникация могут стать основной оставшейся затратой. При решении об изменении конфигурации сервинга ориентируйтесь на сквозной результат.
Инженерное руководство: Flash-Decoding связывает разделение последовательности с различием между префиллом и декодированием.