Блог AST-SoftPro
llama.cpp: запуск LLM на любом железе без GPU
Введение в llama.cpp и запуск LLM на CPU
Llama.cpp — это open-source инструмент для запуска больших языкових моделей (LLM) локально без необходимости использовать GPU. Он позволяет запускать модели размером от 7B до более чем 140B параметров исключительно на процессоре, что делает технологии доступными даже при ограниченных вычислительных ресурсах.
Обычно запуск крупных LLM требует мощного видеокарта или облачных сервисов с высокой стоимостью использования. Однако благодаря оптимизации llama.cpp (включая квантование и специализированные библиотеки), такие модели становятся доступными для любого компьютера — от ноутбука до старого сервера на работе.
В этой статье рассмотрим, как установить и настроить llama.cpp, выбрать подходящую модель, применить методы квантования для ускорения работы и оптимизировать производительность при использовании только CPU. Все примеры будут основаны на открытых инструментах без зависимости от коммерческого ПО или проприетарных решений.
Установка и настройка окружения
Для начала необходимо подготовить рабочее окружение:
-
ОС: Linux (Ubuntu 20.04+), macOS, Windows (через WSL2).
-
Компилятор C/C++ с поддержкой OpenMP (для многопоточности).
-
Git.
Установка через git и сборка из исходников
- Клонируем репозиторий:
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp
- Устанавливаем зависимости (пример для Ubuntu):
sudo apt update && sudo apt install -y build-essential cmake git libcurl4-openssl-dev zlib1g-dev libnghttp2-dev openblas-dev wget jq unzip
- Собирать с поддержкой OpenMP:
make O=cpu LLAMA_CPU_THREADS=8 OPTIMIZATION=-O3 # количество потоков — по числу ядер CPU
- Запуск: ./main -m models/llama-7b.gguf
Примечание: Использование -O3 и OpenMP ускоряет декодирование на многоядерном процессоре.
Альтернатива: использование pre-built бинарников (Windows/Linux)
Для пользователей Windows или тех, кто не хочет собирать с нуля, доступны предварительно собранные версии:
- https://github.com/ggerganov/llama.cpp/releases Выберите llama-cli-x86_64-linux или .exe, запустите из командной строки.
Выбор модели LLM: форматы GGUF и источники моделей
Для работы llama.cpp используются специальные форматы моделей — GGUF (Generalized Generic Unified Format). Это бинарный формат, оптимизированный под эффективность загрузки и выполнения на CPU. В отличие от Hugging Face (*.bin, *.safetensors) или .gguf из других проектов, GGUF поддерживает разные уровни квантования.
Где брать модели?
-
TheBloke: содержит версии LLaMA 2 и Mistral с разными уровнями сжатия (4-bit, Q5_K_M, etc.).
-
CausalML/llama.cpp-models — архив моделей.
Пример: TheBloke/Mistral-7B-Instruct-v0.2-GGUF содержит версии:
-
Q4_K_M: 4-bit квантование, оптимизированное под скорость декодирования (подходит для CPU).
-
Q5_K_M: чуть больше памяти, но лучше качество.
Сравнение форматов и уровней квантования
| Формат | Параметры | Размер на диск | Память в процессе | Поддержка llama.cpp |
|---|---|---|---|---|
| GGUF (Q4_K_M) | 4-битное, sparse-kv | ~1.5–2 ГБ | ~6 ГБ RAM | ✅ Да |
| GGUF (Q8_0) | Full precision | 34+ ГБ | >70 ГБ | ❌ Нет |
| GGUF (Q5_K_M) | Q5 + sparse-kv | ~1.8–2.2 ГБ | ~6.5 ГБ RAM | ✅ Да |
При выборе модели важно учитывать баланс между скоростью и качеством вывода.
Квантование: как работает снижение точности
Квантование — это процесс замены 32-битных чисел (FP32) на более низкие типы данных, чтобы уменьшить требования к памяти и ускорить вычисления. В llama.cpp используются два основных подхода:
-
Sparse KV (K_M, K_QLP_K) — хранение только наиболее важных значений из тензора ключ-значение.
-
Низкая точность (Q4/Q5/Q8) — замена чисел на 4–5 битных эквивалентов через квантовую кодировку.
Как выбрать уровень?
| Уровень | RAM | Скорость (%) | Качество vs GPT-3.5 | Рекомендация |
|---|---|---|---|---|
| Q8_0 (Full) | 70+ ГБ | — | Baseline | Только если GPU доступен |
| Q4_K_M | ~6 ГБ | 90–100% | Очень близко к GPT-3.5 в коротких ответах | Для CPU — лучший выбор |
| Q5_K_M | ~6.5 ГБ | 85–95% | Чуть хуже, но стабильнее при длинных контекстах | Приоритет для long-context задач |
Пример выбора: если у вас 12 ГБ RAM и процессор Intel i7 (4 ядра), Q4_K_M — оптимальный компромисс.
Пример запуска модели на CPU
Допустим, вы скачали модель:
wget https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf -O models/mistral.q4.km.gguf
Теперь запускаем:
./main \ -m models/mistral.q4.km.gguf \ --temp 0.8 \ --top_p 0.95 \ --repeat_penalty 1.2 \ --threads $(nproc) # или CPU_COUNT
Результаты могут быть чуть менее «плавными», чем у GPT-4, но в задачах типа редактирования текста, генерации кода или ответов по документации — вполне пригодны.
Оптимизация скорости на CPU
Для повышения производительности можно:
-
Установить --threads равный числу физических ядер (не логических).
-
Использовать LLAMA_CPU_THREADS=8, если вы уверены в стабильности системы.
-
Применять --low_vram true --num_gpu_layers 0 — даже на CPU это помогает распределить нагрузку.
При использовании более чем 4–6 ядер, эффект от OpenMP может быть неочевиден из-за ограничений алгоритма декодирования. Тестируйте под конкретную модель.
Работа с длинными контекстами и потоковый вывод
Некоторые модели (например, LLaMA-2 или Mistral) поддерживают до 32K токенов контекста — это важно для документов, чатов с историей, SQL-запросов по БД.
Пример запроса на 32768 токенов:
./main -m models/llama-13b-q4.k_m.gguf --ctx_size 32768
Важно: не все квантованные модели поддерживают длинные контексты. Проверяйте документацию в GGUF-файлах (file_info() через --verbose).
Для потокового вывода (без буферизации) используйте флаг:
./main -m model.gguf --stream
Вывод будет поступать по строкам — полезно для интеграции с веб-интерфейсами, CLI-оболочками или ботами.
Интеграция в приложения: примеры использования
Llama.cpp можно использовать не только как консольный инструмент:
- Python (через llama-cpp-python) Установите пакет:
pip install llama-cpp-python==0.3.* # версия должна быть совместима с 2.x API
Пример использования:
from llama_cpp import Llama
llm = Llama(model_path="models/llama-7b.gguf")
prompt = "Объясни, как работает квантование в нейросетях."
output = llm.create_completion(
prompt=prompt,
max_tokens=512,
temperature=0.8
)
print(output['choices'][0]['text'])
- FastAPI + llama.cpp (на Python) Создание REST API:
from fastapi import FastAPI, HTTPException
import subprocess
app = FastAPI()
def run_llama(prompt: str):
result = subprocess.run([
"./main",
"-m", "models/mistral.q4.km.gguf",
"--prompt", prompt,
"--temperature", "0.7"
],
capture_output=True, text=True)
if result.returncode != 0:
raise HTTPException(status_code=500, detail="LLM failed")
return {"response": result.stdout.strip()}
@app.post("/generate")
def generate(prompt: str):
try:
return run_llama(prompt)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Такой подход позволяет интегрировать LLM в веб-проекты без зависимости от внешних API.
Ограничения и рекомендации по использованию
Несмотря на удобство, llama.cpp имеет ограничения:
-
Максимальный контекст: зависит от модели. Большинство квантованных версий ограничены 8K–32K токенов.
-
Скорость генерации: при высокой temperature (например >0.9) скорость может снижаться из-за необходимости перебора альтернативных слов.
-
Качество длинных ответов: после ~512 токенов возможны «расхождения» в логике — модель теряет фокус, хотя чаще всего продолжает корректно.
Рекомендации:
-
Для повседневного использования: Q4_K_M + 3–6 ядер CPU.
-
Избегайте слишком высоких температур (>0.9) без необходимости.
-
Проверяйте корректность ответов на критических задачах — особенно при финансовой или юридической обработке данных.
Заключение и дальнейшие шаги
Llama.cpp предоставляет мощный, бесплатный способ локального запуска LLM даже на обычных ПК с CPU. Благодаря формату GGUF и технологиям квантования (Q4_K_M), пользователи могут получать результаты, сравнимые по качеству с облачными API GPT-3.5 за доли секунды.
Ключевые шаги:
-
Установить llama.cpp через git или prebuild.
-
Выбрать модель в формате GGUF (например, Q4_K_M).
-
Запустить с оптимизацией под количество ядер CPU.
-
Интегрировать через Python API при необходимости.
Хотя производительность не сравнится с GPU-ускорением, для большинства задач — это практичный и бесплатный выбор. В будущем возможны обновления формата GGUF (например, Q2_K) или поддержка AVX512 на новых процессорах — но пока Q4_K_M остаётся золотой серединой.
Для получения актуальных версий: https://github.com/ggerganov/llama.cpp
Модели: https://huggingface.co/TheBloke