English translation is not available yet. Showing Russian content.

Какую 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-tuneDistilBERT, BERT-base, RoBERTa-base60–110M10–80 мсОчень высокая (при размеченных данных)Низкая (CPU / малый GPU)
Small decoder-only LLM (оптимизированный инференс)TinyLlama-1.1B, Phi-3-mini-3.8B, Gemma-2B1–4B100–200 мс (с vLLM + 4‑bit)Высокая (возможен zero-shot)Средняя (требуется GPU, но малый)
Large LLM через API / локальноGPT-4, Claude-3 Opus, Llama-3-70B70B+>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-shotTinyLlama с 4‑бит квантованием или Groq API. Во всех остальных случаях — не берите большую LLM.

8. Инструменты и оптимизации для достижения <200 ms

ИнструментНазначениеПример влияния на латентность
Hugging Face Optimum / ONNX RuntimeЭкспорт модели в ONNX1.5–2× ускорение
TensorRTNVIDIA-specific оптимизация2–3× ускорение
vLLMОптимизированный инференс decoder-only5–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. Итоговая рекомендация

  1. Есть размеченные данные → DistilBERT (или RoBERTa-base) + fine-tuning + ONNX. Железо: CPU (если <500 зап./с) или малый GPU. Латентность <80 мс гарантирована.
  2. Нет размеченных данных, нужен zero-shot → TinyLlama-1.1B (4‑bit) + vLLM на GPU (A10/A100). Латентность ~150–200 мс.
  3. MVP / прототип с минимальной задержкойGroq API (Llama-3-8B). Латентность 30–80 мс.
  4. Никогда не используйте GPT-4 или аналогичные большие модели для этой задачи.

Пет-проект для закрепления

Задача разработать микросервис для классификации тональности отзывов (положительная / отрицательная / нейтральная) с требованием p99 latency <200 мс.

Инструменты Python, Hugging Face, distilbert-base-uncased, ONNX Runtime, FastAPI, Docker.

Шаги:

  1. Собрать или использовать готовый датасет (например, imdb для бинарной тональности, или twitter_airline_sentiment для 3 классов).
  2. Fine-tune DistilBERT (см. код выше).
  3. Экспортировать в ONNX: optimum-cli export onnx --model ./classifier distilbert-onnx/
  4. Написать FastAPI endpoint, загружающий ONNX-модель.
  5. Запустить локально, замерить latency (ab -n 1000 -c 10 http://localhost:8000/predict).
  6. Упаковать в Docker, развернуть на малом инстансе (CPU t2.medium или GPU T4).
  7. Измерить 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-tuning24(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. Индекс разборов