Комментарии 8
Надеялся здесь увидеть куски C++ кода, позволяющего ускорить инференс на памяти с низкой пропускной способностью. Но увы чуда не случилось, и перед нами очередной пересказ тривиального llama.cpp docs, еще и на эмпирическом уровне, без понимания происходящего под капотом.
llama.cpp — это низкоуровневый фреймворк
Вообще не фреймворк.
сделать первый запрос здесь так же просто, как и в Ollama
Возможно потому что ollama==llama.cpp?
Ряд инструментов llama.cpp по аналогии с CLI Ollama и другими фреймворками решают конкретные задачи. В нашей статье рассмотрим базовые, особенно
llama-serverиllama-bench
Вы вот и правда думаете, что в 2026-м году никто еще не рассмотрел базовые инструменты?
Для запуска нам понадобится виртуальная машина с GPU. В нашем случае мы выбрали почасовую прерванную GPU от Selectel.
Для запуска примеров по оптимизации - вам понадобится машинка с 8-16 ГБ DDR4, и каким-нибудь проциком типа Ryzen 2400GE. Для запуска на RTX 4090 с 24 Гб - оптимизация не нужна.
Каждый инструмент решает задачу, поднять REST API (
llama-server)
Правда? И поэтому llama-server имеет в своем составе отменную ГУЯтину? Вы хоть пару исходников для приличия открывали?
Использовать Flash Attention (ускоряет обработку длинных контекстов, требует поддержки GPU).
FA ничего не ускоряет, и ничего не требует: работает через любой API умеющий в перемножение матриц: CUDA, Metal, ROCm, AVX2, AVX512, NEON (на ARM'ах). Его суть не в ускорении обработки длинного контекста, а в дроблении матриц на блоки размером с кеш-память девайса для последующего вычисления их схожести в пределах кеш-памяти. И хотя в итоге это приводит к повышению производительности, но на самом деле это сделано для уменьшение всплеска потребления памяти.
llama-serverпредоставляет два основных эндпоинта
Не эндпоинта, а метода, и не два, а больше
1. /v1/chat/completions — совместимый с OpenAI API
2. /completion — запрос для генерации
Не запрос для генерации, а метод для режима чата, не ведущий историю, а ожидающий ее в запросе.
Жаль что вы нашли только два. Хотелось бы почитать про эмбеддинг, про грамматику, вычисление векторов и запись их в кеш. Для чего это нужно? Ну вот например для этого:

И это я еще не показал ГОЛОСОВОЙ диалог.
Воспользуемся
llama-bench, чтобы подобрать оптимальный размер батча. В цикле прогоняем модель с разными значениями-ub(micro-batch size):
Незнание принципов (даже базовых) работы технологии, побуждает вас "подбирать", хотя его нужно просто знать.
llama.cpp предоставляет мощный инструментарий для запуска LLM на локальном оборудовании с полным контролем над производительностью.
Весь контроль производительности на RTX 4090 - находится в пределах статистической погрешности, видной если просто запустить бенчмарк несколько раз. Подбор ключей - это не оптимизация, это тривия.
А вы уже пробовали самостоятельно запускать LLM-модель для локального контура? Какими фреймворками пользовались?
Первый раз слышу о таком. Шутка.
Правда в том, что на дворе 2026-й год, и сложно найти человека, который just for lulz не запускал это локально.
Ваш юзкейс, это простите - воспользоваться телефонным справочником для поиска телефонного номера. Это было бы прикольно в 2023 году, когда сей инструмент только появился в режиме пре-альфы. Но сейчас, эх.
Мне было полезно, только вникаю в кухню. О инструментах слышал и видел, но вот например не знал что бенч может перебирать параметры.
Ещё хотел спросить если кто может помочь, все модели какие запускал, все всё время сваливаются в постоянные циклы wait user say...и так до бесконечности.
А так же хотелось бы подробнее про API llama узнать. Может в этом можно найти решение зацикливания?
Спасибо за подробный разбор. Название статьи действительно могло создать ожидание низкоуровневого материала про C++ и оптимизацию внутренних механизмов llama.cpp. При этом сама статья посвящена практическому запуску, конфигурации, API и первичному бенчмаркингу.
С частью замечаний не согласимся. Ollama не тождественна llama.cpp: она использует llama.cpp как один из ключевых компонентов, но добавляет собственный слой управления моделями, API и конфигурацией. /v1/chat/completions и /completion корректно называть эндпоинтами. Утверждение, что Flash Attention ничего не ускоряет, также слишком категорично: снижение обмена с памятью и потребления памяти в ряде сценариев даёт прирост производительности.
Тезис о том, что в 2026 году локальные LLM запускали уже все, тоже вряд ли универсален. Материал рассчитан на инженеров, которым нужен воспроизводимый путь от сборки до рабочего API. Для такой аудитории подобный разбор сохраняет практическую ценность.
При этом сама статья посвящена практическому запуску, конфигурации, API и первичному бенчмаркингу.

Вот примерно так работает ваш "практический" запуск.
Ollama не тождественна llama.cpp: она использует llama.cpp как один из ключевых компонентов, но добавляет собственный слой управления моделями, API и конфигурацией.
Она полностью тождественна llama.cpp, потому что является враппером над движком.
https://github.com/ollama/ollama - можете здесь тыкнуть на код управления слоями моделей?
А то почему-то слои нарезает именно llama.cpp (из лога олламы):
llama_model_loader: loaded meta data with 25 key-value pairs and 291 tensors
llm_load_tensors: offloading 32 architectural layers to GPU
llm_load_tensors: offloaded 32/32 layers to GPU
llm_load_tensors: VRAM used: 4620.12 MiB
/v1/chat/completions и /completion корректно называть эндпоинтами.
Только если не знать нативное название. Но нативное название метода - "метод".
Утверждение, что Flash Attention ничего не ускоряет, также слишком категорично: снижение обмена с памятью и потребления памяти в ряде сценариев даёт прирост производительности.
Утверждение сродни утверждению, что "нажатие на педаль газа ускоряет машину". Как бы нажатие на педаль газа открывает дроссельную заслонку - так бы сказал инженер. Здесь - то же самое. В конечном итоге - да, ускоряет (хоть и не везде), но цель - совершенно другая.
Тезис о том, что в 2026 году локальные LLM запускали уже все, тоже вряд ли универсален.
Безусловно. Но статья написана слишком витиевато для тех, кто в первый раз. И к тому же с ошибками.
Материал рассчитан на инженеров, которым нужен воспроизводимый путь от сборки до рабочего API.
Нет, на этих материал точно не рассчитан.
Инженерия - это четкое понимание механизма работы, а "подбирание параметров" - это скорее вредные советы из ютубчика или инстаграммчика.
Вот взять даже ваш export CUDACXX=/usr/local/cuda/bin/nvcc
Инженер - прекрасно знает, что абсолютное местоположение файла зависит от нескольких условий, и поэтому пишет корректный export CUDACXX=`which nvcc`
Описание параметров - явно не инженерное, и можно сказать далекое от правды.
-ngl (--n-gpu-layers) - Для слабых GPU можно снизить число, чтобы часть вычислений ушла на CPU.
Вот например с чего вы это взяли? Любой GPU даже слабый - всегда будет быстрее вычислять, поскольку вычислительных конвееров у него априори больше чем у процессора. А есть еще iGPU, использующие общую память, в этом случае он тем более будет быстрее процессора
-t (--threads) - Количество потоков CPU для вычислений. По умолчанию — все доступные ядра. Можно ограничить, чтобы не нагружать систему.
Ну разве это инженерное объяснение?
"На этапе инференса (генерации текста) модель выполняет огромное количество умножений матриц, llama.cpp умеет разбивать эти задачи на части, и выполнять их в параллельных потоках. Большое количество потоков вынуждает процессор тратить больше времени на переключение контекста и координацию потоков между задачами, чем на сами вычисления". Для инженеров стоит упомянуть еще и про P\E ядра современных процессоров. Хотя мы это и так знаем.
Складывается ощущение, что вы просто поставили llama.cpp на компьютер, оно у вас почему-то заработало, и вы решили опыт одного компьютера масштабировать на все. Сойдет для статьи "как я первый раз запустил llama.cpp", но вот для инженерной - слабовато. Мы ведь злые люди, и не любим когда математику изучают методом тыка =)
Ещё хотел спросить если кто может помочь, все модели какие запускал, все всё время сваливаются в постоянные циклы wait user say...и так до бесконечности.
Нужны грязные подробности.
А так же хотелось бы подробнее про API llama узнать. Может в этом можно найти решение зацикливания?
https://github.com/osllmai/llama.cpp/blob/main/examples/server/README.md
В 26 мой гайд по запуску и поднятию llama.cpp выглядел бы так - запустите команду codex/claude/etc установи на этот компудахтер llama.cpp и запусти модель ....
Реально, когда в том-же кодеке есть бесплатный месячный лимит и его хватает на такие операции, просто теряет смысл делать это руками (хотя придется раскашелиться на получение смс на зарубежный номер).

Запуск и оптимизация локальной LLM с llama.cpp