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 больше не нужен был дата-центр.

Предварительные знания

  • How LLMs Work: Tokens, Embeddings, Attention

Зачем запускать 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 у облака. Для стриминговых интерфейсов разница ощущается физически.

SetupTTFTThroughputNotes
GPT-4o API200-800ms50-80 tok/sЗависит от нагрузки OpenAI
GPT-4o-mini API100-400ms80-120 tok/sТоже варьируется
Self-hosted 8B (A100)20-50ms100-150 tok/sСтабильно
Self-hosted 8B (RTX 4090)30-80ms60-100 tok/sConsumer GPU
Self-hosted 8B (M3 Pro)50-100ms40-60 tok/sDev, тесты
Self-hosted 70B (2xA100)50-100ms30-50 tok/sProduction

**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
УстройствоRAMPrompt (tok/s)Generation (tok/s)Пригодность
Raspberry Pi 5 (8GB)8 GB2-33-5IoT demo
Intel i7-1270032 GB25-3515-20Development
Apple M3 Pro36 GB80-12050-70Dev + small prod
RTX 409024 GB200-30080-120Production, single user
A100 80GB80 GB300-500100-150Production, 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** - динамическое добавление новых запросов в середину уже идущего батча:

FeatureOllamallama.cppvLLMTGI
SetupМинимальнаяСредняяСредняяСредняя
GPU requiredНетНетNVIDIA GPUNVIDIA GPU
Continuous batchingНетНетДаДа
Throughput (multi-user)НизкийНизкийВысокий (2-4x)Высокий
QuantizationGGUFGGUFAWQ, GPTQ, FP8AWQ, GPTQ
Best forDevEdge/IoTProductionProduction

Сервис: 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МетодКогда использовать
GGUFllama.cpp, OllamaPost-training, CPU-friendlyCPU, macOS, edge, Ollama
GPTQvLLM, TGI, HuggingFacePost-training, GPUNVIDIA GPU production
AWQvLLM, TGIActivation-aware, GPUNVIDIA GPU (чуть лучше GPTQ)
FP8vLLM, TensorRT-LLM8-bit floatModern GPUs (H100, Ada)
BitsAndBytesHuggingFaceOn-the-flyQLoRA fine-tuning

Внутри GGUF - градации. Q4_K_M означает: 4-bit квантизация, K-quant метод (лучше сохраняет важные веса), M-размер (Medium - баланс между качеством и размером). Это золотой стандарт практически для всех задач:

МодельFP16Q8 (GGUF)Q4_K_M (GGUF)AWQ 4-bitMin GPU
Phi-3 3.8B7.6 GB4.0 GB2.3 GB2.5 GBRTX 3060 12GB
Llama 8B16 GB8.5 GB4.7 GB5.0 GBRTX 4060 Ti 16GB
Llama 70B140 GB74 GB40 GB38 GB2x A100 80GB
Mixtral 8x7B94 GB50 GB27 GB25 GBA100 80GB
Llama 405B810 GB428 GB237 GB220 GB8x 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
Local LLM: Ollama, llama.cpp, vLLM - запускаем модели на своём железе

0

1

Войти

Open-source модели локально = без цензуры, делают что угодно

Большинство популярных open-source моделей (Llama, Mistral, Qwen) обучены с RLHF и instruction tuning - они тоже отказывают в ответах на нежелательные запросы

Llama 3 прошёл через тот же RLHF-процесс, что и GPT. Meta специально выровняла модель. Необученные base-модели (без -instruct суффикса) менее ограничены, но они не предназначены для диалога - это сырые языковые модели для продолжения текста. Снять alignment с instruction-tuned модели технически возможно через fine-tuning, но это уже другая история.

Llama 70B на одной A100 80GB. В FP16 = 140 GB. Какой вариант позволит запустить?