Ejecución del servidor LLM en un servidor separado#

En esta sección se describe la configuración para ejecutar solo el servidor LLM en un servidor separado, sin los demás componentes del Sherpa AI Server.

Cuándo es necesario#

Ejecutar el servidor LLM en un servidor separado es útil cuando:

  • Es necesario distribuir la carga entre servidores
  • El servidor LLM requiere GPU potentes y es mejor trasladarlo a un servidor separado
  • Se requiere escalado: varios servidores LLM para equilibrar la carga
  • Es necesario aislar el servidor LLM de la aplicación principal

Requisitos#

  • Servidor con GPU NVIDIA (CUDA 11.8+)
  • Docker y Docker Compose instalados
  • NVIDIA Container Toolkit instalado
  • Modelos LLM cargados en el directorio llm-server/models/

Configuración#

Paso 1: Preparación del servidor#

Asegúrese de que en el servidor estén instalados todos los componentes necesarios

# Verifique la GPU
nvidia-smi

# Verifique Docker
docker --version
docker compose version

Paso 2: Preparar los archivos y la imagen#

Es necesario crear un directorio de trabajo. Copie el modelo a llm-server/models/ y, si hace falta, las plantillas a llm-server/templates/. Es necesario crear .env como se indica en el paso 4. El archivo de cliente del servidor principal no contiene la imagen Docker de LLM: en un host LLM nuevo, obtenga por separado el archivo de la imagen de la misma versión que el Sherpa AI Server principal y su suma de control. Por ejemplo, para la versión 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

Sin acceso al servidor de descargas, transfiera ambos archivos de la misma versión al host LLM y ejecute los tres últimos comandos. Si falla la suma de control o falta la imagen con la etiqueta necesaria, deténgase y compruebe el conjunto. Establezca APP_VERSION en .env con esa misma versión. No utilice una etiqueta :latest independiente en lugar de la versión verificada.

Paso 3: Configurar Docker Compose#

Es necesario guardar lo siguiente como docker-compose.llm-only.yml en el directorio de trabajo. Inicia un solo contenedor LLM con la etiqueta de imagen verificada. De forma predeterminada, HTTP solo está disponible en 127.0.0.1:3003. Para el acceso directo desde otro servidor, cambie la línea del puerto a "3003:8000" y limite el acceso a 3003 a la dirección del servidor principal. Para HTTPS, mantenga la vinculación local.

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"

Paso 4: Configurar las variables de entorno#

Es necesario crear o edite el archivo .env con la configuración del servidor LLM:

APP_VERSION=2.5.1
# Configuración del servidor 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

Importante:

  • Asegúrese de que la ruta al modelo sea correcta: LLM_COMPLETION_MODEL_NAME=/model-store/nombre-del-modelo

Paso 5: Comprobar la configuración#

Antes de iniciar, verifique la configuración:

docker compose -f docker-compose.llm-only.yml config
# Compruebe que el puerto 3003 esté libre antes de iniciar
ss -ltn '( sport = :3003 )'
ls -la llm-server/models/

Paso 6: Iniciar el servidor LLM#

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

Resultado esperado: Solo debe iniciarse el contenedor aiserver-llm-server.

Paso 7: Verificar el funcionamiento#

# Verifique los registros
docker logs aiserver-llm-server

# Verifique el uso de GPU
nvidia-smi

# Verifique la disponibilidad de la API (debe devolver información sobre el modelo)
curl http://localhost:3003/v1/models

Resultado esperado:

  • El contenedor debe iniciarse correctamente
  • No debe haber errores críticos en los registros
  • La API debe responder a las solicitudes
  • La GPU debe utilizarse para cargar el modelo

Conexión desde otro servidor#

Si el servidor LLM se ejecuta en un servidor separado, configure la conexión desde el servidor principal.

En el servidor principal (HTTP directo)#

Para HTTP directo, primero cambie la línea del puerto en docker-compose.llm-only.yml a "3003:8000" y aplique la configuración con docker compose -f docker-compose.llm-only.yml up -d aiserver-llm-server. Limite las conexiones entrantes a 3003 a la dirección del servidor principal. En el archivo .env del servidor principal, indique la dirección del servidor LLM:

# Dirección del servidor LLM (reemplácelo con la IP o dominio de su servidor LLM)
LLM_MODEL_API_BASE_URL=http://192.168.1.100:3003
# o
LLM_MODEL_API_BASE_URL=http://llm-server.ejemplo.com:3003

