Запуск LLM сервера на отдельном сервере#

В данном разделе описывается настройка для запуска только LLM сервера на отдельном сервере, без остальных компонентов Sherpa AI Server.

Когда это нужно#

Запуск LLM сервера на отдельном сервере полезен когда:

  • Нужно распределить нагрузку между серверами
  • LLM сервер требует мощных GPU и его лучше вынести на отдельный сервер
  • Требуется масштабирование - несколько LLM серверов для балансировки нагрузки
  • Нужно изолировать LLM сервер от основного приложения

Требования#

  • Сервер с GPU NVIDIA (CUDA 11.8+)
  • Docker и Docker Compose установлены
  • NVIDIA Container Toolkit установлен
  • Модели LLM загружены в директорию llm-server/models/

Настройка#

Шаг 1: Подготовка сервера#

Необходимо убедиться, что на сервере установлены все необходимые компоненты

# Проверьте GPU
nvidia-smi

# Проверьте Docker
docker --version
docker compose version

Шаг 2: Подготовка файлов и образа#

Можно создать рабочий каталог, перенесите в него каталог llm-server/models/ с Моделью и, если нужны, шаблоны в llm-server/templates/. Можно создать .env по шагу 4. Архив клиентских файлов основного сервера не содержит Docker-образ LLM: на новом LLM-хосте отдельно получите архив образа той же версии, что и основной Sherpa AI Server, и его контрольную сумму. Например, для версии 2.5.1:

set -e
RELEASE_VERSION=2.5.1
ARCHIVE=aiserver-llm-server_$RELEASE_VERSION.tar.gz
BASE_URL=https://downloads.sherparpa.ru/SherpaAIServer/aiserver-llm-server
curl -fL --retry 3 -o "$ARCHIVE" "$BASE_URL/$ARCHIVE"
curl -fL --retry 3 -o "$ARCHIVE.SHA256SUM" "$BASE_URL/$ARCHIVE.SHA256SUM"
sha256sum -c "$ARCHIVE.SHA256SUM"
docker load -i "$ARCHIVE"
docker image inspect "aiserver-llm-server:$RELEASE_VERSION" >/dev/null

Без доступа к серверу загрузок перенесите на LLM-хост оба файла той же версии и необходимо выполнить последние три команды. Если контрольная сумма не совпала или образ с нужным тегом не появился, остановитесь и необходимо проверить комплект. Необходимо указать эту же версию как APP_VERSION в .env. Не можно использовать независимый тег :latest вместо проверенного релиза.

Шаг 3: Конфигурация Docker Compose#

Необходимо сохранить следующий файл как docker-compose.llm-only.yml в рабочем каталоге. Он запускает один контейнер LLM и использует проверенный тег образа. По умолчанию HTTP доступен только на 127.0.0.1:3003. Для прямого подключения с другого сервера необходимо изменить строку порта на "3003:8000" и ограничьте доступ к 3003 адресом основного сервера. Для HTTPS необходимо оставить локальную привязку.

services:
  aiserver-llm-server:
    container_name: aiserver-llm-server
    image: aiserver-llm-server:${APP_VERSION}
    restart: always
    env_file:
      - .env
    ports:
      - "127.0.0.1:3003:8000"
    ipc: host
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    volumes:
      - "./llm-server/models:/model-store"
      - "./llm-server/templates:/model-templates"

Шаг 4: Настройка переменных окружения#

Можно создать или отредактируйте файл .env с настройками LLM сервера:

APP_VERSION=2.5.1
# Настройки LLM сервера
LLM_CUDA_VISIBLE_DEVICES=0
LLM_TENSOR_PARALLEL_SIZE=1
LLM_GPU_MEMORY_UTILIZATION=0.90
LLM_COMPLETION_MODEL_NAME=/model-store/meta-llama/Meta-Llama-3-8B-Instruct
LLM_DTYPE=auto
LLM_TRUST_REMOTE_CODE=false
LLM_QUANTIZATION=false
LLM_MAX_MODEL_LEN=8192
LLM_HOST=0.0.0.0
LLM_PORT=8000
LLM_MAX_NUM_BATCHED_TOKENS=16384
LLM_MAX_NUM_SEQS=16
LLM_ENABLE_TOOLS=true
LLM_TOOL_CALL_PARSER=llama3_json
LLM_EXCLUDE_TOOLS_WHEN_NONE=true

Важно:

  • Необходимо убедиться что путь к Модели правильный: LLM_COMPLETION_MODEL_NAME=/model-store/название-модели

Шаг 5: Проверка конфигурации#

Перед запуском необходимо проверить конфигурацию:

docker compose -f docker-compose.llm-only.yml config
# Перед запуском проверьте, что порт 3003 свободен
ss -ltn '( sport = :3003 )'
ls -la llm-server/models/

Шаг 6: Запуск LLM сервера#

docker compose -f docker-compose.llm-only.yml up -d aiserver-llm-server
docker compose -f docker-compose.llm-only.yml ps

Ожидаемый результат: Должен запуститься только контейнер aiserver-llm-server.

Шаг 7: Проверка работы#

# Проверьте логи
docker logs aiserver-llm-server

# Проверьте использование GPU
nvidia-smi

# Проверьте доступность API (должен вернуть информацию о модели)
curl http://localhost:3003/v1/models

Ожидаемый результат:

  • Контейнер должен успешно запуститься
  • В логах не должно быть критических ошибок
  • API должен отвечать на запросы
  • GPU должна использоваться для загрузки Модели

Подключение с другого сервера#

Если LLM сервер запущен на отдельном сервере, необходимо настроить подключение с основного сервера.

На основном сервере (прямой HTTP)#

