Почему модель отвечает медленно (и виновата ли сама модель)
Давайте обсудим инференс.
Инференс – это когда модель отвечает. Не обучение, не файнтюн, вот этот момент. И внутри он состоит из двух разных фаз (схема выше).
Префилл: модель читает весь промпт одним куском. Тяжелые вычисления, вы смотрите в пустой экран.
Декод: пишет по одному слову, на каждом заглядывая в память. Узкое место здесь уже не вычисления, а скорость памяти.
Отсюда главное. Долго нет первого слова – болеет префилл. Слово появилось, но текст ползет – декод. Болит разное, чинить нужно разное.
Одна и та же модель на одной и той же видеокарте может отвечать восемь секунд или меньше секунды. Люди меняют модель на дорогую, хотя дело было в конфиге.
KV-кэш. Чтобы написать пятидесятое слово, надо помнить сорок девять предыдущих; без кэша модель перечитывала бы весь текст заново на каждом шаге. Включен везде по умолчанию – но кушает почти всю память видеокарты. Половина остальных техник существует, чтобы его туда уместить.
Непрерывный батчинг. Было как автобус: набралась группа – поехали, а кто ответил за секунду, ждет самого медленного. Стало как эскалатор: закончил – сошел, следующий встал на место. Красивая метафора, украла у нейронки.
Кэш начала промпта. В чате каждое сообщение тащит всю переписку, и модель считает одно и то же по двадцатому кругу. Кэш запоминает начало.
Правило, из-за которого у половины это не работает: неизменное (инструкции, документ, история) – в начало, вопрос – в конец. Поменяли первые строки, и кэш сбросился весь. Самая дешевая оптимизация из всех: ничего не ставить, качество не страдает, счет за API падает.
Квантизация. Веса в 16 битах можно сжать в 8 или 4 – как RAW в хороший JPEG. Восьмибитный на глаз не отличить, четырехбитный теряет процент-два. Берем при нехватке памяти.
Спекулятивное декодирование. Выглядит как жульничество: маленькая модель угадывает несколько слов вперед, большая проверяет пачку одним движением. Угадала – приняли целиком, нет – выбросили. Текст на выходе тот же. Быстрее –да, хуже – нет.
Если медленно: определяем фазу по схеме, потом кэш префикса и порядок блоков в промпте, и только потом квантизация со спекулятивкой.
И про хайпы тренды. Дизагрегация – это когда две фазы разносят на разные пулы видеокарт. Технология правда топовая, у крупных в проде, но окупается от тысячи GPU с быстрой сетью. В пет-проекте вы получите только удвоенную сложность. Не берем.
Ликбез на русском: https://www.youtube.com/watch?v=PsKMCmwj-r4
Post #19
114

- 🔥 3
- ❤ 1