Оптимизация инференса LLM: скорость ответа, нагрузка и загрузка видеокарт

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

Обследование с замером нагрузки — от 200 000 ₽Цель в цифрах задаёте вы, мы показываем, чем она оплачиваетсяКачество ответов проверяем после каждой правки

С чем приходят

Когда инференс становится отдельной задачей

Ответ идёт слишком долго

Один пользователь ждёт, пока модель дочитает длинный запрос и напишет ответ, а ассистент ощущается медленным.

Сервис не держит нескольких пользователей

Пока работает один, всё хорошо. Когда подключается отдел, ответы замедляются, очередь растёт, а часть запросов падает по времени ожидания.

Видеокарты дорогие, а загрузка низкая

Закупили оборудование, но оно простаивает между запросами, или, наоборот, упирается в память. Просят докупить, не зная, поможет ли это.

Страшно сжимать модель

Знают о квантовании и других приёмах, но не понимают, что теряется. Без проверки на своих документах решиться на правку нельзя.

Из чего состоит ответ

Из чего складывается время ответа и что на него влияет

Время ответа — это не одно число. Разные его части лечатся разными средствами, поэтому без разбивки любая правка действует вслепую.

Очередь, чтение запроса, выдача ответа

Запрос сначала ждёт в очереди, потом модель читает его целиком (чем длиннее запрос с вложенными документами, тем дольше), и только затем начинает выдавать ответ по частям, слово за словом. Пользователь чувствует два интервала: время до первого слова и скорость, с которой текст появляется дальше. Чтение запроса упирается главным образом в вычислительную мощность карты, выдача ответа — в скорость обращения к памяти и в размер весов.

Почему важен профиль нагрузки

Ассистент по документам присылает длинные запросы с найденными фрагментами и получает короткие ответы: узким местом оказывается чтение. Классификатор обращений получает короткие запросы и отдаёт несколько слов, и всё решает число запросов в секунду. Чат с агентом ведёт длинные диалоги, где контекст растёт, а память под него занята. Один и тот же сервер для этих трёх задач настраивается по-разному.

Что происходит с памятью

Кроме самих весов, видеопамять занимает кэш уже прочитанного контекста, и он растёт с длиной запроса и числом одновременных диалогов. Когда память кончается, сервер начинает ограничивать число запросов в обработке, и очередь растёт даже при незагруженных вычислениях. Расчёт этой части описан в статье «Сколько видеопамяти нужно для своей языковой модели».

Замер

Что измеряем до любых правок

Замер на ваших запросах, а не на демонстрационном тексте. Без него «стало быстрее» нельзя ни доказать, ни повторить.

Показатель
Что показывает
Как измеряем
Что делаем с результатом
ПоказательВремя до первого словаощущение отклика
Что показываетСколько ждёт пользователь, пока начнётся ответ
Как измеряемЗапросы вашего профиля, по одному и под нагрузкой; смотрим не среднее, а худшие запросы
Что делаем с результатомЕсли велико при длинных запросах, смотрим длину запроса, кэш префикса и мощность карты
ПоказательСкорость выдачичтение ответа
Что показываетСколько текста появляется в секунду после первого слова
Как измеряемЗамер на ответах нужной длины
Что делаем с результатомЕсли низкая, смотрим размер весов, способ хранения и параллельность
ПоказательЧисло одновременных пользователейпредел сервиса
Что показываетПри каком числе параллельных диалогов ответ ещё укладывается в вашу цель
Как измеряемНагрузочный прогон с нарастанием числа пользователей
Что делаем с результатомПоказываем предел и узкое место: вычисления, память или очередь
ПоказательЗанятость видеопамятизапас
Что показываетКакая доля памяти уходит на веса, на кэш контекста и на служебные буферы
Как измеряемНаблюдение за картой в ходе прогона
Что делаем с результатомРешаем, что сжимать: веса, контекст или число одновременных диалогов
ПоказательКачество ответовцена любой правки
Что показываетСовпадение ответов с эталоном на выборке из ваших документов и вопросов
Как измеряемНабор проверочных вопросов с разметкой, сравнение до и после правки
Что делаем с результатомПравка принимается, только если качество не ниже порога, согласованного с вами
Рычаги

Рычаги ускорения: что даёт, чем платите и как проверяем

Рычаги применяются по очереди, начиная с самых дешёвых по риску. Общий разбор приёмов — в статье «Как ускорить инференс LLM».

