Зачем это читать, если в README уже всё есть?
Открою секрет: документация llama.cpp написана для тех, кто уже знает, что делает. Там перечислены флаги, но не объяснено, почему одни сочетания работают в 5 раз быстрее, а другие падают с ошибкой "illegal instruction". Если ты хочешь просто скопировать команду из интернета и получить максимальную скорость на своём i7-14700HX с RTX 4060 — читай дальше. Если нет — попробуй собрать без флагов и посмотри, сколько токенов в секунду получишь.
CMake — это не магия, а список инструкций для компилятора
Когда пишешь cmake .. без параметров, ты говоришь компилятору: "Собери как получится". Компилятор смотрит на твой процессор, видит поддержку AVX2, но собирает под самый старый совместимый набор инструкций — потому что так безопаснее. Результат? Твоя 16-ядерная ракета работает как одноядерный Pentium.
1 Сначала узнай, что у тебя под капотом
Без этого шага ты будешь тыкать флаги наугад. Вот команды, которые покажут реальные возможности твоего железа:
# Для CPU (Linux/macOS)
lscpu | grep -i "avx\|sse\|fma"
# Или проще:
cat /proc/cpuinfo | grep flags
# Для CUDA (важно знать архитектуру)
nvidia-smi --query-gpu=compute_cap --format=csv
# Или:
nvidia-smi -q | grep "CUDA Capability"
# Для Vulkan
vulkaninfo | grep "apiVersion"
Самая частая ошибка: указать не ту архитектуру CUDA. RTX 4060 — это sm_89 (Ada Lovelace). Если указать sm_86 (Ampere) или sm_75 (Turing), производительность упадёт на 15-30%. Проверь таблицу ниже.
| Видеокарта | Архитектура | CUDA Compute Capability | Флаг CMake |
|---|---|---|---|
| RTX 4090/4080/4070 Ti | Ada Lovelace | 8.9 | sm_89 |
| RTX 4060/4050 | Ada Lovelace | 8.9 | sm_89 |
| RTX 3090/3080/3070 | Ampere | 8.6 | sm_86 |
| RTX 2080 Ti/2080 | Turing | 7.5 | sm_75 |
| GTX 1080 Ti | Pascal | 6.1 | sm_61 |
2 Базовая сборка — то, что сломает 90% новичков
Не делай так:
# ЭТО НЕПРАВИЛЬНО!
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
mkdir build && cd build
cmake .. # вот здесь ошибка
make -j8
Почему это плохо? Потому что:
- Соберётся только CPU версия без оптимизаций
- Не будет поддержки GPU (ни CUDA, ни Vulkan)
- Используется самый медленный набор инструкций
- Ты получишь 10-15 токенов/сек вместо возможных 45
Рецепты сборки под разные конфигурации
Выбери свой сценарий. Если не уверен — начинай с "Максимальная производительность на ноутбуке".
Сценарий 1: Intel/AMD CPU без видеокарты (или старая карта)
Для i7-14700HX (Raptor Lake) с поддержкой AVX2, AVX-VNNI, FMA:
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_NATIVE=ON \
-DLLAMA_AVX=ON \
-DLLAMA_AVX2=ON \
-DLLAMA_AVX512=OFF \ # 14700HX не имеет AVX-512
-DLLAMA_FMA=ON \
-DLLAMA_F16C=ON \
-DBUILD_SHARED_LIBS=OFF
-DLLAMA_NATIVE=ON — самый важный флаг для CPU. Компилятор сам определит оптимальные инструкции для твоего процессора. Но если хочешь ручного контроля — используй конкретные флаги AVX/AVX2.Сценарий 2: NVIDIA CUDA (RTX 4060, 8GB VRAM)
Здесь важно правильно указать архитектуру и включить cuBLAS:
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES="89" \ # sm_89 для RTX 4060
-DLLAMA_CUBLAS=ON \
-DLLAMA_AVX2=ON \ # CPU fallback тоже оптимизируем
-DLLAMA_F16C=ON \
-DLLAMA_NATIVE=ON
Что это даёт:
- Основные вычисления идут на GPU через cuBLAS
- Когда VRAM заканчивается (а на 8GB для 8B модели это случается), llama.cpp автоматически сбрасывает слои на CPU
- CPU оптимизирован под AVX2, поэтому fallback не такой медленный
Сценарий 3: Vulkan (AMD или Intel ARC)
Если у тебя AMD карта (или хочешь попробовать Vulkan на NVIDIA — да, это работает), читай наш подробный гайд по Vulkan vs ROCm. Краткая версия:
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_VULKAN=ON \
-DLLAMA_AVX2=ON \
-DLLAMA_NATIVE=ON \
-DVulkan_LIBRARY=/usr/lib/x86_64-linux-gnu/libvulkan.so # путь может отличаться!
Vulkan часто требует ручного указания пути к библиотеке. Если сборка падает с ошибкой "Could NOT find Vulkan", установи vulkan-tools и libvulkan-dev, затем найдите путь через find /usr -name "libvulkan.so*" 2>/dev/null.
Сценарий 4: Intel MKL для Xeon/серверных CPU
Если у тебя серверный процессор или хочешь максимальную производительность на CPU:
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_BLAS=ON \
-DLLAMA_BLAS_VENDOR=Intel10_64lp \
-DBLAS_INCLUDE_DIR=/opt/intel/mkl/include \
-DBLAS_LIBRARIES=/opt/intel/mkl/lib/intel64/libmkl_rt.so \
-DLLAMA_AVX512=ON \ # для Xeon с поддержкой AVX-512
-DLLAMA_AVX512_VBMI=ON \
-DLLAMA_AVX512_VNNI=ON
Комбинированные сборки: когда одного бэкенда мало
Самый интересный сценарий — использовать несколько бэкендов одновременно. Например, CUDA для основных вычислений, а когда VRAM заканчивается — Vulkan или CPU. Или распределить слои между GPU и CPU.
# CUDA + CPU с максимальными оптимизациями
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLAMA_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES="89" \
-DLLAMA_CUBLAS=ON \
-DLLAMA_VULKAN=ON \ # резервный бэкенд
-DLLAMA_AVX2=ON \
-DLLAMA_AVX512=OFF \
-DLLAMA_NATIVE=ON \
-DLLAMA_METAL=OFF # если не macOS
Такая сборка позволяет использовать флаг --gpu-layers в llama.cpp более гибко. Можно указать --gpu-layers 20 для CUDA, а остальные слои пойдут через Vulkan или CPU.
Ошибки, которые сломают твою сборку
Я собрал топ-5 ошибок, которые видю в чатах поддержки:
| Ошибка | Причина | Решение |
|---|---|---|
illegal instruction |
Собрали с AVX512 на процессоре без AVX512 | Убрать -DLLAMA_AVX512=ON или использовать -DLLAMA_NATIVE=ON |
CUDA error: out of memory |
Модель не помещается в VRAM | Уменьшить --gpu-layers или использовать квантованную версию (Q4_K_M) |
Could NOT find Vulkan |
Библиотеки Vulkan не установлены | sudo apt install vulkan-tools libvulkan-dev |
| Медленная работа | Собрали без оптимизаций | Всегда использовать -DCMAKE_BUILD_TYPE=Release |
| Падает при запуске | Смешали несовместимые флаги | Не включать одновременно CUDA и METAL на Linux |
Проверка результатов: как понять, что сборка удалась
После make -j8 (где 8 — количество ядер) запусти тест:
# Проверяем, какие бэкенды включены
./bin/llama-cli --help | grep -i "gpu\|cuda\|vulkan\|blas"
# Быстрый тест производительности
./bin/llama-cli -m ~/models/llama-3.1-8b.Q4_K_M.gguf \
-p "Hello" -n 128 -t 8 --gpu-layers 20
# Смотрим на строчку в выводе:
# "eval time = 1200 ms / 128 runs ( 9.38 ms per token)"
Если видишь меньше 10ms per token на 8B модели — сборка удалась. Если больше 20ms — что-то пошло не так.
Что делать, если ничего не работает
Сначала очисти всё и начни заново:
cd llama.cpp/build
rm -rf * # Удаляем всё из build директории
# Затем снова cmake с правильными флагами
Если не помогает — собери минимальную версию только для CPU:
cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_NATIVE=ON
make -j8
Работает? Значит проблема в драйверах или библиотеках GPU. Не работает? Проверь, установлен ли cmake версии 3.13+ и компилятор C++ (g++ 11+ или clang 12+).
-DLLAMA_NATIVE=ON и без GPU. Получишь рабочую версию, потом добавишь CUDA/Vulkan. Так меньше шансов сломать всё.А что насчет Docker и контейнеров?
Если хочешь запускать llama.cpp в изоляции (или на сервере), посмотри наш гайд по LXC-контейнерам в Proxmox. Кратко: флаги CMake те же самые, но нужно пробросить устройства GPU в контейнер:
# Для Docker с CUDA
docker build -t llama-cpp \
--build-arg CMAKE_ARGS="-DLLAMA_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=89" .
# Для LXC
lxc config device add llama gpu gpu
Неочевидный совет в конце
Собери llama.cpp дважды. Первый раз — с минимальными флагами для стабильности. Второй раз — с агрессивными оптимизациями для скорости. Переименуй бинарники: llama-stable и llama-fast. Используй stable для важных задач, fast — когда нужна максимальная производительность.
И последнее: производительность llama.cpp растёт с каждой версией. Тот флаг, который сегодня даёт +5%, через месяц может давать +15%. Следи за релизами и пересобирай после крупных обновлений. Особенно после изменений в CUDA или Vulkan бэкендах.
Сборка закончена. Теперь твой llama.cpp знает твоё железо лучше, чем ты сам.