Inference
inference — применение готовой модели к новым данным
Inference, или инференс, начинается, когда готовая модель получает новые данные и строит результат: класс, прогноз, текст, изображение или эмбеддинг. В обычном режиме её веса не обучаются заново. Скорость запроса зависит не только от модели и устройства, но и от подготовки данных, очереди, длины входа и выхода, кэшей, объединения запросов и постобработки.
Коротко
Inference, или инференс, — применение уже обученной модели к новым данным. Вход проходит подготовку, модель вычисляет выход, а приложение превращает его в понятный результат. Веса при обычном инференсе остаются прежними: запрос использует выученные закономерности, но не запускает новый цикл обучения.
Инференс может занять один проход модели, как в классификаторе, или состоять из многих шагов, как в языковой и диффузионной генерации. Поэтому универсальной скорости «одного запроса» не существует.
Что называют инференсом
Во время обучения модель настраивает параметры на примерах. При инференсе она использует сохранённые параметры, чтобы получить результат для поданного входа. Обычно это новые данные, но можно подать и пример из обучающей выборки: процедуру определяет способ работы модели, а не новизна входа.
Входом может быть текст, изображение, звук, таблица или набор признаков. Выход тоже бывает разным:
- вероятность классов;
- число или прогноз;
- эмбеддинг;
- маска сегментации;
- следующий токен текста;
- шум, скорость или другое промежуточное предсказание генеративной модели.
Пользователь обычно видит не сырой тензор, а результат всей цепочки. Между кнопкой «Отправить» и ответом помещаются токенизация, изменение размера изображения, очередь сервера, вычисление модели, выбор выходных значений и постобработка. В разговоре всё это нередко называют одним словом «инференс», хотя прямой проход модели (forward pass) — лишь центральная часть.
Из чего состоит запрос
У самой общей схемы четыре части.
- Подготовка входа. Текст превращается в токены, изображение — в тензор нужного размера, звук — в отсчёты или признаки. Входы объединяются в пакет (batch), если движок обрабатывает несколько примеров вместе.
- Проход модели. Слои последовательно вычисляют активации, используя сохранённые веса. Для одного входа может понадобиться один проход или серия повторяющихся проходов.
- Выбор и сборка результата. Классификатор выбирает метку, языковая модель — следующий токен, диффузионная цепочка — обновлённое скрытое представление.
- Постобработка. Токены превращаются в строку, координаты — в рамки, скрытое представление (latent) — в пиксели, а ответ получает нужный формат.
Эта схема одинаково полезна для локального приложения, браузера и удалённого сервиса. Меняется место вычисления и окружение, но не смысл термина.
Почему LLM отвечает постепенно
Авторегрессионная языковая модель предсказывает продолжение по уже видимому тексту. Её запрос обычно делится на две фазы.
Prefill
Сначала модель обрабатывает весь вход: системные инструкции, историю, документы и пользовательский вопрос. На этом этапе формируется KV-кэш — сохранённые представления ключей и значений из слоёв внимания. Длинный вход увеличивает объём этой работы и часто сильнее влияет на время до первого токена.
Decode
Затем модель выбирает следующий токен, добавляет его к последовательности и повторяет шаг. KV-кэш позволяет использовать результаты для предыдущих позиций, а не заново строить их с нуля. При этом новый токен всё равно должен учитывать накопленный контекст, поэтому кэш экономит вычисления, но занимает память. При полном внимании он растёт вместе с последовательностью; у слоёв со скользящим окном рост ограничен размером окна. Некоторые реализации заранее резервируют память под максимальную длину.
Sampling определяет, как из распределения вероятностей выбирается продолжение. Жадный выбор берёт наиболее вероятный вариант, а случайная выборка использует настройки temperature, top-p и другие ограничения. Это часть процедуры генерации, а не изменение весов.
У других моделей цикл иной
Классификатор изображения обычно получает подготовленный тензор и выдаёт оценки классов за один forward pass. Детектор добавляет декодирование координат и фильтрацию пересекающихся рамок. Модель эмбеддингов превращает вход в вектор, который затем сравнивает уже другое приложение.
Диффузионная генерация начинает со случайного или частично зашумлённого представления и несколько раз вызывает модель с уровнями шума, которые задаёт расписание. Каждый шаг уточняет представление; после последнего шага декодер может перевести latent в пиксели. Число вызовов зависит от архитектуры и выбранного метода, поэтому фиксированное правило вроде «у любой диффузии несколько десятков проходов» быстро становится неверным.
Инференсом называют всю законченную процедуру, даже если внутри неё один проход, цикл или несколько разных моделей подряд.
Что остаётся неизменным
В обычном inference-запросе оптимизатор не делает шаг обновления и параметры модели не обновляются. Это не означает, что вокруг модели ничего не меняется.
- KV-кэш и активации создаются для текущей последовательности.
- Приложение может записать историю диалога, пользовательские настройки или найденные документы.
- RAG и инструменты добавляют свежие данные в следующий вход.
- Сервер может динамически объединять запросы в batch и переносить кэши между уровнями памяти.
- Модель с сохраняемым состоянием может обновлять предусмотренное архитектурой состояние, не обучая веса.
Поэтому фраза «модель запомнила разговор» часто описывает работу всей системы. Сама модель может каждый раз получать сохранённую историю заново как часть входа.
___NSLPROTECT10___ и отключение градиентов — не одно и то же
Во фреймворках режим поведения слоёв и работа автоматического дифференцирования управляются отдельно. В PyTorch model.eval() переключает, например, Dropout и BatchNorm в режим оценки, но сам по себе не отключает вычисление градиентов. torch.inference_mode() отключает запись операций для автоматического дифференцирования и часть служебных проверок, но не вызывает eval() автоматически.
Если модель уже загружена, а batch содержит подготовленные входы на нужном устройстве, вызов может выглядеть так:
import torch
model.eval()
with torch.inference_mode():
output = model(batch)
Это деталь реализации, а не определение инференса. Другие среды исполнения могут заранее оптимизировать граф, объединять операции и вообще не включать механизмы обучения в исполняемый пакет.
Из чего складывается задержка
Время модели — только один участок пути. Полная задержка может включать:
- загрузку модели и прогрев вычислительных операций;
- подготовку входа;
- сеть и очередь;
- prefill или основной forward pass;
- decode либо другой повторяющийся цикл;
- постобработку и передачу результата клиенту.
На вычислительную часть влияют размер и архитектура модели, длины последовательностей, размер пакета, формат чисел, реализация вычислительных операций, скорость памяти и распределение по устройствам. Больший batch часто повышает общую производительность системы, но отдельный запрос может ждать дольше. Дополнительная RAM или VRAM помогает вместить веса и кэши; ускорение появляется только тогда, когда меняется реальное узкое место.
Как измеряют LLM-инференс
Одна цифра «токенов в секунду» редко описывает пользовательский опыт целиком. Обычно разделяют несколько метрик.
- TTFT, time to first token — время от отправки запроса до первого содержательного токена. В него могут входить очередь, сеть и prefill.
- ITL, inter-token latency, или TPOT, time per output token — пауза между последующими токенами. Методики иногда считают её немного по-разному.
- End-to-end latency — время до полного ответа.
- Throughput — сколько запросов или токенов обслуживает вся система за интервал.
- Память — веса, временные буферы, активации, KV-кэш и служебные расходы среды исполнения.
Для сравнения вместе с метриками указывают длины входа и выхода, число одновременных запросов, размер пакета, формат весов, устройство, среду исполнения и наличие прогрева. Без этих условий результаты разных стендов плохо сопоставимы.
Пример без привязки к сервису
Допустим, редактор отправляет расшифровку интервью и просит короткое резюме.
- Приложение добавляет системную инструкцию и превращает весь текст в токены.
- Запрос ждёт свободного слота или сразу попадает в batch.
- Во время prefill модель обрабатывает инструкцию и интервью, создавая KV-кэш.
- Decode добавляет резюме токен за токеном; потоковая передача сразу отправляет готовые фрагменты интерфейсу.
- Клиент собирает строку и показывает ответ.
Если редактор позже просит изменить тон, новая просьба вместе с нужной историей снова становится входом. Веса от предыдущего ответа не переписываются. Быстрее или медленнее запрос сделают длина истории, нагрузка, кэширование префикса, выбранная модель и инфраструктура — не одно название видеокарты.
С чем часто путают
- Inference и training. При обычном градиентном обучении параметры меняются по вычисленным градиентам; обычный inference применяет сохранённые параметры.
- Inference и forward pass. Forward pass — вычисление модели один раз. Полный запрос может добавить подготовку входа, выбор результата, кэш, цикл и постобработку.
- Inference и API-запрос. API является способом обратиться к сервису. Само вычисление может происходить удалённо, локально или внутри приложения.
- Inference и serving. Serving охватывает загрузку моделей, очереди, объединение запросов, маршрутизацию, масштабирование и мониторинг вокруг инференса.
- Inference и prediction. В классическом ML слова часто взаимозаменяемы; inference шире подчёркивает процедуру применения модели.
- Контекст и память модели. История, RAG-хранилище и профиль пользователя могут принадлежать приложению, а не весам модели.
Частые заблуждения
«Инференс всегда детерминирован»
Sampling специально добавляет случайность. Даже при жадном выборе точное совпадение зависит от версии модели и среды исполнения, вычислительных операций, порядка их выполнения и настроек воспроизводимости. Один seed является важным условием, но не универсальной гарантией побитового результата.
«GPU всегда быстрее CPU»
Это зависит от модели, batch, доступных реализаций операций, подготовки данных и стоимости передачи между памятью устройств. Небольшая модель или короткий запрос иногда быстрее и проще исполняются на CPU; крупные матричные задачи чаще выигрывают от подходящего ускорителя.
«Batch ускоряет каждый запрос»
Batch помогает устройству выполнять больше полезной работы за единицу времени. При высокой нагрузке это повышает пропускную способность, но ожидание набора batch и конкуренция за ресурсы способны увеличить задержку для отдельного пользователя.
«Streaming ускоряет модель»
Streaming отправляет частичный результат сразу после появления. Ответ ощущается быстрее, хотя вычислительный объём и время до последнего токена не обязаны уменьшаться.
«Квантизация всегда делает инференс быстрее»
Меньший формат сокращает объём некоторых тензоров, но ускорение зависит от поддержки формата устройством и программой. Преобразования форматов чисел и неподдерживаемые операции могут съесть выигрыш или сделать режим медленнее.
Частые вопросы
Где может выполняться inference?
В серверном процессе, настольном приложении, мобильном устройстве, браузере или встроенной системе. Ограничения задают размер модели, память, доступные операции и требования к задержке, приватности и энергопотреблению.
Почему первый запрос иногда медленнее следующих?
В начале могут загружаться веса, компилироваться графы, подбираться реализации вычислительных операций и заполняться кэши. Это называют cold start и warm-up. Отдельно существует TTFT каждого запроса — его не стоит смешивать со стартом всего процесса.
KV-кэш хранит весь разговор?
Он хранит внутренние key/value-представления для токенов, которые участвуют в текущем вычислении или переиспользуемом префиксе. Это не долговременная память о пользователе. Когда кэш удалён, историю при необходимости снова подают текстом или другим входом.
Почему длинный вопрос может замедлить появление ответа?
Prefill должен обработать вход и построить кэш. Чем больше токенов видит модель, тем больше данных проходит через слои и attention. Точный рост зависит от архитектуры и оптимизаций.
Что расходует память кроме весов?
Входы, активации, рабочие буферы операций, среда исполнения, KV-кэш, пакеты входов и промежуточные результаты других моделей в цепочке. Поэтому размер файла с весами не равен требуемой памяти процесса.
Главное
Инференс не обязательно заканчивается одним проходом модели. Это применение готовой модели внутри цепочки: подготовка входа, вычисление, возможный цикл генерации и постобработка. Веса обычно остаются прежними, а временное состояние и контекст живут вокруг них.
Для языковых моделей особенно важны две разные фазы: prefill обрабатывает вход, decode строит продолжение по токену. Пользовательскую отзывчивость описывают TTFT и ITL, полное ожидание — end-to-end latency, а способность системы выдерживать поток — throughput. Эти метрики получают смысл только вместе с условиями измерения.
Источники
- PyTorch: inference_mode
- PyTorch: Module.eval
- Hugging Face Transformers: Caching
- Hugging Face Transformers: Cache strategies
- NVIDIA NIM Benchmarking: Overview
- NVIDIA NIM Benchmarking: Metrics
- NVIDIA NIM Benchmarking: Parameters and best practices
- ONNX Runtime: Graph optimizations
- Denoising Diffusion Probabilistic Models