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: Preparación de archivos#

Copie en el servidor los siguientes archivos y directorios:

# Archivos necesarios:
# - docker-compose.yml (o docker-compose.main.yml)
# - archivo .env con configuraciones
# - llm-server/models/ - directorio con modelos
# - llm-server/templates/ - directorio con plantillas (si se utiliza)

Paso 3: Comentando servicios innecesarios#

Abra el archivo docker-compose.yml y comente todos los servicios excepto aiserver-llm-server.

Ejemplo: Servicios comentados

services:

  # aiserver-pg:
  #   container_name: aiserver-pg
  #   image: aiserver-pg:latest
  #   ...

  # aiserver-embed:
  #   container_name: aiserver-embed
  #   ...

  # aiserver:
  #   container_name: aiserver
  #   ...

  # Único servicio activo:
  aiserver-llm-server:
    container_name: aiserver-llm-server
    image: aiserver-llm-server:latest
    restart: always
    env_file:
      - .env
    ports:
      - 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"
    networks:
      - llm-net

  # aiserver-code_interpreter:
  #   ...

  # aiserver-whisper:
  #   ...

  # aiserver-bge_reranker:
  #   ...

Paso 5: Configuración de variables de entorno#

Cree o edite el archivo .env con la configuración del servidor LLM:

# 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 6: Verificación de la configuración#

Antes de iniciar, verifique la configuración:

# Verifique la sintaxis del archivo docker-compose
docker compose -f docker-compose.yml config

# Verifique que el puerto esté libre
netstat -tuln | grep 3003

# Verifique la existencia del modelo
ls -la llm-server/models/

Paso 7: Ejecución del servidor LLM#

# Inicie solo el servidor LLM
docker compose -f docker-compose.yml up -d aiserver-llm-server

# O inicie todo (pero solo se iniciarán los servicios no comentados)
docker compose -f docker-compose.yml up -d

# Verifique el estado
docker compose -f docker-compose.yml ps

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

Paso 8: Verificación del 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#

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_SERVER_URL=http://192.168.1.100:3003
# o
LLM_SERVER_URL=http://llm-server.ejemplo.com:3003

Configuración mínima de docker-compose#

Ejemplo de un docker-compose.yml mínimo solo para el servidor LLM:

services:
  aiserver-llm-server:
    container_name: aiserver-llm-server
    image: aiserver-llm-server:latest
    restart: always
    env_file:
      - .env
    ports:
      - "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"
    networks:
      - llm-net

networks:
  llm-net:
    name: llm-net
    driver: bridge

Guarde este archivo como docker-compose.llm-only.yml y utilice:

docker compose -f docker-compose.llm-only.yml up -d

Problemas posibles#

El contenedor no se inicia#

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

Solución:

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

El modelo no se carga#

Problema: Errores al cargar el modelo.

Solución:

  1. Verifique 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. Verifique 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
  • Utilice la versión cuantizada del modelo (configure LLM_QUANTIZATION=true)
  • Utilice 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. Verifique el firewall: sudo ufw status
  2. Verifique que el puerto esté expuesto: docker port aiserver-llm-server
  3. Verifique 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 completar todos los pasos, debe tener el servidor LLM ejecutándose solo en un servidor separado, que se puede utilizar desde el servidor principal o desde otras aplicaciones a través de la API en el puerto 3003.