Какую LLM вы выберете для "быстрых" (<200ms) простых задач классификации?
Краткий тезис
Для простой классификации с жёстким требованием задержки менее 200 миллисекунд оптимальным выбором являются компактные fine-tuned encoder-only модели (например, DistilBERT, RoBERTa-base). Они обеспечивают латентность 50–100 мс даже на CPU и дают высокое качество после дообучения под конкретные классы. Если необходимо работать в zero-shot режиме или классы сложнее, можно использовать малые decoder-only LLM (TinyLlama, Phi-3-mini) с оптимизированным инференсом (vLLM, квантование), но их латентность часто достигает 200 мс. Большие модели (GPT‑4, Claude‑3) избыточны, дороги и не укладываются в тайминг. Главный принцип: «Для простой классификации — BERT, не надо LLM».
1. Разбор требования: что значит «быстрая классификация» и какие задачи подходят
Требование <200 ms означает полное время от получения запроса до выдачи результата. Для классификации это включает: токенизацию, инференс модели и постобработку. Такие ограничения типичны для online-сервисов (модерация контента, маршрутизация запросов, базовая тональность). «Простая задача» подразумевает небольшое количество хорошо разделимых классов (2–10), часто бинарную классификацию. Для таких задач не нужна глубокая семантика — достаточно поверхностных признаков, которые хорошо улавливают fine-tuned энкодеры.
Почему не любая LLM Большие авторегрессивные модели (7B+ параметров) даже с оптимизациями редко дают задержку ниже 200 мс на одном запросе без batching или специального аппаратного ускорения. Кроме того, их стоимость инференса и потребление памяти выше.
2. Три основных подхода к выбору модели
| Подход | Примеры | Размер (параметры) | Типичная латентность | Точность (на простых задачах) | Стоимость инференса |
|---|---|---|---|---|---|
| Encoder-only + fine-tune | DistilBERT, BERT-base, RoBERTa-base | 60–110M | 10–80 мс | Очень высокая (при размеченных данных) | Низкая (CPU / малый GPU) |
| Small decoder-only LLM (оптимизированный инференс) | TinyLlama-1.1B, Phi-3-mini-3.8B, Gemma-2B | 1–4B | 100–200 мс (с vLLM + 4‑bit) | Высокая (возможен zero-shot) | Средняя (требуется GPU, но малый) |
| Large LLM через API / локально | GPT-4, Claude-3 Opus, Llama-3-70B | 70B+ | >500 мс (часто >1 с) | Максимальная | Высокая / очень высокая |
Вывод для тайминга <200 ms подходят только первые два подхода. Третий — избыточен.
3. Encoder-only модели — золотой стандарт для быстрой классификации
Encoder-only архитектура (BERT, RoBERTa) обрабатывает весь вход за один проход, в отличие от decoder-only авторегрессивных моделей, которые генерируют токены последовательно. Это даёт принципиальное преимущество в скорости.
Fine-tuning — дообучение предобученной модели на размеченном датасете. Для классификации к выходу энкодера добавляется линейный слой ([CLS] токен → logits). Пример на Hugging Face Transformers:
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
model_name = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3) # 3 класса
# Подготовка датасета (train_dataset, eval_dataset)
training_args = TrainingArguments(
output_dir="./classifier",
per_device_train_batch_size=32,
per_device_eval_batch_size=64,
num_train_epochs=3,
eval_strategy="epoch",
save_strategy="epoch",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
После fine-tuning модель можно экспортировать в ONNX или TensorRT для снижения латентности ещё в 2–3 раза. DistilBERT на CPU даёт ~30–50 мс на инференс при длине текста до 512 токенов.
Когда не хватает Если классы очень похожи или требуется понимание контекста за пределами 512 токенов, энкодер может уступать по качеству decoder-only моделям.
4. Small decoder-only LLM как компромисс
Модели вроде TinyLlama (1.1B) или Phi-3-mini (3.8B) способны работать в zero-shot режиме: для классификации достаточно написать промпт вида «Классифицируй текст: ...». Но наивный инференс через Transformers будет медленным (1–2 секунды). Для достижения <200 мс применяют:
- vLLM — эффективный менеджмент памяти (PagedAttention), непрерывное пакетирование, динамическое батчирование.
- Квантование — снижение точности весов до 4‑бит или 8‑бит. Hugging Face
bitsandbytes:model = AutoModelForCausalLM.from_pretrained("TinyLlama/TinyLlama-1.1B-Chat-v1.0", load_in_4bit=True, device_map="auto") - Flash Attention 2 — оптимизация механизма внимания.
После таких оптимизаций TinyLlama на A10G показывает ~150–200 мс на запрос. Однако на CPU или старом GPU эти цифры недостижимы.
Сравнение BERT vs TinyLlama для классификации тональности:
| Характеристика | DistilBERT (fine-tuned) | TinyLlama (zero-shot + vLLM) |
|---|---|---|
| Латентность | 30–60 мс | 150–200 мс |
| Точность (SST-2) | 93–95% | 88–92% (зависит от промпта) |
| Необходимость разметки | Да | Нет |
| Сложность развёртывания | Низкая | Средняя (нужен GPU) |
5. API-провайдеры с низкой задержкой
Groq предоставляет инференс Llama-3-8B с латентностью 20–50 мс благодаря собственному аппаратному ускорителю (LPU). Это укладывается в <200 мс, но:
- Сетевая задержка может добавить 10–30 мс;
- Стоимость для больших объёмов (~$0.10 за 1M токенов) выше, чем self-hosted BERT;
- Зависимость от внешнего сервиса (безопасность, доступность).
Подходит для прототипов или если нет возможности развернуть свою модель. Для production с десятками тысяч запросов в секунду — неэффективно.
6. Чего стоит избегать
Не используйте для простой быстрой классификации:
- GPT-4 / Claude-3 Opus — задержка 1–3 с, стоимость ~$30 за 1M токенов, избыточная мощность.
- Большие открытые LLM (Llama-3-70B, Mixtral-8x7B) — даже через vLLM требуют 2–4 GPU и дают >300 мс.
- Модель, не оптимизированную под latency — например, BERT-large (340M) уже может не укладываться в 200 мс на CPU.
7. Компромисс скорость / качество / стоимость
Выбор модели сводится к трём осям:
- Скорость — критична (200 ms).
- Качество — должно быть приемлемым (accuracy > 90% для простых задач).
- Стоимость — стоимость инференса и затраты на разработку (разметка данных для fine-tuning).
Для большинства простых задач fine-tuned DistilBERT даёт наилучший треугольник: высокая скорость, низкая стоимость, хорошее качество при наличии размеченных данных. Если данных нет и нужен zero-shot — TinyLlama с 4‑бит квантованием или Groq API. Во всех остальных случаях — не берите большую LLM.
8. Инструменты и оптимизации для достижения <200 ms
| Инструмент | Назначение | Пример влияния на латентность |
|---|---|---|
| Hugging Face Optimum / ONNX Runtime | Экспорт модели в ONNX | 1.5–2× ускорение |
| TensorRT | NVIDIA-specific оптимизация | 2–3× ускорение |
| vLLM | Оптимизированный инференс decoder-only | 5–10× против Hugging Face |
| bitsandbytes 4‑bit | Квантование | Уменьшение размера модели в 4×, ускорение на GPU |
| Flash Attention 2 | Оптимизация внимания | 2–3× для больших последовательностей |
| Batching (пакетирование) | Объединение запросов | Повышает пропускную способность, но увеличивает задержку первого запроса |
Пример pipeline для BERT на ONNX:
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer
model = ORTModelForSequenceClassification.from_pretrained("distilbert-base-uncased-onnx")
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
inputs = tokenizer("текст для классификации", return_tensors="pt")
outputs = model(**inputs)
pred = outputs.logits.argmax().item()
9. Итоговая рекомендация
- Есть размеченные данные → DistilBERT (или RoBERTa-base) + fine-tuning + ONNX. Железо: CPU (если <500 зап./с) или малый GPU. Латентность <80 мс гарантирована.
- Нет размеченных данных, нужен zero-shot → TinyLlama-1.1B (4‑bit) + vLLM на GPU (A10/A100). Латентность ~150–200 мс.
- MVP / прототип с минимальной задержкой → Groq API (Llama-3-8B). Латентность 30–80 мс.
- Никогда не используйте GPT-4 или аналогичные большие модели для этой задачи.
Пет-проект для закрепления
Задача разработать микросервис для классификации тональности отзывов (положительная / отрицательная / нейтральная) с требованием p99 latency <200 мс.
Инструменты Python, Hugging Face, distilbert-base-uncased, ONNX Runtime, FastAPI, Docker.
Шаги:
- Собрать или использовать готовый датасет (например,
imdbдля бинарной тональности, илиtwitter_airline_sentimentдля 3 классов). - Fine-tune DistilBERT (см. код выше).
- Экспортировать в ONNX:
optimum-cli export onnx --model ./classifier distilbert-onnx/ - Написать FastAPI endpoint, загружающий ONNX-модель.
- Запустить локально, замерить latency (ab -n 1000 -c 10 http://localhost:8000/predict).
- Упаковать в Docker, развернуть на малом инстансе (CPU t2.medium или GPU T4).
- Измерить p99 latency — должно быть <100 мс.
Ожидаемый результат API с latency ~50 мс, accuracy >90%, готовый к продакшену (с health check, мониторингом).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| [Вопрос [7(7_Как_уменьшить_latency_RAG.md) | Оптимизация задержки в RAG-системах (аналогичные приёмы) |
| Вопрос 22. Какие методы fine-tuning вы знаете и какой используете чаще всего | 22(22_Fine_tuning_LLM.md) |
| Вопрос 24. Какой размер датасета нужен для fine-tuning | 24(24_Small_vs_Large_models.md) |
| Вопрос 30. Как вы проверяете, что fine-tuned модель не сломала базовые способности | 30(30_API_vs_self_hosted.md) |
| Вопрос 45. Как вы тестируете агентов (сложно из-за стохастичности) | 45(45_Zeroshot_classification.md) |
Навигация
- Предыдущий: 96. Как вы предотвращаете галлюцинации в production RAG системе|96](/answers/7)
- Следующий: 98
- Индекс: 00. Индекс разборов