Данный проект основан на llama.cpp и компилирует только RPC-сервер, а так же вспомогательные утилиты, работающие в режиме RPC-клиента, необходимые для реализации распределённого инференса конвертированных в GGUF формат Больших Языковых Моделей (БЯМ) и Эмбеддинговых Моделей.
Образы evilfreelancer/llama.cpp-rpc на Docker Hub.
В общем виде схема приложения с использованием RPC-сервера имеет следующий вид:
Вместо llama-server
можно использовать llama-cli
или llama-embedding
, они идут в стандартной поставке контейнера.
Docker-образы собираются с поддержкой следующих архитектур:
- CPU-only - amd64
- CUDA - amd64
К сожалению сборка под архитектуры arm64 и arm/v7 падает с ошибкой, поэтому они временно отключены.
Имя | Дефолт | Описание |
---|---|---|
APP_MODE | backend | Режим работы контейнера, доступные варианты: server , backend и none |
APP_BIND | 0.0.0.0 | Интерфейс на который происходит биндинг |
APP_PORT | у server это 8080 , у backend это 50052 |
Номер порта на котором запускается сервер |
APP_MEM | 1024 | Количество Мб оперативной памяти доступной клиенту, в режиме CUDA это количество оперативной памяти видеокарты |
APP_RPC_BACKENDS | backend-cuda:50052,backend-cpu:50052 | Разделённые запятой адреса бэкендов к которым будет пытаться подключиться контейнер в режиме server |
APP_MODEL | /app/models/TinyLlama-1.1B-q4_0.gguf | Путь к весам модели внутри контейнера |
APP_REPEAT_PENALTY | 1.0 | Пенальти повторов |
APP_GPU_LAYERS | 99 | Количество слоёв выгружаемых на бэкенд |
В данном примере происходит запуск llama-server
(контейнер main
) и инициализация
модели TinyLlama-1.1B-q4_0.gguf,
которая была заранее загружена в директорию ./models
, расположенную на одном уровне с docker-compose.yml
. Директория
./models
в свою очередь монтируется внутрь контейнера main
и доступна по пути /app/models
.
version: "3.9"
services:
main:
image: evilfreelancer/llama.cpp-rpc:latest
restart: unless-stopped
volumes:
- ./models:/app/models
environment:
# Режим работы (RPC-клиент в формате API-сервера)
APP_MODE: server
# Путь до весов, предварительно загруженной модели, внутри контейнера
APP_MODEL: /app/models/TinyLlama-1.1B-q4_0.gguf
# Адреса RPC-серверов с которыми будет взаимодействовать клиент
APP_RPC_BACKENDS: backend-cuda:50052,backend-cpu:50052
ports:
- "127.0.0.1:8080:8080"
backend-cpu:
image: evilfreelancer/llama.cpp-rpc:latest
restart: unless-stopped
environment:
# Режим работы (RPC-сервер)
APP_MODE: backend
# Количество доступной RPC-серверу системной оперативной памяти (в Мегабайтах)
APP_MEM: 2048
backend-cuda:
image: evilfreelancer/llama.cpp-rpc:latest-cuda
restart: "unless-stopped"
environment:
# Режим работы (RPC-сервер)
APP_MODE: backend
# Количество доступной RPC-серверу оперативной памяти видеокарты (в Мегабайтах)
APP_MEM: 1024
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [ gpu ]
Полный пример в docker-compose.dist.yml.
В результате чего у нас получается следующего вида схема:
После её запуска можно будет делать такого вида HTTP запросы:
curl \
--request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "Building a website can be done in 10 simple steps:"}'
Сборка контейнеров в режиме CPU-only:
docker build ./llama.cpp/
Сборка контейнера под CUDA:
docker build ./llama.cpp/ --file ./llama.cpp/Dockerfile.cuda
При помощи аргумента сборки LLAMACPP_VERSION
можно указать версию тега, название ветки или хеш коммита из которого
требуется выполнить сборку контейнера, по умолчанию в контейнере указана ветка master
.
# Собрать контейнер из тега https://github.com/ggerganov/llama.cpp/releases/tag/b3700
docker build ./llama.cpp/ --build-arg LLAMACPP_VERSION=b5480
# Собрать контейнер из ветки master
docker build ./llama.cpp/ --build-arg LLAMACPP_VERSION=master
# или просто
docker build ./llama.cpp/
Пример docker-compose.yml
который выполняет сборку образа с явным указанием тега.
version: "3.9"
services:
main:
restart: "unless-stopped"
build:
context: ./llama.cpp
args:
- LLAMACPP_VERSION=b5480
volumes:
- ./models:/app/models
environment:
APP_MODE: none
ports:
- "8080:8080"
backend:
restart: "unless-stopped"
build:
context: ./llama.cpp
args:
- LLAMACPP_VERSION=b5480
environment:
APP_MODE: backend
ports:
- "50052:50052"
- ggml-org/ggml#761
- ggml-org/llama.cpp#7293
- ggml-org/llama.cpp#6829
- https://github.com/ggerganov/llama.cpp/tree/master/examples/rpc
- https://github.com/mudler/LocalAI/commit/fdb45153fed10d8a2c775633e952fdf02de60461
- mudler/LocalAI#2324
- ollama/ollama#4643
Этот проект лицензирован на условиях лицензии MIT. Подробности в файле LICENSE.
Если вы используете этот проект в своих исследованиях или работе, пожалуйста, укажите ссылку на него следующим образом:
[Pavel Rykov]. (2024). llama.cpp RPC-server in Docker. GitHub. https://github.com/EvilFreelancer/docker-llama.cpp-rpc
Альтернатива в формате BibTeX:
@misc{pavelrykov2024llamacpprpc,
author = {Pavel Rykov},
title = {llama.cpp RPC-server in Docker},
year = {2024},
url = {https://github.com/EvilFreelancer/docker-llama.cpp-rpc}
}