Рычаг
Что даёт
Чем платим
Как проверяем
РычагКвантование весовменьший размер
Что даётВеса занимают меньше памяти, модель помещается на меньшую карту или остаётся место под кэш
Чем платимЧасть точности: у разных моделей и задач потеря разная, предсказать нельзя
Как проверяемСравнение с исходной моделью на вашей выборке, особенно на длинных и числовых ответах
РычагНепрерывное пакетированиебольше пользователей
Что даётСервер собирает запросы разных пользователей в общую обработку, и карта простаивает меньше
Чем платимОтдельный пользователь иногда ждёт чуть дольше ради общей пропускной способности
Как проверяемНагрузочный прогон до и после, худшие запросы
РычагКэш префиксабыстрый старт
Что даётОдинаковое начало запроса (инструкция, шаблон) читается один раз и переиспользуется
Чем платимПамять под кэш и дисциплина в запросах: меняющийся текст нельзя ставить в начало
Как проверяемВремя до первого слова на реальных запросах
РычагКороткий запросменьше работы
Что даётСжатие инструкций, ограничение числа вложенных фрагментов, отбор по смыслу вместо «всё подряд»
Чем платимВозможна потеря нужного фрагмента, поэтому правим вместе с качеством поиска
Как проверяемКачество ответов на выборке, доля ответов без нужного источника
РычагМодель поменьше или маршрутизациядешёвые ответы
Что даётПростые запросы идут на малую модель, сложные на большую
Чем платимНужен классификатор запроса и запасной путь при ошибке выбора
Как проверяемДоля запросов, которые малая модель решила не хуже большой, на размеченной выборке
РычагСпекулятивная генерациябыстрее выдача
Что даётМалая модель предлагает слова, большая проверяет сразу несколько
Чем платимВторая модель в памяти и сложность настройки; выигрыш зависит от задачи
Как проверяемСкорость выдачи на ваших ответах; результат обязан совпадать с исходным
РычагНесколько карткрупная модель
Что даётМодель делится между картами, если на одну не помещается
Чем платимОбмен между картами и расходы на питание и охлаждение
Как проверяемПрогон на целевом оборудовании, пропускная способность против одной карты
Сервер инференса

Выбор сервера инференса: не по названию, а по замеру

Языковую модель обслуживает специальная программа. Выбор влияет на скорость, но слабее, чем профиль нагрузки и размер модели.

На открытых серверах инференса, таких как vLLM, llama.cpp и Text Generation Inference, и на решениях производителей карт у каждого свои сильные стороны: одни хорошо собирают запросы в общую обработку, другие удобно работают на процессоре и на небольших картах, третьи требуют конкретного оборудования. Формат весов и поддержка именно вашей модели часто решают больше, чем заявленная скорость.

Мы не привязываемся к одному серверу. На обследовании прогоняем ваш профиль запросов на двух-трёх кандидатах на вашем оборудовании и показываем результаты таблицей: что быстрее на длинных запросах, что на множестве коротких, как поведение под нагрузкой, насколько сложно обновлять. Выбор записывается вместе с причинами.

Что входит в вопрос выбора

  • Оборудование. Какие карты есть и что поддерживает программа на них; для отечественных ускорителей и редких карт поддержку проверяем отдельно.
  • Формат весов и лицензия. Какие форматы читает сервер и разрешает ли лицензия модели ваше использование.
  • Интерфейс. Совместим ли сервер с общепринятым интерфейсом запросов, чтобы приложения не пришлось переписывать.
  • Эксплуатация. Как обновляется, какие даёт метрики для мониторинга, что делает при нехватке памяти.
Профили

Три типичных профиля нагрузки и что для каждого оптимизируем

Заготовка для разбора: на ваших запросах строки будут другими.

Профиль
Особенность
Что оптимизируем в первую очередь
Что почти не поможет
ПрофильАссистент по документампоиск и ответ
ОсобенностьДлинные запросы с найденными фрагментами, ответ короткий
Что оптимизируем в первую очередьДлину запроса и отбор фрагментов, кэш префикса, время до первого слова
Что почти не поможетУскорение выдачи ответа: ответ и так короткий
ПрофильМассовая обработкаклассификация, извлечение полей
ОсобенностьМножество коротких однотипных запросов, срочность невелика
Что оптимизируем в первую очередьПакетирование, загрузку карты, ночные окна, малую модель
Что почти не поможетКэш диалога и время до первого слова: пользователя нет
ПрофильДиалог с агентоммного шагов
ОсобенностьДлинный разговор, несколько обращений к модели на один вопрос, растущий контекст
Что оптимизируем в первую очередьСжатие истории, память под кэш, число обращений на задачу, число одновременных диалогов
Что почти не поможетКвантование без проверки: ошибка шага тянет за собой следующие
Инфраструктура

