Итог дня
Читаю результаты прогона…
| Запрос | Верно | До 1-го токена ответа, с | Ток/с |
|---|
- Повторов на запрос — нет данных. Разброс по повторам в этом прогоне не измерен вовсе: разница в один вердикт может быть шумом, а не свойством запроса.
- Ступеней восемь, и каждая представлена одним запросом: это не статистика, а срез.
- Верность ставили код и человек. Модели-судьи в этом прогоне не было, и способ оценки стоит у каждой строки таблицы.
- Мерено на ноутбуке, а не на проде: на прод переносятся качество и ограничения модели, не секунды.
Как это мерено
Каждый запрос уходил в /api/generate потоком (stream: true) на локальный экземпляр Ollama по петле. Обвязка записывала: промпт, полный ответ, prompt_eval_count, eval_count, load_duration, prompt_eval_duration, eval_duration, done_reason.
Ток/с — это eval_count, делённое на eval_duration: скорость самой генерации, без обработки входа и без загрузки весов. До 1-го токена ответа — время от отправки запроса до первого чанка видимого ответа. На восьми запросах с выключенным рассуждением это то же, что первый чанк любого вида; на строке с включённым рассуждением — нет, и разница там в сотни раз.
Параметры всех запросов одинаковы — — чтобы разница во времени объяснялась запросом, а не перезагрузкой модели под другое окно контекста.
Перед каждым запросом снимался размер журнала Ollama: появление в нём обслуженного запроса означало бы, что в то же окно отвечала служба сайта, и замер был бы помечен «с помехой». Помех за прогон не было.
Как оценена верность
Три значения: верно, частично, неверно — рубрика 2/1/0 дня 22. Рядом с вердиктом стоит способ оценки, и он важнее самого вердикта.
- Механически — ответ сверял код или точный эталон: год в факте, число в арифметике, день недели по
datetime, запуск функции в Node 22 против восьми наборов входа, разбор JSON против схемы. - Вручную — смысловая сверка человеком: перевод абзаца, пункты выжимки против исходного документа, ответ про коды 429 и 503.
Третьего способа — модели-судьи — в этом прогоне не было, хотя ADR недели его предусматривал. Поэтому там, где стоит «вручную», читатель проверяет не число, а чужое прочтение: полный ответ модели лежит в разборе ниже, и прочтение можно оспорить.
Почему скорость гуляет вдвое
Разброс в таблице — не шум прогона и не окно контекста. У тега модели включено спекулятивное декодирование draft-MTP: черновой слой предсказывает несколько токенов вперёд, и выигрыш зависит от того, насколько текст предсказуем. Там, где принимается почти весь черновик, скорость удваивается. Там, где почти ничего, прогон чернового слоя не отрабатывает своих накладных расходов, и остаётся собственная скорость модели.
Читаю результаты прогона…
Параметр модели — draft_num_predict . Доля принятых черновых токенов за прогон гуляла от до на замерах.
Какой доле какой текст соответствует, этот замер числом не записал: разбивка по типам текста читалась по журналу службы, и в данных страницы её нет. Что скорость идёт за предсказуемостью текста, видно из таблицы — доли в ней не участвуют.
| Что генерируется | Ток/с |
|---|
Следствие для этого проекта: интерфейс сайта русскоязычный, то есть работает на худшей половине этой вилки. Любая оценка «сколько мы отдаём токенов в секунду», снятая на английском или на коде, завысит реальность вдвое.
Найдено по журналу службы и по ollama show: на странице библиотеки Ollama про MTP у этого тега не сказано ничего. Строки журнала, по которым это видно:
Чего этот замер не мерил
- Устойчивости. Один прогон на запрос. Повтор того же запроса в отдельной серии дал разброс около трёх процентов, но это один запрос, а не весь набор.
- Потолка железа. Ноутбук был в обычной интерактивной работе владельца, а не на изолированном стенде. Числа — скорость на рабочей машине под нагрузкой.
- Проды. Замер шёл в отдельный экземпляр Ollama по петле; служба, которую видит сайт, не трогалась.
- Качества на длинной дистанции. Восемь запросов — срез ступеней сложности, а не выборка, по которой считают долю ошибок.
- Энергопотребления и троттлинга. Предупреждений о тепловом троттлинге за прогон не было, но частоту без привилегированного доступа не снять.
Что уже было закрыто
-
Ollama на ноутбуке владельца отвечает по CLI и по HTTP; служба слушает адрес частной сети, а не
0.0.0.0.Закрыто раньше09.09.2026
ADR 2026-09-09-0258 · запись 2026-09-09-0258-mac-tailnet.md · deploy/mac/ai.zpq.ollama-tailnet.plist
-
Ярус
self-hostedв реестре провайдеров и выбор провайдера вызывающим: локальная модель — такой же пункт списка, как облачная.Закрыто раньше08.09.2026
ADR 2026-09-08-1748 · ADR 2026-09-08-1824 · router/config/providers.json
Пробел, который закрывает эта страница: прогона запросов разной сложности не было. Что модель запускается и отвечает на простой запрос, было известно; что она делает с переводом, арифметикой, кодом, схемой и документом на четыре с половиной тысячи токенов — нет.
Разбор по запросам
У каждого запроса — полный промпт, эталон, полный ответ модели и причина вердикта. Ответы не пересказаны: их можно прочитать и оспорить.
Читаю результаты прогона…
Способы доступа
Один и тот же запрос — тремя способами. Сравнение не про скорость: про то, какие метрики способ вообще отдаёт и что он делает с рассуждением модели. Ответ верен во всех четырёх вызовах.
| Способ | Ответ | До 1-го токена ответа, с | Длительности от движка |
|---|
Читаю результаты прогона…
Две ловушки OpenAI-совместимого эндпоинта
Первая: рассуждение там включено по умолчанию и приходит в нестандартном поле — delta.reasoning, а не reasoning_content, как ждёт часть клиентов. Если это поле не читать, ответ выглядит так, будто модель молчала: поток начинается через с, а первый токен видимого ответа приходит через с. Выключается параметром reasoning_effort: "none" — не think, как на /api/generate; с ним до первого токена остаётся с.
Вторая: usage.completion_tokens считает токены рассуждения. В замере это токенов против токенов видимого ответа. Поделить первое на время после первого видимого токена — и получится скорость втрое выше настоящей. Это ровно та ошибка, в которую легко въехать, считая стоимость и скорость по usage.
Побочное наблюдение, важное для эксплуатации: загрузка весов повторялась при каждом переключении между вызовами с разным окном контекста — Ollama поднимает под другое num_ctx новый экземпляр модели. Отсюда и две раздельные службы в текущей схеме: сайт и локальные опыты не делят одно окно.
Как это вызвать
OLLAMA_HOST=127.0.0.1:11435 ollama run qwen3.8:27b --verbose --think=false 'In what year was the Eiffel Tower completed?'
curl -s http://127.0.0.1:11435/api/generate -d '{"model":"qwen3.8:27b","prompt":"In what year was the Eiffel Tower completed?","stream":false,"think":false,"options":{"num_ctx":16384,"temperature":0,"seed":42}}'
Петля в примерах стоит намеренно: без OLLAMA_HOST клиент стучится на порт по умолчанию, где слушает другая служба. Адреса частной сети и имени машины в ней здесь нет — ни в примерах, ни в данных страницы.
Задание дня
День 26 «Запуск локальной LLM»: установить и запустить локальную LLM; проверить: запускается локально, доступ через CLI или HTTP API, отвечает на простой запрос; сделать: запросы разной сложности. Результат: локальная LLM запущена и отвечает.