Урок 0009 · Local models vs paid APIs

Когда выбирать локальную модель, когда платный API, подводные камни каждого пути, как разворачивать (vLLM/llama.cpp/Ollama) и как строить сервис с моделью: очередь, параллелизация.

Цель урока На доске за 5 минут: таблица «local vs API» под банк, стек разворачивания (vLLM + GGUF/Ollama), схема сервиса с очередью и параллельными воркерами.

1. Local vs API: таблица решений

КритерийPaid API (OpenAI/Anthropic)Local model
Данные / резидентностьДанные уходят провайдеру (no-train контракт, регион)Данные в твоём контуре — главный козырь для банка
Стоимость на объёмеДёшево на старте, линейно растёт с токенамиДорого на старте (GPU), почти 0 за инференс потом
Качество моделиФронтир (лучшие модели рынка)Открытые модели: Llama, Qwen, Mistral — шаг позади фронтира
ЛатентностьСетевая: +50–200 мс RTTБез сети, но GPU-очередь может съесть выигрыш
Контроль / кастомизацияТолько промпт; fine-tune ограниченFine-tune, квантизация, свой стек — полный контроль
МасштабированиеПровайдер масштабирует самТы: GPU, vLLM, автоскейлинг
ОтказоустойчивостьРиск rate limit / провайдер 500 / ценаТвой SRE, твои GPU, твой обслуживание

Когда точно API

Когда точно local

Гибрид — то, что любят спрашивать

Прод-паттерн: роутер модель → дешёвая локальная на простые запросы, API на сложные. Пример каре: FAQ и статус карты — локальная 7B; сложный отказ с юридическими нюансами — API.

Судья — всегда сильная модель (часто API), прод — дешёвая. Это из урока 0006.

2. Подводные камни local

3. Подводные камни API

4. Как разворачивать локальную модель

Три стека, от продакшна к прототипу:

Стек A. vLLM — продакшн, высокий throughput

OpenAI-совместимый сервер, PagedAttention (блочный KV cache), continuous batching (смешивает prefill и decode), tensor parallelism для 30B–70B на нескольких GPU, prefix caching для повторяющихся промптов, Prometheus-метрики на /metrics.[96]

# 7B–13B на одной GPU
vllm serve meta-llama/Llama-3-8B-Instruct \
  --gpu-memory-utilization 0.9 \
  --max-model-len 8192 \
  --enable-prefix-caching

# 70B на 4 GPU с квантизацией AWQ
vllm serve TheBloke/Llama-2-70B-AWQ \
  --tensor-parallel-size 4 \
  --quantization awq \
  --gpu-memory-utilization 0.95

# клиент — обычный OpenAI SDK, только base_url другой
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

Ключевые метрики vLLM: time_to_first_token (TTFT), num_requests_running, gpu_cache_usage_perc.[96]

Стек B. llama.cpp / GGUF — CPU, Apple Silicon, edge

GGUF-формат с квантизацией (Q4_K_M — чат, Q5_K_M/Q6_K — код). Работает на CPU, Metal (Apple), CUDA. Для прототипов и edge; на продакшн-GPU уступает vLLM по throughput.[97][98]

# из Hugging Face Hub, OpenAI-совместимый сервер
llama-server -hf bartowski/Llama-3.2-3B-Instruct-GGUF:Q4_K_M

# выбор квантизации: Q4_K_M чат, Q5_K_M/Q6_K код, Q3/IQ — только если память совсем впритык

Поиск GGUF и выбор квантизации — через Hugging Face: модели с llama.cpp, local-app страницы.[99]

Стек C. Ollama — прототип и локальная разработка

Простой запуск открытых моделей локально или в их cloud, OpenAI-совместимый API, интеграции с редакторами. Не для тяжёлого продакшна (меньше контроля над батчингом и кэшем), но идеален для dev-окружения.[95]

Что выбрать (фраза на собеседовании)

«Для продакшн-инференса открытых моделей — vLLM: continuous batching и PagedAttention дают на порядок выше throughput, чем наивный transformers. Для прототипа и edge — llama.cpp/GGUF. Ollama — для dev. TGI был стандартом, но теперь в maintenance mode — его авторы сами направляют на vLLM/SGLang. Формат везде OpenAI-совместимый — переключение local/API меняет только base_url».

Факт про TGI (важно, свежий): Hugging Face перевела TGI в maintenance mode и рекомендует vLLM, SGLang, llama.cpp, MLX.[94]

5. Сервис с моделью: очередь и параллелизация

Схема, которую рисуешь на доске:

Клиент → API-слой (FastAPI) → Очередь → Воркеры (N) → LLM (vLLM) → ответ

Зачем очередь, если vLLM уже батчит

Параллелизация: сколько воркеров

Backpressure и таймауты

6. Как разворачивать очередь тулов

Тулы — это тоже сервисы, и у них своя «очередь» вопросов: параллельность, идемпотентность, таймауты.

Отдельный сервис на тул, не всё в одном процессе

Тул = внутренний API (в банке так и есть): cards/block, payments/transfer. Агент зовёт их через адаптер, тулы не разделяют процесс с LLM-сервером. Так можно: масштабировать тул независимо (блокировки карт — отдельно от FAQ), ставить свои таймауты и rate limits, переиспользовать между агентами.

Очередь для долгих тулов

Тул, который работает секунды/минуты (OCR пачки, генерация отчёта), — не синхронный вызов из агентного цикла. Паттерн: агент кладёт задачу в очередь → получает job_id → опрашивает статус → забирает результат. Идемпотентность обязательна: retry воркера не должен выполнить действие дважды (idempotency_key).

Параллелизация тулов

HITL в очереди тулов

Деньги и PII: агент кладёт задачу, статус awaiting_approval, очередь ждёт решения человека (отдельный приоритетный канал), потом выполняет или отменяет. Это связывает урок 0007 (HITL) с очередью.

Проверь себя

Банк не может выносить данные — путь?

Высокий throughput в vLLM даёт?

Action-тулы параллелить вслепую?

Видео и статьи по теме

Видео

Статьи и доки

Первоисточник урока vLLM docs (продакшн-сервер) + GGUF/llama.cpp guide (квантизация и выбор модели).

Sources: