llama-server (llama.cpp): сборка, запуск, настройка

Использованные материалы

Git: https://github.com/ggml-org/llama.cpp/tree/master/tools/server
Параграф Systemd Services из статьи Self-host LLMs in production with llama.cpp llama-server.

Важно

Все указанные в статье IP-адреса, это адреса моей домашней сети, менять на актуальные для себя по необходимости.

Установка CUDA Toolkit

sudo apt update
sudo apt install cmake curl libcurl4-openssl-dev
sudo apt install cuda-toolkit
sudo apt install nvidia-gds 
# перезагрузка обязательна
sudo reboot

Сборка llama-server

На момент написания статьи № последней сборки b8935. Создадим каталог для текущей версии и сделаем сборку в него.

cd /srv
sudo git clone https://github.com/ggml-org/llama.cpp.git
sudo mkdir -p llama.cpp/builds/b8935
sudo chown -R :andrey llama.cpp
sudo chmod -R g+w llama.cpp
cd llama.cpp
git config --global --add safe.directory /srv/llama.cpp
cmake -B builds/b8935 -DGGML_CUDA=ON
cmake --build builds/b8935 --config Release -j8
Сборка длится около двух часов (с флагом -j8) на Jetson Orin NX 16 GB (флаг -j8 задействует все 8 ядер девайса, без флага используется только одно ядро).

Продвинутая сборка

Можно поэкспериментировать с параметрами сборки для оптимазации сервера.
Для начала надо узнать архитектуру своей модели, выполнив команду:

nvidia-smi --query-gpu=compute_cap --format=csv
На моей модели вывод такой:
compute_cap
8.7
флаг для CMake будет такой: CMAKE_CUDA_ARCHITECTURES="87"

Полная команда настройки конфигурации будет примерно такая:

cmake -B builds/b8935 \
  -DGGML_CUDA=ON \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_CUDA_ARCHITECTURES="87" \  # архитектура системы
  -DGGML_CUDA_FORCE_CUBLAS=1 \ # Принудительно использовать FP16 cuBLAS вместо пользовательских ядер для матричного умножения в квантованных моделях 
  -DGGML_CUDA_FORCE_CUBLAS_COMPUTE_16F=1 \ # принудительно использовать тип вычислений FP16 (вместо стандартного FP32)
  -DGGML_CUDA_ENABLE_UNIFIED_MEMORY=1 \ # позволяет использовать RAM вместо того, чтобы аварийно завершать работу при исчерпании видеопамяти графического процессора
  -DGGML_CUDA_FA_ALL_QUANTS=1 \ # поддержка всех типов (комбинаций) квантования кэша KV для ядер FlashAttention CUDA, даёт более детальный контроль над размером кэша KV
  -DCUDA_SCALE_LAUNCH_QUEUES=4 # повышает скорость обработки запросов, увеличвая размер командного буфера CUDA в 4 раза по сравнению с его значением по умолчанию

Проверить реально доступные cmake-опции:

cmake -B builds/b8935 -LH 2>/dev/null | grep -i cuda

И команда сборки:

cmake --build builds/b8935 --config Release -j8

После сборки все бинарники находятся в папке llama.cpp/builds/b8935/bin.
Для удобства можно создать мягкую ссылку на этот каталог:

ln -s /srv/llama.cpp/builds/b8935 build
В дальнейшем для обновления версии достаточно будет обновить репозиторий (cd /srv/llama.cpp, git pull), создать каталог для новой версии (mkdir -p builds/bNNNN) и произвести сборку в новый каталог:
cmake -B builds/bNNNN -DGGML_CUDA=ON
cmake --build builds/bNNNN --config Release
и изменить ссылку на него:
ln -sf /srv/llama.cpp/builds/bNNNN build

Пробный запуск

/srv/llama.cpp/build/bin/llama-server --ctx-size 4096 --host 0.0.0.0 --port 8080 --n-gpu-layers 99 --flash-attn on --model /srv/models/Meta-Llama-3.1-8B-Instruct-Q6_K.gguf
Более - менее оптимизированный запуск:
/srv/llama.cpp/build/bin/llama-server --host 0.0.0.0 --port 8080 --ctx-size 8192 --n-gpu-layers 99 --flash-attn on --parallel 4 --jinja --model /srv/models/prog/DeepSeek-Coder-V2-Lite-Instruct-Q5_K_M.gguf
--jinja нужен для совместимости с Codex.

Чат ожидает вопросов по адресу http://192.168.168.15:8080.

Тестирование

В браузере заходим по адресу http://192.168.168.15:8080 и пробуем общаться. Работает, но медленно. Нужны оптимальный выбор LLM модели для устройства и подбор правильных параметров запуска llama-server.

Интерфейсы

Настройка

README.md
llama.cpp guide - Running LLMs locally, on any hardware, from scratch