26 октября 2026 г. · Анатолий Крылов, редактор Тераферма
Пакетная обработка LLM: как прогнать миллион запросов дешевле всего
Пакетная обработка LLM остаётся самым дешёвым способом прогнать через модель большой массив данных. Миллион запросов на классификацию (500 токенов на входе, короткий ответ-метка) моделью 8B на одной RTX 4090 обрабатывается примерно за 10 часов, это 480 ₽. Если у запросов общая инструкция и включено кэширование префикса, время сокращается до 2–3 часов. Главное: отдать модели все запросы сразу, а не слать их по одному.
Какие задачи решают пакетом
Пакетная обработка нужна везде, где результат не требуется прямо сейчас, а данных много:
- Разметка и классификация. Отзывы, обращения в поддержку, новости, вакансии — по темам, тональности, срочности.
- Извлечение данных. Реквизиты из договоров, характеристики из описаний товаров, поля из резюме — в таблицу или JSON.
- Суммаризация. Краткие выжимки звонков, переписок, отчётов для поиска и аналитики.
- Генерация контента. Описания товаров, мета-теги, варианты заголовков для тысяч страниц.
- Перевод и нормализация. Приведение адресов, названий и единиц к единому виду, перевод каталога.
- Синтетические данные. Генерация примеров для дообучения другой модели.
Общее у всех одно: ответ нужен к утру или к концу недели, а не через секунду. Именно это позволяет собрать запросы в большие батчи и выжать из карты максимум.
Почему пакет дешевле запросов по одному
Генерация текста упирается в память: на каждый новый токен видеокарта читает все веса модели. Для модели 8B в FP8 это около 8 ГБ на шаг. Если в шаге один запрос, карта прочитала 8 ГБ ради одного токена. Если сто запросов, то ради ста.
Поэтому одна RTX 4090 с моделью 8B выдаёт около 80–100 токенов в секунду на одного пользователя и тысячи токенов в секунду суммарно, когда запросов много. Разница в десятки раз при той же цене часа. Подробнее о том, во что упирается скорость, читайте в статье скорость генерации токенов LLM.
Отсюда главное правило: для пакетной обработки не нужен сервер с API и цикл, который шлёт запросы по одному. Нужен офлайн-режим, в котором движок получает весь список сразу и сам решает, как его батчить.
Формула: сколько часов и рублей
Обработка состоит из двух фаз с разной скоростью:
- prefill — модель читает вход. Это быстро: тысячи и десятки тысяч токенов в секунду, потому что входные токены обрабатываются параллельно;
- decode — модель пишет ответ по одному токену. Медленнее, и именно здесь работает батчинг.
время, ч = (входных токенов ÷ скорость prefill + выходных токенов ÷ скорость decode) ÷ 3 600
цена = время × цена часа карты
Скорости зависят от модели, карты, длины запросов и настроек. Для оценки возьмём модель 8B в FP8 на RTX 4090 и примем порядка 15 000 токенов в секунду на prefill и 2 000 токенов в секунду суммарно на decode при большом батче. Это ориентир для расчёта, а не замер: свою цифру получите за 15 минут, как описано ниже.
Бюджет для типовых задач
Миллион запросов, модель 8B, одна RTX 4090.
| Задача | Вход, токенов | Ответ, токенов | Prefill | Decode | Всего часов | Стоимость |
|---|---|---|---|---|---|---|
| Классификация отзывов по 10 темам | 500 | 5 | ~9,3 ч | ~0,7 ч | ~10 | 480 ₽ |
| Классификация с кэшем общей инструкции | 100 уникальных | 5 | ~1,9 ч | ~0,7 ч | ~2,6 | 125 ₽ |
| Извлечение полей в JSON | 800 | 150 | ~14,8 ч | ~20,8 ч | ~36 | 1 728 ₽ |
| Краткое резюме документа | 1 500 | 200 | ~27,8 ч | ~27,8 ч | ~56 | 2 688 ₽ |
| Генерация описаний товаров | 200 | 500 | ~3,7 ч | ~69,4 ч | ~73 | 3 504 ₽ |
Видно, что стоимость определяется не числом запросов, а токенами, и прежде всего токенами ответа. Миллион классификаций с ответом в одно слово стоит в семь раз дешевле миллиона описаний товаров.
Расчёт на пример извлечения данных: 800 млн входных токенов ÷ 15 000 = 53 300 секунд, это 14,8 часа. 150 млн выходных ÷ 2 000 = 75 000 секунд, 20,8 часа. Вместе около 36 часов.
Семь способов сократить счёт
1. Сократите ответ
Самый сильный рычаг. Если нужна метка, просите метку, а не объяснение. Ограничьте max_tokens и используйте структурированный вывод: vLLM умеет принудительно генерировать JSON по схеме или выбирать из списка вариантов. Модель не тратит токены на «Конечно! Вот ответ:».
2. Включите кэширование префикса
Если у всех запросов одинаковая инструкция, примеры и описание формата, поставьте их в начало промпта, а уникальные данные в конец. vLLM посчитает общую часть один раз. В таблице выше это сокращает классификацию с 10 до 2,6 часа.
3. Возьмите модель поменьше
Для классификации, извлечения сущностей и простой разметки модели 3–4B часто справляются почти как 8B, а работают в 2 раза быстрее. Проверьте на 500 размеченных примерах: если точность устраивает, вы сэкономите половину бюджета.
4. Используйте FP8 или 4 бита
На картах Ada, Hopper и Blackwell (RTX 4090, L40S, H100, RTX 5090) FP8 уменьшает веса вдвое и ускоряет обработку. Для пакетных задач потеря качества обычно незаметна.
5. Сортируйте запросы по длине
Запросы похожей длины лучше упаковываются в батч, и меньше вычислений уходит впустую. Отсортируйте входные данные перед подачей, это пять строк кода.
6. Делите данные между несколькими картами
Задача пакетной обработки идеально параллелится: разрежьте миллион запросов на 4 части и запустите 4 машины с RTX 4090. Суммарная стоимость почти та же, а результат будет через 9 часов вместо 36. Платите за часы, а не за машины, поэтому четыре карты по 9 часов стоят как одна на 36.
7. Не держите сервер без дела
Подготовьте данные, скрипт и модель заранее, проверьте на 100 запросах на дешёвой карте и только потом запускайте полный прогон. Сразу после окончания скачайте результаты и остановите сервер. Приёмы против простоя собраны в статье как не платить за простой GPU.
Какую карту выбрать
| Модель | Карта | Цена, ₽/час | Когда брать |
|---|---|---|---|
| 3–8B | RTX 3090 | 26 | Дёшево, без FP8; для небольших массивов |
| 3–8B | RTX 4090 | 48 | Оптимум: FP8, высокая скорость |
| 8–14B | RTX 5090 | 83 | Больше памяти под батч, быстрее память |
| 14–32B | L40S | 97 | 48 ГБ, FP8 |
| 32–70B | H100 | 339–417 | Большие модели с большим батчем |
Для пакетных задач важна не только скорость, но и память под KV-кэш: чем больше свободных гигабайт после весов, тем больше запросов в одном батче и тем выше суммарная скорость. Поэтому 8B на 24 ГБ работает лучше, чем 14B на тех же 24 ГБ, даже с поправкой на размер модели.
Для моделей 32–70B одна H100 часто выгоднее нескольких дешёвых карт: модель помещается целиком, и остаётся много памяти под батч. Для 8B выгоднее несколько RTX 4090 параллельно.
Как запустить пакетную обработку в vLLM
- Арендуйте машину на почасовой аренде GPU, установите vLLM:
pip install vllm. - Загрузите данные, например JSONL-файл с текстами.
- Запустите офлайн-обработку:
import json
from vllm import LLM, SamplingParams
INSTR = "Определи тему отзыва. Ответь одним словом из списка: доставка, качество, цена, сервис, другое.\n\nОтзыв: "
rows = [json.loads(l) for l in open("reviews.jsonl")]
rows.sort(key=lambda r: len(r["text"])) # похожая длина — плотнее батч
llm = LLM("Qwen/Qwen3-8B-FP8", max_model_len=4096, enable_prefix_caching=True)
params = SamplingParams(temperature=0, max_tokens=5)
batch = [[{"role": "user", "content": INSTR + r["text"]}] for r in rows]
outs = llm.chat(batch, params, chat_template_kwargs={"enable_thinking": False})
with open("labels.jsonl", "w") as f:
for r, o in zip(rows, outs):
f.write(json.dumps({"id": r["id"], "label": o.outputs[0].text.strip()}, ensure_ascii=False) + "\n")
- Скачайте
labels.jsonlи остановите сервер.
Общая инструкция стоит в начале каждого запроса, поэтому кэширование префикса считает её один раз. temperature=0 делает ответы воспроизводимыми. Подробнее о параметрах читайте на странице запуска vLLM.
Как получить свою скорость за 15 минут
Перед полным прогоном возьмите 1 000 случайных запросов и запустите тот же скрипт. vLLM выведет в лог скорость prefill и decode. Умножьте время на 1 000, получится бюджет на миллион. Если он не устраивает, меняйте модель, длину ответа или карту, пока потрачены копейки.
Для массивов больше суток
- Записывайте результат частями. Обрабатывайте по 50–100 тысяч запросов и сохраняйте каждую часть. Если что-то упадёт, вы потеряете час, а не сутки.
- Выгружайте результаты во внешнее хранилище. После остановки сервера диск удаляется, поэтому промежуточные файлы стоит копировать в S3-совместимое хранилище или к себе.
- Запускайте вручную через кабинет. Публичного API для автоматического запуска серверов у Терафермы пока нет, поэтому несколько машин для параллельной обработки поднимаются из кабинета.
Как проверить качество, не обрабатывая всё
Дешёвый прогон бесполезен, если модель ошибается в каждом пятом ответе. Перед полным запуском:
- Разметьте вручную 200–500 примеров, это эталон.
- Прогоните их через 2–3 кандидата: модель 4B, 8B и, например, 14B.
- Посчитайте долю совпадений с эталоном и время на 1 000 запросов для каждой.
- Выберите самую маленькую модель, точность которой вас устраивает.
На эту проверку уходит час-полтора аренды, а экономит она иногда половину бюджета: часто оказывается, что 4B справляется с задачей не хуже 8B. Если ни одна модель не дотягивает, улучшайте инструкцию и добавляйте в неё 3–5 примеров правильных ответов — с кэшем префикса они почти ничего не стоят.
Если обработанные данные потом нужны в онлайн-сервисе, например в боте, тот же vLLM можно запустить в режиме сервера с OpenAI-совместимым API, пример есть в статье про Telegram-бота на своей LLM.
Своя модель или пакетный API облака
У облачных API тоже есть пакетный режим. По данным на октябрь 2026 года OpenAI Batch API даёт скидку 50% к обычной цене при сроке выполнения до 24 часов. Сравнивать стоит по формуле: цена API = входные токены × тариф за вход + выходные × тариф за выход, а для своей модели — часы × цена часа.
Своя модель выигрывает, когда данных много, ответы короткие, задача решается моделью 8–14B, а данные нельзя отправлять внешнему сервису. API выигрывает, когда нужна самая сильная модель, а массив небольшой. Для пакетных задач на миллионы запросов разница часто в разы в пользу своей модели.
Пополнить баланс можно от 500 ₽ криптовалютой (USDT, BTC и другие монеты), оплата картой РФ и счёт для юрлиц в планах. Оплата поминутная, поэтому пробный прогон на 1 000 запросов стоит копейки.
Пакетная обработка LLM дешевле всего в офлайн-режиме vLLM: все запросы сразу, короткий ответ, общая инструкция в начале промпта и самая маленькая модель, которая справляется с задачей. Миллион классификаций моделью 8B на RTX 4090 занимает около 10 часов, с кэшем префикса 2–3 часа. Стоимость считается по токенам, а не по запросам, и сильнее всего зависит от длины ответа.
Замерьте скорость на 1 000 своих запросов на почасовой аренде GPU и посчитайте бюджет на весь массив по формуле.