Для прямого HTTP-доступа сначала необходимо изменить строку порта в docker-compose.llm-only.yml на "3003:8000" и необходимо применить конфигурацию командой docker compose -f docker-compose.llm-only.yml up -d aiserver-llm-server. Ограничьте входящие соединения к 3003 адресом основного сервера. В файле .env основного сервера необходимо указать адрес LLM сервера:

# Адрес LLM сервера (замените на IP или домен вашего LLM сервера)
LLM_MODEL_API_BASE_URL=http://192.168.1.100:3003
# или
LLM_MODEL_API_BASE_URL=http://llm-server.example.com:3003

После изменения .env необходимо пересоздать backend-контейнер командой docker compose up -d --force-recreate aiserver. Для отдельного инстанса Модели также необходимо указать его base URL в настройках инстанса.

Подключение через HTTPS#

На LLM-хосте необходимо установить nginx из пакетов вашей ОС и необходимо разместить fullchain.pem и privkey.pem в защищенном каталоге /etc/sherpa/llm-certs/. Сертификат должен включать DNS-имя LLM-хоста. В клиентском архиве 2.5.1 нет отдельного файла Docker Compose для HTTPS и конфигурации nginx, поэтому можно создать конфигурацию ниже на самом LLM-хосте. Она проксирует запросы к уже запущенному контейнеру и не запускает второй LLM.

В docker-compose.llm-only.yml необходимо убедиться, что порт привязан к "127.0.0.1:3003:8000". Если вы раньше открывали HTTP-порт для прямого подключения, необходимо восстановить локальную привязку и необходимо применить изменение:

docker compose -f docker-compose.llm-only.yml up -d aiserver-llm-server
docker compose -f docker-compose.llm-only.yml ps

Можно создать файл /etc/nginx/conf.d/llm-server.conf:

server {
    listen 443 ssl;
    server_name llm-server.example.com;
    ssl_certificate /etc/sherpa/llm-certs/fullchain.pem;
    ssl_certificate_key /etc/sherpa/llm-certs/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    client_max_body_size 500m;

    location / {
        proxy_pass http://127.0.0.1:3003;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_read_timeout 600s;
        proxy_buffering off;
    }
}

Необходимо проверить конфигурацию, необходимо запустить nginx и ограничьте доступ к TCP/443 адресом основного сервера:

sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx

На основном сервере необходимо указать URL по имени из сертификата и включите проверку TLS в .env:

LLM_MODEL_API_BASE_URL=https://llm-server.example.com
LLM_TLS_VERIFY=1

Если используется собственный центр сертификации, необходимо установить его корневой сертификат в доверенное хранилище backend-контейнера. Необходимо пересоздать контейнер aiserver, затем необходимо проверить соединение без curl -k:

docker compose up -d --force-recreate aiserver
curl -fsS https://llm-server.example.com/v1/models

При включенном LLM_API_KEY можно добавить к проверочному запросу заголовок Authorization: Bearer <ключ> и необходимо задать этот ключ для инстанса Модели в Sherpa AI Server. После проверки можно отправить тестовый запрос в Чат. LLM_TLS_VERIFY по умолчанию выключен для совместимости со старыми установками. Для HTTPS-подключения с доверенным сертификатом можно использовать значение 1.

Возможные проблемы#

Контейнер не запускается#

Проблема: Контейнер падает сразу после запуска.

Решение:

  1. Необходимо проверить логи: docker logs aiserver-llm-server
  2. Необходимо убедиться что GPU доступна: nvidia-smi
  3. Необходимо проверить что Модель существует: ls -la llm-server/models/
  4. Необходимо проверить права доступа к директории Моделей

Модель не загружается#

Проблема: Ошибки при загрузке Модели.

Решение:

  1. Необходимо проверить путь к Модели в .env: LLM_COMPLETION_MODEL_NAME
  2. Необходимо убедиться что Модель загружена: ls -la llm-server/models/
  3. Необходимо проверить логи на ошибки загрузки: docker logs aiserver-llm-server | grep -i error

Недостаточно памяти GPU#

Проблема: Модель не помещается в память GPU.

Решение:

  • Необходимо уменьшить LLM_GPU_MEMORY_UTILIZATION в .env
  • Можно использовать квантованную версию Модели (необходимо установить LLM_QUANTIZATION=true)
  • Можно использовать Модель меньшего размера

Порт недоступен извне#

Проблема: Не могу подключиться к LLM серверу с другого сервера.

Решение:

  1. Необходимо проверить firewall: sudo ufw status
  2. Необходимо проверить что порт проброшен: docker port aiserver-llm-server
  3. Необходимо проверить сетевые настройки Docker

Мониторинг#

Для мониторинга работы LLM сервера:

# Статус контейнера
docker ps | grep llm-server

# Использование ресурсов
docker stats aiserver-llm-server

# Использование GPU
watch -n 1 nvidia-smi

# Логи в реальном времени
docker logs -f aiserver-llm-server

# Проверка API
curl http://localhost:3003/health
curl http://localhost:3003/v1/models

Оптимизация производительности#

Для оптимизации производительности LLM сервера:

  1. Настройка памяти GPU:

    LLM_GPU_MEMORY_UTILIZATION=0.90  # Можно использовать максимум доступной памяти
    
  2. Настройка батчинга:

    LLM_MAX_NUM_BATCHED_TOKENS=16384
    LLM_MAX_NUM_SEQS=16
    
  3. Использование квантования:

    LLM_QUANTIZATION=true  # Для Моделей с поддержкой квантования
    

После выполнения всех шагов на отдельном сервере работает один контейнер LLM. При прямом HTTP-подключении API доступен на порту 3003. При HTTPS-подключении обращайтесь к nginx на порту 443.