AI-инжиниринг
Local LLM: Ollama, llama.cpp, vLLM - запускаем модели на своём железе
Цели урока
- Понимать когда self-hosted LLM оправдан: privacy, cost breakeven, latency
- Настраивать Ollama и интегрировать с NestJS через OpenAI-compatible API
- Различать engines: Ollama (dev), llama.cpp (edge), vLLM (production)
- Понимать continuous batching - почему vLLM в 2-4x быстрее при concurrency
- Выбирать quantization (GGUF Q4_K_M vs AWQ vs GPTQ) под конкретное железо
`ollama run llama3` - одна команда, модель запущена локально. Никаких API ключей, никаких счётов, никакой отправки данных в облако. Для разработки и приватных данных - это меняет всё. Q4_K_M quantization помещает 70B параметров в один A100. vLLM с continuous batching выжимает из одной карты throughput, который раньше требовал кластера. Apple MLX запускает Llama 8B на MacBook Pro со скоростью 60 tok/s. Self-hosted LLM - это уже не хобби, это production в Cloudflare, Discord, Apple.
- Cloudflare Workers AI: Llama 3 на edge серверах в 300+ локациях, latency <50ms глобально
- Discord: self-hosted модели для content moderation на 100M+ сообщений в день - без отправки данных OpenAI
- Apple Intelligence: on-device LLM 3B параметров прямо на iPhone - полная privacy, нет облака
- Ollama: 5M+ скачиваний, стал стандартом для local LLM разработки за 2 года
- vLLM из UC Berkeley: throughput 2-4x против Ollama при concurrent нагрузке, production в десятках компаний
Вечер, который принёс LLM на ноутбук
В **начале 2023** утекли веса LLaMA от Meta, и мощная модель внезапно оказалась на руках у всех - но чтобы запустить её, нужны были PyTorch, CUDA и стойки с несколькими GPU. В **марте 2023** Georgi Gerganov выпустил **llama.cpp** - реализацию на чистом C/C++ без зависимостей; заявленной целью было запустить модель с 4-битной квантизацией на MacBook. Получилось, и движение локального инференса набрало обороты. Позже проект ввёл однофайловый формат моделей **GGUF** (август 2023), чтобы упаковывать веса для удобного распространения. Поверх этого движка **Ollama** (2023) завернула всё в один бинарник с реестром моделей и OpenAI-совместимым API, так что разработчик мог дойти от нуля до работающей модели одной командой `ollama run`. Серьёзным LLM больше не нужен был дата-центр.
Предварительные знания
Зачем запускать LLM локально: privacy, cost, latency
OpenAI отправляет каждый токен на свои серверы. Anthropic - тоже. Google - тоже. Для большинства задач это нормально. Но есть сценарии, где ни один байт данных не должен покидать инфраструктуру: медицинские записи (HIPAA), финансовые транзакции (PCI DSS), исходный код патентованных алгоритмов, государственные системы. Для таких случаев self-hosted LLM - не опция. Это требование.
- **Healthcare (HIPAA)** - медицинские данные нельзя отправлять без BAA
- **Finance (PCI DSS)** - данные карт требуют строгого контроля
- **Government / Defense** - классифицированная информация не покидает периметр
- **EU (GDPR / AI Act)** - data residency, transparency
- **Корпоративная IP** - исходный код, патенты, внутренние документы
Второй мотив - экономика. GPT-4o при серьёзной нагрузке стоит не копейки:
И третий - latency. OpenAI живёт на другом континенте. Собственный сервер в той же сети даёт TTFT 20-50ms против 200-800ms у облака. Для стриминговых интерфейсов разница ощущается физически.
| Setup | TTFT | Throughput | Notes |
|---|---|---|---|
| GPT-4o API | 200-800ms | 50-80 tok/s | Зависит от нагрузки OpenAI |
| GPT-4o-mini API | 100-400ms | 80-120 tok/s | Тоже варьируется |
| Self-hosted 8B (A100) | 20-50ms | 100-150 tok/s | Стабильно |
| Self-hosted 8B (RTX 4090) | 30-80ms | 60-100 tok/s | Consumer GPU |
| Self-hosted 8B (M3 Pro) | 50-100ms | 40-60 tok/s | Dev, тесты |
| Self-hosted 70B (2xA100) | 50-100ms | 30-50 tok/s | Production |
**Self-hosted не бесплатно.** GPU серверы USD 1-10/час + DevOps. Для маленького проекта (<10K req/day) cloud API почти всегда дешевле.
Локальная модель - значит медленная
На современном железе 7B модель даёт 30-50 tok/s на CPU и 80-120 tok/s на RTX 4090. Это быстрее, чем GPT-4o через интернет
Скорость определяется не тем, локальная модель или нет, а пропускной способностью памяти (memory bandwidth). A100 - 2 TB/s. RTX 4090 - 1 TB/s. Даже на Apple M3 Pro unified memory даёт 150-200 GB/s. Сетевой roundtrip к OpenAI добавляет 100-500ms задержку независимо от того, как быстро они генерируют.
Стартап: 5,000 запросов/день через GPT-4o-mini. Месячный счёт ~50. Стоит ли переходить на self-hosted?
Ollama: setup, API и интеграция с Node.js
`ollama run llama3` - одна команда, модель запущена локально. Никаких API ключей, никаких счётов, никакой отправки данных в облако. **Ollama** берёт на себя скачивание GGUF-весов, управление GPU-памятью, hot-reload между моделями и поднимает OpenAI-совместимый HTTP сервер на порту 11434. Для разработки и приватных данных - это меняет всё.
Ключевая деталь: Ollama поднимает OpenAI-совместимый API. Это значит - нулевые изменения в коде. Меняется только `baseURL`:
**NestJS integration** с health check и fallback:
**Apple Silicon:** Ollama использует Metal API. M3 Pro: ~50-70 tok/s для 8B. Unified memory (32-128 GB) позволяет загружать даже 70B модели. Apple MLX - альтернативный фреймворк от Apple, даёт ещё 20-30% прироста скорости на M-чипах.
Docker-compose: Ollama + NestJS. При запуске Ollama ещё не загрузил модель. Что с первыми запросами?
llama.cpp: inference на CPU и edge devices
Ollama - это обёртка. Внутри у неё **llama.cpp** - C/C++ движок, который написал Георги Герганов в 2023 году за выходные. Цель была простая: запустить LLaMA на MacBook без GPU. Получился проект с 60K+ звёздами на GitHub и ядром для половины local LLM экосистемы.
Ключевая особенность llama.cpp: работает **на CPU без GPU**, поддерживает ARM (Raspberry Pi, Android), Apple Metal, Vulkan. Там, где нет NVIDIA - llama.cpp единственный вариант.
- **Edge deployment** - Raspberry Pi, embedded, mobile
- **Максимальный контроль** - batch sizes, threads, KV-cache
- **C/C++ интеграция** - direct calls без HTTP overhead
- **Custom builds** - SIMD оптимизации для конкретного CPU
| Устройство | RAM | Prompt (tok/s) | Generation (tok/s) | Пригодность |
|---|---|---|---|---|
| Raspberry Pi 5 (8GB) | 8 GB | 2-3 | 3-5 | IoT demo |
| Intel i7-12700 | 32 GB | 25-35 | 15-20 | Development |
| Apple M3 Pro | 36 GB | 80-120 | 50-70 | Dev + small prod |
| RTX 4090 | 24 GB | 200-300 | 80-120 | Production, single user |
| A100 80GB | 80 GB | 300-500 | 100-150 | Production, multi-user |
**GGUF формат** - бинарный формат для квантизированных моделей, разработанный для llama.cpp. Содержит метаданные и веса в одном файле. LM Studio, Ollama, Jan - все используют GGUF под капотом. Hugging Face хранит тысячи готовых GGUF-файлов.
Нужен LLM на Raspberry Pi 5 (8GB) для IoT. Какой инструмент и модель?
vLLM: production serving с continuous batching
Ollama обслуживает запросы один за другим. Пришли 50 одновременных запросов - Ollama выстроит их в очередь, GPU будет простаивать, пока один запрос не завершится перед следующим. **vLLM** решает это иначе.
Ключевые инновации vLLM: **PagedAttention** (KV-cache управляется как страницы виртуальной памяти, без фрагментации) и **continuous batching** - динамическое добавление новых запросов в середину уже идущего батча:
| Feature | Ollama | llama.cpp | vLLM | TGI |
|---|---|---|---|---|
| Setup | Минимальная | Средняя | Средняя | Средняя |
| GPU required | Нет | Нет | NVIDIA GPU | NVIDIA GPU |
| Continuous batching | Нет | Нет | Да | Да |
| Throughput (multi-user) | Низкий | Низкий | Высокий (2-4x) | Высокий |
| Quantization | GGUF | GGUF | AWQ, GPTQ, FP8 | AWQ, GPTQ |
| Best for | Dev | Edge/IoT | Production | Production |
Сервис: 50 concurrent запросов к Llama 8B. Ollama: avg latency 800ms. Что при переключении на vLLM?
Quantization: GGUF, AWQ, GPTQ - сжатие моделей
Llama 8B в float16 весит 16 GB. Llama 70B - 140 GB. RTX 4090 имеет 24 GB VRAM. Нехитрая математика: большинство интересных моделей физически не помещаются в потребительский GPU. **Quantization** - это инженерный ответ на это ограничение.
Идея проста: вместо 16 бит на вес хранить 4 или 8. Теряется точность, но нейросети к этому удивительно устойчивы - правильная квантизация даёт потерю качества в 1-3% при экономии 75% памяти:
| Формат | Engine | Метод | Когда использовать |
|---|---|---|---|
| GGUF | llama.cpp, Ollama | Post-training, CPU-friendly | CPU, macOS, edge, Ollama |
| GPTQ | vLLM, TGI, HuggingFace | Post-training, GPU | NVIDIA GPU production |
| AWQ | vLLM, TGI | Activation-aware, GPU | NVIDIA GPU (чуть лучше GPTQ) |
| FP8 | vLLM, TensorRT-LLM | 8-bit float | Modern GPUs (H100, Ada) |
| BitsAndBytes | HuggingFace | On-the-fly | QLoRA fine-tuning |
Внутри GGUF - градации. Q4_K_M означает: 4-bit квантизация, K-quant метод (лучше сохраняет важные веса), M-размер (Medium - баланс между качеством и размером). Это золотой стандарт практически для всех задач:
| Модель | FP16 | Q8 (GGUF) | Q4_K_M (GGUF) | AWQ 4-bit | Min GPU |
|---|---|---|---|---|---|
| Phi-3 3.8B | 7.6 GB | 4.0 GB | 2.3 GB | 2.5 GB | RTX 3060 12GB |
| Llama 8B | 16 GB | 8.5 GB | 4.7 GB | 5.0 GB | RTX 4060 Ti 16GB |
| Llama 70B | 140 GB | 74 GB | 40 GB | 38 GB | 2x A100 80GB |
| Mixtral 8x7B | 94 GB | 50 GB | 27 GB | 25 GB | A100 80GB |
| Llama 405B | 810 GB | 428 GB | 237 GB | 220 GB | 8x A100 80GB |
**Quantization не делает модель умнее.** Если модель не справляется в FP16 - квантизированная не справится тем более. Quantization - про deployment (меньше VRAM, быстрее), не про качество.
Локальная модель - значит медленная
На современном железе 7B модель выдаёт 30-50 tok/s на CPU и 80-120 tok/s на RTX 4090. Это быстрее, чем GPT-4o через интернет
Скорость определяется memory bandwidth, а не 'локальностью'. A100 - 2 TB/s. RTX 4090 - 1 TB/s. Даже Apple M3 Pro - 150-200 GB/s. Сетевой roundtrip к OpenAI добавляет 100-500ms вне зависимости от скорости их серверов. Для TTFT - своя инфраструктура выигрывает почти всегда.
Итоги
- Self-hosted оправдан при: compliance (HIPAA/GDPR), >30-50K req/day, требование <100ms TTFT
- Ollama: `ollama run llama3` - 2 минуты от нуля до работающего LLM с OpenAI-совместимым API
- llama.cpp: C++ core под Ollama, единственный вариант для CPU/ARM/edge без NVIDIA
- vLLM: continuous batching + PagedAttention = 2-4x throughput при concurrent нагрузке vs Ollama
- Q4_K_M - золотой стандарт: 75% экономия памяти, ~3% потеря качества, 7B модель = ~4-5 GB VRAM
- Apple MLX - для M-чипов даёт +20-30% к скорости Ollama на том же железе
Что дальше
Запуск модели - первый шаг. Production требует serving infrastructure.
- Model Serving — TGI, vLLM в Docker, autoscaling GPU, мониторинг
- Fine-tuning — Fine-tuned модель деплоится через Ollama/vLLM
- Distillation — Distilled модель → GGUF → Ollama
Связанные уроки
- aie-03-llm-fundamentals — Локальный запуск требует знания внутренностей модели
- aie-37-open-source-models — Локальный inference требует открытых весов
- aie-40-model-serving — Локальные модели масштабируются через serving-инфраструктуру
- aie-38-distillation — Дистиллированные модели влезают в потребительское железо
- ml-46-model-serving — Та же инженерия self-hosted inference
- sd-03-scalability