ИИ-инфраструктура вокруг модели

Шлюз и очередь

Перед сервером стоит шлюз: проверяет пользователя, ограничивает число запросов от одного, задаёт приоритеты. Тяжёлая массовая обработка не мешает живым диалогам.

Мониторинг

Загрузка карт и памяти, длина очереди, время до первого слова, число ошибок и отказов по времени.

Обновления без интернета

Модели и серверы приходят во внутренний реестр, выпуск проходит на тестовом стенде, прошлая версия остаётся наготове для отката.

Запасной сценарий

Если карта вышла из строя или очередь переполнена, сервис отвечает понятным сообщением или переключается на меньшую модель, а не зависает. Поведение записано в регламенте.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Цена называется по итогам обследования, остановиться можно после любой ступени. Внутри вилки цену двигают число моделей и серверов, строгость целей по скорости, состояние оборудования и объём проверочной выборки.

Обследование: профиль нагрузки и замер

Собираем реальные запросы, измеряем время ответа и предел сервиса на текущем оборудовании, определяем узкое место. На выходе список мер по порядку, ожидаемый выигрыш и вилка бюджета. Вычитается из первого этапа, если продолжаете с нами.

200 000 ₽ · 2–3 недели

Обследование: несколько моделей и серверов

Несколько моделей, площадок или смесь процессорных и видеокарточных узлов, шлюз и мониторинг.

350 000 ₽ · 3–4 недели

Лёгкий пилот: настройка одного сервера

Выбор сервера инференса, правка настроек, кэш, пакетирование, повторный замер. Квантование включается только после проверки качества.

150 000–400 000 ₽ · 2–8 недель

Тяжёлый пилот: маршрутизация и несколько моделей

Малая и большая модели, маршрутизация запросов, шлюз с очередями и приоритетами, мониторинг, нагрузочные испытания на целевом оборудовании.

400 000–1 200 000 ₽ · 2–3 месяца

Вывод в эксплуатацию

Опытная эксплуатация, регламент обновлений и отката, запасные сценарии, передача исходников и инструкций.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽ · от 3 месяцев

Сопровождение

Мониторинг, повторные замеры при смене модели, обновления серверов инференса с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

Недели 1–3 — Профиль и замер

Собираем реальные запросы и длины ответов, фиксируем текущее время и предел сервиса. Вместе с вами записываем цель: допустимое время до первого слова и число пользователей.

Параллельно — Проверочная выборка

Собираем набор вопросов и эталонных ответов на ваших документах.

Дальше 2–8 недель — Правки по одной

Меняем один рычаг, повторяем замер и проверку качества, записываем результат. Правку, которая не дала выигрыша или снизила качество, откатываем.

Нагрузочные испытания

Прогон на целевом оборудовании с нарастанием числа пользователей. Фиксируем предел, поведение при перегрузке и действия запасного сценария.

Дальше — Передача и сопровождение

Передаём настройки, образы, результаты замеров и инструкцию по повторению. Новую модель или новое оборудование можно замерить заново теми же скриптами.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

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

Мы этого не делаем

  • Не продаём и не сдаём в аренду видеокарты, не закупаем оборудование за вас: считаем, что нужно, закупка остаётся у вас.
  • Не обучаем крупные модели с нуля и не берём задачи, где нужны сотни ускорителей.
  • Не обещаем конкретное ускорение заранее: выигрыш показывает замер на вашем профиле.
  • Не дежурим круглосуточно, не имеем лицензии ФСТЭК и не проводим аттестацию.
  • Не берём работы дешевле 150 000 ₽.
Граница

Оптимизация, развёртывание или MLOps: где граница

Если языковой модели у вас ещё нет, начинают со страницы «LLM на своём сервере»: там состав системы, расчёт железа и первый запуск. Оптимизация приходит следом, когда система работает, но не укладывается в скорость или нагрузку. Если на модели строится приложение с поиском по документам и действиями, это отдельная услуга, а скорость ответа становится одним из её требований.

