Ollama: локальные LLM без боли
Когда я впервые попробовал ChatGPT, мысль была одна: «Круто, но я не хочу отправлять свой код на чужие серверы». Потом появился вопрос стоимости — API-ключи не бесконечные. А ещё бывают ситуации, когда интернета просто нет. Всё это привело меня к Ollama — инструменту, который превращает запуск локальных LLM из квеста с компиляцией C++ в одну команду в терминале.
Зачем вообще локальные LLM
Причин несколько, и каждая сама по себе достаточно весомая:
Приватность. Код вашего проекта, внутренняя документация, конфиги с секретами — всё это остаётся на вашей машине. Никаких data processing agreements, никаких «мы не используем ваши данные для обучения (но может быть)».
Стоимость. API-вызовы к GPT-4 или Claude набегают в ощутимую сумму, если пользоваться активно. Локальная модель — это одноразовая инвестиция в железо, а дальше бесплатно.
Офлайн-доступ. В самолёте, на даче, в бункере — модель работает без интернета.
Эксперименты. Хотите попробовать 10 разных моделей, поменять system prompt, покрутить temperature? Без лимитов и rate limits.
Установка
Ollama доступна для macOS, Linux и Windows. На Linux — одна команда:
curl -fsSL https://ollama.ai/install.sh | sh На macOS проще всего через Homebrew:
brew install ollama После установки Ollama работает как сервис и поднимает REST API на порту 11434. Проверяем:
ollama --version
curl http://localhost:11434/api/tags Загрузка моделей
Ollama использует концепцию, знакомую всем, кто работал с Docker — pull модели из реестра:
ollama pull llama3.2
ollama pull mistral
ollama pull qwen2.5
ollama pull phi3 Запуск интерактивного чата:
ollama run llama3.2 Посмотреть все загруженные модели:
ollama list GPU и квантизация: что нужно знать
Вот здесь начинается самое интересное. Полноразмерная Llama 3 70B в fp16 займёт ~140 ГБ видеопамяти. Очевидно, это не влезет в вашу RTX 3060. Поэтому существует квантизация — уменьшение точности весов модели.
Основные форматы, которые вы встретите:
- Q4_K_M — 4-битная квантизация, средний вариант. Хороший баланс качества и размера. Llama 3 8B в Q4_K_M занимает ~4.9 ГБ. Для большинства задач этого достаточно.
- Q5_K_M — 5-битная, чуть лучше качество, чуть больше размер. Разница с Q4 заметна на сложных задачах рассуждения.
- Q8_0 — 8-битная, почти без потери качества, но занимает вдвое больше места, чем Q4. Llama 3 8B в Q8 — около 8.5 ГБ.
Правило простое: если модель влезает в VRAM в Q8 — берите Q8. Не влезает — берите Q4_K_M. Промежуточный Q5_K_M — для тех, кто хочет выжать максимум из доступной памяти.
# Скачать конкретную квантизацию
ollama pull llama3.2:8b-instruct-q5_K_M Кастомизация через Modelfile
Modelfile — это как Dockerfile, но для LLM. Позволяет настроить модель под конкретную задачу:
FROM llama3.2
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
PARAMETER top_p 0.9
SYSTEM """
Ты — опытный DevOps-инженер. Отвечай кратко и по делу.
Всегда приводи примеры команд. Если не уверен — так и скажи.
Формат ответа: сначала краткий ответ, потом детали.
""" Создаём кастомную модель:
ollama create devops-helper -f Modelfile
ollama run devops-helper Ключевые параметры:
temperature— креативность (0.0-1.0). Для кода ставлю 0.1-0.3, для текстов 0.7-0.8.num_ctx— размер контекстного окна. По умолчанию 2048, но для анализа кода лучше 8192 или 16384.top_p— nucleus sampling. Обычно оставляю 0.9.
REST API
Ollama поднимает полноценный HTTP API, совместимый с форматом OpenAI. Это означает, что большинство инструментов, написанных для OpenAI API, работают с Ollama из коробки.
# Генерация ответа
curl http://localhost:11434/api/generate -d '{
"model": "llama3.2",
"prompt": "Объясни разницу между CMD и ENTRYPOINT в Dockerfile",
"stream": false
}'
# Chat-формат (с историей сообщений)
curl http://localhost:11434/api/chat -d '{
"model": "llama3.2",
"messages": [
{"role": "system", "content": "Отвечай как senior DevOps engineer"},
{"role": "user", "content": "Как настроить health check в docker-compose?"}
],
"stream": false
}' Интеграция с Python
import requests
import json
def ask_ollama(prompt: str, model: str = "llama3.2") -> str:
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.3,
"num_ctx": 4096
}
}
)
return response.json()["response"]
# Использование
result = ask_ollama("Напиши Ansible task для установки nginx")
print(result) Или через официальную библиотеку:
import ollama
response = ollama.chat(
model="llama3.2",
messages=[
{"role": "user", "content": "Напиши systemd unit для Python-приложения"}
]
)
print(response["message"]["content"]) Бенчмарки на разном железе
Я протестировал генерацию токенов на нескольких конфигурациях с Llama 3 8B Q4_K_M:
| Конфигурация | Tokens/sec | Ощущения |
|---|---|---|
| RTX 3060 12GB | ~45 t/s | Быстро, комфортно для работы |
| Apple M1 16GB | ~25 t/s | Хорошо, нативная поддержка Metal |
| CPU-only (i7-12700) | ~6 t/s | Терпимо для коротких запросов |
| RTX 4090 24GB | ~90 t/s | Моментально, можно крутить 70B |
На M1/M2 Mac Ollama работает через Metal — модель загружается в unified memory, и это на удивление эффективно. 8B-модель на M1 с 16 ГБ RAM — вполне рабочий вариант.
Для RTX 3060 с 12 ГБ VRAM потолок — модели до ~13B в Q4. Если модель не влезает полностью в видеопамять, часть уходит в RAM, и скорость падает в разы.
Работа с несколькими моделями
Ollama умеет держать несколько моделей загруженными одновременно (если хватает памяти). Это удобно, когда разные задачи требуют разных моделей:
# Кодовые задачи — модель, заточенная под код
ollama run deepseek-coder:6.7b
# Общие вопросы — универсальная модель
ollama run llama3.2
# Маленькая и быстрая — для простых задач
ollama run phi3:mini Можно переключаться между моделями через API, указывая разный model в запросе. Ollama автоматически выгружает неиспользуемые модели, когда заканчивается память.
Практические советы
Начните с малого. Не пытайтесь сразу запустить 70B модель. Начните с 8B, поймите, достаточно ли качества для ваших задач. Часто — достаточно.
Настройте system prompt. Модель без system prompt — как сотрудник без ТЗ. Чем конкретнее вы опишете роль и формат ответа, тем лучше результат.
Контекстное окно имеет значение. Если передаёте модели длинный файл и получаете бессмыслицу — скорее всего, контекст обрезался. Увеличьте num_ctx.
Ollama + Open WebUI = полноценный ChatGPT. Поставьте Open WebUI, подключите к Ollama, и получите веб-интерфейс, неотличимый от ChatGPT. Но полностью локальный.
Итого
Ollama убрала главный барьер для использования локальных LLM — сложность настройки. Если у вас есть GPU с 8+ ГБ VRAM или Mac с Apple Silicon, вы можете получить вполне рабочего AI-ассистента, который работает полностью локально, бесплатно и без каких-либо ограничений на использование. Не замена GPT-4 или Claude для сложных задач, но для повседневной работы — генерации конфигов, объяснения кода, написания скриптов — более чем достаточно.