В команде перевезли пайплайны инференса с vLLM на SGLang, получилось почти в 2 раза быстрее!
TL/DR 😨
- Radix Attention сохраняет кеш по префиксам между запросами + свой батчинг и декодирование
- Хорошо для генерации с длинным шаблонным промптом, например, датасетов с few-shot
- Довольно быстро разрабатывается, может что-то сломаться, как периодически бывает с тем же vLLM
Нам, к примеру, не хватало выдачи логвероятностей в ответах API,
завели issue и авторы в короткие сроки добавили функционал. Кайф!
В статье рекомендую ознакомиться с абстрактом, секциями 3 и 4.
Репо |
Статья |
Блогпост
Подробнее 🆒
ОПЯТЬ™
грамотно управляем KV Cache. Общая идея — как можно больше переиспользовать кеш между запросами (на префиксах + LRU), а вместо классического FIFO особым образом отбирать запросы в батч, чтобы максимизировать hit rate для этого кеша. В vLLM можно частично добиться похожей оптимизации настройкой конфига, но механизма умного батчирования нет: надо самому в определённом порядке слать запросы, иначе hit rate заведомо будет ниже. Плюс под каждый кейс инференса с vLLM приходилось подбирать свои параметры, а в SGLang без особого тюнинга просто полетели и сразу хорошо!
Авторы как раз проанализировали типичные паттерны вызовов к LLM под разные задачи и выделили секции кеша, которые можно переиспользовать.
Но кайфы не кончаются! Есть свой Python фронтенд для формирования запросов. Идея такого фронта уже попса: смотрим те же
LMQL,
Guidance,
DSPy и другие. Но фишка фронта SGLang в тесной интеграции с собственным движком инференса.
Запрос разбирается и конвертится в оптимизированную цепочку вызовов к LLM, причём накидывание структурных ограничений типа
«хочу JSON вида r"<regex>"»
оптимизируется на уровне декодирования с помощью конечных автоматов (FSM) с модификациями: Compressed FSM + Jump Forward.
Получаем Apple от мира движков для инференса LLM: когда контролируешь и железную имплементацию и UI/UX одновременно, можешь выжать максимум из обоих и доставить пользователю максимальный brrr!
#LLM #Review