Después de cambiar .env, vuelva a crear el contenedor backend con docker compose up -d --force-recreate aiserver. Si utiliza una instancia de modelo independiente, indique también su URL base en la configuración de esa instancia.

Conexión mediante HTTPS#

En el host LLM, instale nginx con el gestor de paquetes de su sistema operativo y coloque fullchain.pem y privkey.pem en el directorio protegido /etc/sherpa/llm-certs/. El certificado debe incluir el nombre DNS del host LLM. El archivo de cliente 2.5.1 no incluye un archivo Docker Compose separado para HTTPS ni una configuración de nginx. Es necesario crear la configuración siguiente en el host LLM. Actúa como proxy del contenedor ya iniciado y no inicia un segundo LLM.

En docker-compose.llm-only.yml, compruebe que el puerto esté vinculado a "127.0.0.1:3003:8000". Si antes expuso HTTP para acceso directo, restaure la vinculación local y aplique el cambio:

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

Es necesario crear /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;
    }
}

Valide la configuración, inicie nginx y limite el acceso a TCP/443 a la dirección del servidor principal:

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

En el servidor principal, establezca la URL correspondiente al nombre del certificado y active la verificación TLS en .env:

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

Si utiliza una autoridad de certificación privada, añada su certificado raíz al almacén de confianza del contenedor backend. Vuelva a crear aiserver y compruebe la conexión sin curl -k:

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

Si LLM_API_KEY está activada, añada un encabezado Authorization: Bearer <clave> a la solicitud de comprobación y configure esa clave en la instancia de modelo de Sherpa AI Server. Después envíe una solicitud de prueba en el chat. LLM_TLS_VERIFY está desactivada de forma predeterminada por compatibilidad con instalaciones antiguas. Es necesario utilizar 1 para HTTPS con un certificado de confianza.

Problemas posibles#

El contenedor no se inicia#

Problema: El contenedor falla inmediatamente después de iniciar.

Solución:

  1. Es necesario verificar los registros: docker logs aiserver-llm-server
  2. Asegúrese de que la GPU esté disponible: nvidia-smi
  3. Es necesario verificar que el modelo exista: ls -la llm-server/models/
  4. Es necesario verificar los permisos de acceso al directorio de modelos

El modelo no se carga#

Problema: Errores al cargar el modelo.

Solución:

  1. Es necesario verificar la ruta al modelo en .env: LLM_COMPLETION_MODEL_NAME
  2. Asegúrese de que el modelo esté cargado: ls -la llm-server/models/
  3. Es necesario verificar los registros en busca de errores de carga: docker logs aiserver-llm-server | grep -i error

Memoria GPU insuficiente#

Problema: El modelo no cabe en la memoria GPU.

Solución:

  • Reduzca LLM_GPU_MEMORY_UTILIZATION en .env
  • Es necesario utilizar la versión cuantizada del modelo (configure LLM_QUANTIZATION=true)
  • Es necesario utilizar un modelo de menor tamaño

El puerto no está disponible externamente#

Problema: No puedo conectarme al servidor LLM desde otro servidor.

Solución:

  1. Es necesario verificar el firewall: sudo ufw status
  2. Es necesario verificar que el puerto esté expuesto: docker port aiserver-llm-server
  3. Es necesario verificar la configuración de red de Docker

Monitoreo#

Para monitorear el funcionamiento del servidor LLM:

# Estado del contenedor
docker ps | grep llm-server

# Uso de recursos
docker stats aiserver-llm-server

# Uso de GPU
watch -n 1 nvidia-smi

# Registros en tiempo real
docker logs -f aiserver-llm-server

# Verificación de la API
curl http://localhost:3003/health
curl http://localhost:3003/v1/models

Optimización del rendimiento#

Para optimizar el rendimiento del servidor LLM:

  1. Configuración de la memoria GPU:

    LLM_GPU_MEMORY_UTILIZATION=0.90  # Utilice la máxima memoria disponible
    
  2. Configuración de batching:

    LLM_MAX_NUM_BATCHED_TOKENS=16384
    LLM_MAX_NUM_SEQS=16
    
  3. Uso de cuantización:

    LLM_QUANTIZATION=true  # Para modelos con soporte de cuantización
    

Después de estos pasos, habrá un solo contenedor LLM en el servidor separado. La API utiliza el puerto 3003 para HTTP directo. Para HTTPS, conéctese a nginx por el puerto 443.