Использованные материалы
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_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