Версии моделей, оценка качества при обновлениях и мониторинг дрейфа относятся к MLOps и развёртыванию моделей. Когда вопрос в том, подойдёт ли вообще своя модель или хватит внешнего программного интерфейса, сравнение лежит в статье «Своя LLM или ChatGPT API». Внешний интерфейс снимает заботу о железе, но для данных ограниченного доступа чаще не подходит по требованиям заказчика.

Инструменты

На чём собираем

Серверы инференса и модели
  • vLLM, llama.cpp или Text Generation Inference по результатам замера
  • Открытые модели с лицензией, разрешающей ваше использование
  • Квантованные веса после проверки на вашей выборке
  • Совместимый программный интерфейс для приложений
Шлюз, мониторинг и развёртывание
  • Шлюз на Python или Go с очередями и ограничениями
  • Prometheus, Grafana, метрики карт и серверов
  • Docker, внутренний реестр образов, GitLab CI
  • Скрипты нагрузочных прогонов в вашем репозитории
Материалы

Материалы по теме

Статья

Сколько видеопамяти нужно для своей языковой модели

Из чего складывается память: веса, кэш контекста и буферы. Считаем на примере.

  • Веса
  • Кэш контекста
  • Квантование
Читать →
Статья

Как развернуть LLM в закрытом контуре

Порядок работ и состав системы, в которую встроится оптимизация.

  • Состав
  • Обновления
  • Журнал
Читать →
Статья

Своя LLM или ChatGPT API

Когда подходит внешний программный интерфейс, а когда нужна модель на своих серверах.

  • Данные
  • Нагрузка
  • Стоимость владения
Читать →
Заявка

Разберём, где у вашей модели узкое место

Сорок минут созвона: какая модель и на каком железе, какие запросы, сколько пользователей, чем недовольны. По итогам скажем, с какой ступени начинать и в какую вилку это укладывается.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: оптимизация инференса llm

Сколько стоит оптимизация инференса LLM?

Обследование с замером стоит 200 000 ₽ за один сервер и одну модель и 350 000 ₽ за несколько моделей и площадок; оно вычитается из первого этапа, если продолжаете с нами. Настройка одного сервера — лёгкий пилот за 150 000–400 000 ₽, маршрутизация и несколько моделей — тяжёлый за 400 000–1 200 000 ₽. Вывод в эксплуатацию — от 1 500 000 ₽ этапами по 300 000–700 000 ₽, сопровождение — от 20 000 ₽ в месяц.

Можно ли ускорить модель без покупки новых видеокарт?

Часто да, но заранее обещать нельзя. Если узкое место в очереди или в слишком длинных запросах, помогают пакетирование, кэш и сокращение запроса. Если не хватает памяти или вычислительной мощности под нужное число пользователей, правками этого не заменить, и замер покажет, сколько не хватает.

Ухудшится ли качество после квантования?

Возможно, и насколько, зависит от модели и задачи. Поэтому квантование включаем только после сравнения с исходной моделью на вашей выборке: смотрим длинные ответы, числа и редкие термины. Если потеря выше согласованного порога, оставляем исходные веса.

Сколько пользователей выдержит наш сервер?

Число определяется профилем нагрузки, длиной запросов и ответов, размером модели и объёмом памяти, поэтому назвать его без прогона нельзя. На обследовании мы нагружаем сервер вашими запросами с нарастанием числа пользователей и показываем предел и узкое место.

Можно ли запускать модель на процессоре?

Небольшие модели можно запускать на процессоре, и для редких запросов или пакетной ночной обработки этого достаточно. Для живого диалога с несколькими пользователями и моделью среднего размера обычно нужна видеокарта. Решение принимается по замеру на вашем профиле.

Нужно ли переходить на другой сервер инференса?

Не обязательно. Часто хватает настроек текущего: кэша, пакетирования, ограничений по длине. Смену рекомендуем, когда замер показывает, что текущий не поддерживает нужный формат, оборудование или не справляется с профилем нагрузки.

Подойдёт ли внешний программный интерфейс вместо своего сервера?

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

Кому принадлежат настройки, скрипты и результаты замеров?

Вам. Исходный код, конфигурации и документация передаются по акту, порядок передачи прав записывается в договоре. Персональные данные граждан России обычно должны храниться на серверах в России.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.