Продвинутая настройка Ollama
Modelfile, переменные окружения, API, несколько моделей — всё, что нужно, чтобы выжать максимум из локальных моделей.
← Локальные модели · Начать с начала
🇬🇧 English version: advanced-setup.md
Содержание
- Переменные окружения Ollama
- Modelfile — кастомные модели
- HTTP API — доступ из программ
- OpenAI-совместимые эндпоинты
- Параллельные запросы и несколько моделей
- Speculative decoding (ускорение)
- Что дальше
1. Переменные окружения Ollama
Переменные окружения — самый простой способ повлиять на то, как Ollama использует память, процессор и сеть. Они задаются до запуска сервера.
Как задать переменную
Способ 1 — временно (на один запуск):
OLLAMA_KV_CACHE_TYPE=q4_0 ollama serve
Способ 2 — на всю сессию терминала:
export OLLAMA_KV_CACHE_TYPE=q4_0
ollama serve
Способ 3 — навсегда (рекомендую):
Добавьте строки в файл ~/.zshrc (этот файл выполняется при каждом открытии терминала):
echo 'export OLLAMA_KV_CACHE_TYPE=q4_0' >> ~/.zshrc
echo 'export OLLAMA_FLASH_ATTENTION=1' >> ~/.zshrc
Затем примените изменения (или откройте новый терминал):
source ~/.zshrc
Полная таблица переменных
| Переменная | По умолчанию | Что делает | Когда менять |
|---|---|---|---|
OLLAMA_KV_CACHE_TYPE |
f16 |
Тип квантизации KV cache. q4_0 = в 4× меньше памяти, q8_0 = в 2× меньше |
Всегда на Mac с ≤16 GB RAM. q4_0 — безопасный выбор |
OLLAMA_FLASH_ATTENTION |
false |
Flash attention — экономит память + немного ускоряет | Включите (1), если модели не влезают |
OLLAMA_NUM_PARALLEL |
1 |
Сколько запросов к одной модели можно обрабатывать одновременно | Если несколько приложений стучатся к одной модели (например, Continue.dev + чат) |
OLLAMA_MAX_LOADED_MODELS |
auto |
Сколько разных моделей держать в памяти одновременно | Если часто переключаетесь между моделями |
OLLAMA_KEEP_ALIVE |
5m |
Сколько минут держать модель в памяти после последнего запроса | Увеличьте, если модель часто выгружается и перезагружается |
OLLAMA_HOST |
127.0.0.1:11434 |
Какой IP и порт слушает сервер | 0.0.0.0:11434 — если нужно стучаться с других устройств |
OLLAMA_GPU_OVERHEAD |
0 |
Резерв памяти (в байтах), который Ollama не трогает | Если Mac тормозит из-за нехватки памяти для системы |
OLLAMA_LOAD_TIMEOUT |
5m |
Таймаут загрузки модели | Если модель большая и долго грузится |
OLLAMA_NOHISTORY |
false |
Не сохранять историю запросов | Для приватности |
OLLAMA_DEBUG |
false |
Подробные логи | Если что-то не работает и нужно разобраться |
OLLAMA_MAX_QUEUE |
512 |
Максимальная очередь запросов | При высокой нагрузке |
Рекомендуемый конфиг для Mac 16 GB
Добавьте всё это в ~/.zshrc одной командой:
cat >> ~/.zshrc << 'EOF'
# Ollama — оптимизация для Mac 16 GB
export OLLAMA_KV_CACHE_TYPE=q4_0 # 4× экономия памяти KV cache
export OLLAMA_FLASH_ATTENTION=1 # экономия + ускорение
export OLLAMA_NUM_PARALLEL=2 # 2 параллельных запроса
export OLLAMA_KEEP_ALIVE=10m # держать модель 10 минут
export OLLAMA_GPU_OVERHEAD=536870912 # 512 MB — запас для системы
EOF
Затем:
source ~/.zshrc
Как проверить, что переменные применились
# Показать все установленные переменные Ollama
env | grep OLLAMA
Перезапустите ollama serve или приложение Ollama после изменения переменных.
2. Modelfile — кастомные модели
Modelfile — это аналог Dockerfile, только для AI-моделей. С его помощью можно:
- Сменить системный промпт (как модель себя ведёт)
- Настроить параметры генерации (температуру, контекст)
- Создать специализированную версию модели под свою задачу
Простой Modelfile
Создайте файл Modelfile (без расширения) в любой папке:
FROM qwen3.5:4b
PARAMETER temperature 0.7
PARAMETER num_ctx 8192
SYSTEM "Ты — дружелюбный AI-ассистент. Отвечай кратко и по делу."
Что здесь происходит:
FROM— берём за основу модельqwen3.5:4bPARAMETER— меняем настройки:temperature 0.7— умеренная креативность (0 = всегда одинаково, 2 = хаос)num_ctx 8192— контекст 8K токенов (вместо стандартных 2048)
SYSTEM— задаём системное сообщение (как модель должна себя вести)
Сборка и запуск
# Собрать кастомную модель
ollama create my-assistant -f ./Modelfile
# Запустить
ollama run my-assistant
Все параметры PARAMETER
| Параметр | По умолч. | Что делает | Пример |
|---|---|---|---|
temperature |
0.8 | Креативность ответов (0.0 — строго, 2.0 — хаос) | 0.3 для фактов, 1.2 для идей |
num_ctx |
2048 | Размер контекстного окна (токенов) | 8192 для длинных диалогов |
num_predict |
-1 (∞) | Максимум токенов в ответе | 512 для коротких ответов |
top_k |
40 | Сколько лучших вариантов рассматривать | 10 для более точных ответов |
top_p |
0.9 | Nucleus sampling (0-1) | 0.5 для более уверенных ответов |
min_p |
0.0 | Минимальная вероятность токена | 0.05 для фильтрации мусора |
seed |
0 | Зерно рандома (для повторяемости) | 42 — всегда одинаковый ответ |
repeat_penalty |
1.1 | Штраф за повторение фраз | 1.2 если модель зацикливается |
stop |
— | Стоп-последовательности | "\\n" — остановиться на переносе строки |
Примеры готовых Modelfile
Для перевода:
FROM qwen3.5:4b
PARAMETER temperature 0.3
SYSTEM "Ты — профессиональный переводчик. Переводи текст с русского на английский и обратно. Отвечай только переводом, без комментариев."
Для написания кода:
FROM qwen2.5-coder:7b
PARAMETER temperature 0.2
PARAMETER num_ctx 16384
SYSTEM "Ты — senior Python-разработчик. Пиши код с type hints, докстрингами и обработкой ошибок. Используй современные практики."
Для мозгового штурма:
FROM qwen3.5:4b
PARAMETER temperature 1.5
PARAMETER top_p 0.95
SYSTEM "Ты — креативный копирайтер. Генерируй необычные идеи, мысли нестандартно."
TEMPLATE — формат промпта
Некоторым моделям нужен специальный формат сообщений:
FROM llama3.3:8b
TEMPLATE """<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|><|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>"""
Обычно template не нужно менять — он уже встроен в модель. Но если модель ведёт себя странно,
можно переопределить.
### Просмотр информации о модели
```bash
# Показать Modelfile установленной модели
ollama show qwen3.5:4b --modelfile
# Показать параметры модели
ollama show qwen3.5:4b --parameters
# Показать системный промпт
ollama show qwen3.5:4b --system
3. HTTP API — доступ из программ
Ollama запускает HTTP-сервер на порту 11434. К нему можно обращаться из любой программы, которая умеет делать HTTP-запросы — Python, JavaScript, curl и т.д.
Базовые запросы через curl
Chat (диалог):
curl http://localhost:11434/api/chat -d '{
"model": "qwen3.5:4b",
"messages": [
{"role": "user", "content": "Привет! Как дела?"}
],
"stream": false
}'
Параметр "stream": false — ждём полный ответ. Без него ответ будет приходить по частям (streaming).
Generate (однострочный запрос):
curl http://localhost:11434/api/generate -d '{
"model": "qwen3.5:4b",
"prompt": "Напиши хайку про программиста",
"stream": false
}'
JSON mode (получить ответ в формате JSON)
curl http://localhost:11434/api/chat -d '{
"model": "qwen3.5:4b",
"messages": [
{"role": "user", "content": "Извлеки имя, возраст и город из: Меня зовут Иван, мне 25, я из Москвы"}
],
"format": "json",
"stream": false
}'
Результат: модель сама догадается вернуть JSON:
{"name": "Иван", "age": 25, "city": "Москва"}
Structured output (JSON Schema) — точный контроль
Если нужно гарантировать структуру ответа, опишите её через JSON Schema:
curl http://localhost:11434/api/chat -d '{
"model": "qwen3.5:4b",
"messages": [
{"role": "user", "content": "Извлеки данные из: Вася, 30 лет, инженер"}
],
"format": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"occupation": {"type": "string"}
},
"required": ["name", "age"]
},
"stream": false
}'
Эмбеддинги (векторизация текста)
curl http://localhost:11434/api/embed -d '{
"model": "all-minilm",
"input": "Текст для векторизации"
}'
Управление памятью
Посмотреть загруженные модели:
curl http://localhost:11434/api/ps
Выгрузить модель из памяти:
curl http://localhost:11434/api/generate -d '{
"model": "qwen3.5:4b",
"keep_alive": 0
}'
Значение keep_alive: 0 означает «выгрузить сразу». По умолчанию модель живёт в памяти 5 минут.
Streaming (поточный ответ)
Если не указывать "stream": false, Ollama будет возвращать ответ по частям — токен за токеном.
Это даёт эффект «живого печатания» в чате:
curl http://localhost:11434/api/chat -d '{
"model": "qwen3.5:4b",
"messages": [
{"role": "user", "content": "Расскажи историю про робота"}
]
}'
Каждая строка ответа — отдельный JSON с одним токеном. Последняя строка содержит "done": true.
Список установленных моделей
curl http://localhost:11434/api/tags
Python (библиотека requests)
import requests
import json
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": "qwen3.5:4b",
"messages": [{"role": "user", "content": "Привет!"}],
"stream": False
}
)
print(response.json()["message"]["content"])
4. OpenAI-совместимые эндпоинты
Ollama поддерживает API, совместимый с OpenAI. Это значит, что любая программа, которая работает с OpenAI, может работать с Ollama — достаточно сменить адрес сервера.
Это работает для: Continue.dev, Aider, Open Interpreter, Cursor, и любых кастомных скриптов.
Endpoints
| OpenAI endpoint | Ollama endpoint | Описание |
|---|---|---|
https://api.openai.com/v1/chat/completions |
http://localhost:11434/v1/chat/completions |
Чат |
https://api.openai.com/v1/completions |
http://localhost:11434/v1/completions |
Генерация |
https://api.openai.com/v1/embeddings |
http://localhost:11434/v1/embeddings |
Эмбеддинги |
https://api.openai.com/v1/models |
http://localhost:11434/v1/models |
Список моделей |
curl
curl http://localhost:11434/v1/chat/completions -d '{
"model": "qwen3.5:4b",
"messages": [{"role": "user", "content": "Привет!"}]
}'
Python (openai SDK)
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # любое значение, Ollama всё равно не проверяет
)
response = client.chat.completions.create(
model="qwen3.5:4b",
messages=[{"role": "user", "content": "Привет!"}]
)
print(response.choices[0].message.content)
JavaScript / Node.js
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
const response = await client.chat.completions.create({
model: 'qwen3.5:4b',
messages: [{ role: 'user', content: 'Привет!' }],
});
console.log(response.choices[0].message.content);
Как это использовать в Continue.dev
В ~/.continue/config.json:
{
"models": [
{
"title": "Локальный чат",
"provider": "openai",
"model": "qwen3.5:4b",
"apiBase": "http://localhost:11434/v1",
"apiKey": "ollama"
},
{
"title": "Автодополнение",
"provider": "openai",
"model": "qwen2.5-coder:1.5b",
"apiBase": "http://localhost:11434/v1",
"apiKey": "ollama"
}
]
}
Как это использовать в Aider
export OLLAMA_API_BASE=http://localhost:11434
aider --model ollama/qwen2.5-coder:7b
Важные отличия от настоящего OpenAI API
| Особенность | OpenAI | Ollama |
|---|---|---|
| API key | Реальный ключ | Любая строка (или ollama) |
| Streaming | По умолчанию | По умолчанию |
max_tokens |
Работает | Работает |
temperature |
Работает | Работает |
tools / functions |
Работает | Поддерживается (tool calling) |
response_format |
json_object |
format: "json" или JSON Schema |
| GPT-4 модели | Есть | Нет (только локальные) |
5. Параллельные запросы и несколько моделей
По умолчанию Ollama обрабатывает запросы последовательно: один запрос — один ответ. Но можно включить параллельную обработку.
Параллельные запросы к одной модели
Установите переменную OLLAMA_NUM_PARALLEL перед запуском сервера:
export OLLAMA_NUM_PARALLEL=2
ollama serve
Теперь к одной модели можно обращаться из двух приложений одновременно — например, Continue.dev в VS Code и чат в Open WebUI.
Сколько можно поставить: зависит от вашей RAM. Если модель весит 4 GB и у вас 16 GB, можно ставить 2–3. Если модель весит 8 GB на 16 GB — только 1.
Как проверить, сколько запросов сейчас обрабатывается:
curl http://localhost:11434/api/ps
Несколько моделей в памяти
export OLLAMA_MAX_LOADED_MODELS=3
ollama serve
Теперь можно держать в памяти до 3 разных моделей одновременно. Переключение между ними будет мгновенным (без повторной загрузки).
Пример сценария:
qwen3.5:4b— быстрый чат (3.4 GB)qwen2.5-coder:7b— кодинг (4.7 GB)all-minilm— эмбеддинги (0.1 GB)
Итого: ~8 GB занято, что нормально для 16 GB Mac.
Как выгрузить модель из памяти вручную
# Через API
curl http://localhost:11434/api/generate -d '{
"model": "qwen3.5:4b",
"keep_alive": 0
}'
Или через ollama ps, чтобы сначала посмотреть, что загружено:
ollama ps
Как понять, что модель выгрузилась
Запустите ollama ps — он покажет пустой список, если ни одна модель не загружена.
Важно: Если модель не используется, Ollama выгрузит её автоматически через
OLLAMA_KEEP_ALIVE (по умолчанию 5 минут). Можно уменьшить:
export OLLAMA_KEEP_ALIVE=30s # выгружать через 30 секунд бездействия
6. Speculative decoding (ускорение)
Speculative decoding — техника, при которой маленькая и быстрая модель (draft model) набрасывает черновик ответа, а большая модель его проверяет и исправляет.
Результат: генерация ускоряется в 1.5–2× без потери качества.
Как это работает
- Draft-модель (маленькая) быстро предполагает следующие 5–10 токенов
- Большая модель проверяет их все сразу (параллельно)
- Если draft угадал — принимаем, если ошибся — большая модель исправляет
Настройка в Ollama через Modelfile
FROM qwen2.5-coder:7b
DRAFT qwen2.5-coder:1.5b
Соберите модель:
ollama create my-coder-sd -f ./Modelfile
ollama run my-coder-sd
Модель qwen2.5-coder:7b будет использовать qwen2.5-coder:1.5b как draft.
Другой способ — через API
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5-coder:7b",
"prompt": "Напиши функцию сортировки на Python",
"options": {
"draft": "qwen2.5-coder:1.5b"
},
"stream": false
}'
Какую draft-модель выбрать
| Для большой модели | Хорошая draft-модель | Ускорение |
|---|---|---|
| 7B–9B | 1.5B из того же семейства | ×1.3–1.8 |
| 14B | 1.5B–4B | ×1.5–2.0 |
| 30B–70B | 7B–8B | ×1.5–2.5 |
Правило: draft-модель должна быть из того же семейства (например, Qwen + Qwen, Llama + Llama) и занимать примерно в 4–10× меньше RAM.
Где взять draft-модель:
# Qwen 2.5 Coder — 1.5B для кодинга
ollama pull qwen2.5-coder:1.5b
# Llama 3.2 — 3B (для большой Llama)
ollama pull llama3.2:3b
Практические цифры
На M4 Pro 24 GB, Qwen3-Coder-30B:
| Режим | tok/s | Ускорение |
|---|---|---|
| Без speculative decoding | 70 | 1× |
| С draft (Qwen 2.5 Coder 1.5B) | 110–120 | ×1.6 |
Speculative decoding даёт наибольший прирост на больших моделях (30B+). На моделях до 7B ускорение меньше — 10–30%.
Когда НЕ использовать
- Если у вас мало RAM (draft-модель занимает дополнительное место)
- Если модель уже отвечает быстро (>50 tok/s) — ускорение незначительно
- Если draft-модель из другого семейства — качество угадывания падает
7. Что дальше
После настройки производительности и API:
| Если хотите | Переходите |
|---|---|
| Сравнить все инструменты (MLX, llama.cpp, vLLM) | tools.md |
| Выбрать квантизацию (Q4, Q5, Q8) | quantization.md |
| Посмотреть бенчмарки на Mac | benchmarks/apple-silicon.md |
| Полный каталог всех моделей | catalog.md |
| Решить проблему | troubleshooting.md |
В разделе: getting-started · running-models · models · catalog · quantization · memory-and-context · tools · advanced-setup · troubleshooting · apple-silicon
Связанные разделы: Нулевой уровень · AI-агенты · Use Cases
Навигация: ← Локальные модели · ↑ На главную · 🇬🇧 English