Ejecución de dos contenedores LLM simultáneamente#

En esta sección se describe la configuración para ejecutar dos modelos de lenguaje simultáneamente en un servidor con múltiples GPU.

Cuándo es necesario#

Ejecutar dos contenedores LLM es útil cuando:

  • Tiene varias GPU y desea utilizarlas para diferentes modelos
  • Necesita ejecutar diferentes modelos al mismo tiempo (por ejemplo, uno para chat, otro para tareas especializadas)
  • Se requiere distribuir la carga entre varios modelos

Requisitos#

  • Servidor con al menos 2 GPU NVIDIA
  • Cada GPU debe tener suficiente memoria para el modelo seleccionado
  • Docker y Docker Compose instalados
  • NVIDIA Container Toolkit instalado

Configuración#

Paso 1: Verificación de GPU disponibles#

Asegúrese de que tiene al menos 2 GPU:

nvidia-smi

Resultado esperado: Debe ver al menos 2 GPU en la lista.

Paso 2: Descomentar el segundo contenedor LLM#

Abra el archivo docker-compose.yml y busque el bloque comentado aiserver-llm-server2 (aproximadamente líneas 103-142).

Descomente todo el bloque, eliminando los caracteres # al inicio de cada línea:

# Antes:
# aiserver-llm-server2:
#   container_name: aiserver-llm-server2
#   image: aiserver-llm-server:latest
#   ...

# Después:
aiserver-llm-server2:
  container_name: aiserver-llm-server2
  image: aiserver-llm-server:latest
  ...

Paso 3: Configuración de puertos#

Asegúrese de que los puertos no entren en conflicto:

  • aiserver-llm-server (primer contenedor): puerto 3003:8000
  • aiserver-llm-server2 (segundo contenedor): el puerto debe ser diferente, por ejemplo 3006:8000 o 3007:8000

En el bloque comentado, verifique la línea:

ports:
  - 3006:8000  # o otro puerto libre

Paso 4: Configuración de GPU para cada contenedor#

Es importante configurar qué GPU será utilizada por cada contenedor.

Para el primer contenedor (aiserver-llm-server)

Generalmente utiliza la GPU 0 (por defecto). Verifique las variables de entorno en el archivo .env o en el propio docker-compose.yml:

environment:
  LLM_CUDA_VISIBLE_DEVICES: 0  # o no especificar, entonces se utilizará la GPU 0

Para el segundo contenedor (aiserver-llm-server2)

En el bloque descomentado, busque la línea:

environment:
  LLM_CUDA_VISIBLE_DEVICES: 1  # Utiliza la GPU 1

Asegúrese de que el valor corresponda al número de la segunda GPU (generalmente 1 para la segunda GPU).

Paso 5: Configuración de modelos#

Asegúrese de que cada modelo esté configurado correctamente:

Primer contenedor (aiserver-llm-server)

Utiliza la configuración del archivo .env o los valores predeterminados. Verifique la variable:

LLM_COMPLETION_MODEL_NAME=/model-store/nombre-del-modelo-1

Segundo contenedor (aiserver-llm-server2)

En el bloque descomentado, busque la línea:

environment:
  LLM_COMPLETION_MODEL_NAME: "/model-store/Qwen3-30B-A3B-AWQ"

Cámbielo al modelo deseado, si se requiere otro.

Paso 6: Verificación de la configuración#

Antes de ejecutar, verifique la configuración:

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

# Verifique que los puertos no estén ocupados
netstat -tuln | grep -E '3003|3006'

Paso 7: Ejecución de contenedores#

# Detenga los contenedores actuales (si están en ejecución)
docker compose -f docker-compose.yml down

# Inicie todos los contenedores incluyendo el segundo servidor LLM
docker compose -f docker-compose.yml up -d

# Verifique que ambos contenedores estén en ejecución
docker compose -f docker-compose.yml ps | grep llm-server

Resultado esperado: Debe ver dos contenedores:

  • aiserver-llm-server (puerto 3003)
  • aiserver-llm-server2 (puerto 3006)

Paso 8: Verificación de funcionamiento#

# Verifique los registros del primer contenedor
docker logs aiserver-llm-server

# Verifique los registros del segundo contenedor
docker logs aiserver-llm-server2

# Verifique el uso de GPU
nvidia-smi

Resultado esperado:

  • Ambos contenedores deben iniciarse correctamente
  • En nvidia-smi deben verse procesos en diferentes GPU
  • Los registros no deben contener errores críticos

Configuración de variables de entorno#

Si necesita cambiar la configuración del segundo contenedor, edite el bloque environment en docker-compose.yml:

aiserver-llm-server2:
  environment:
    LLM_COMPLETION_MODEL_NAME: "/model-store/su-modelo"
    LLM_CUDA_VISIBLE_DEVICES: 1  # Número de GPU (0, 1, 2, etc.)
    LLM_TENSOR_PARALLEL_SIZE: "1"
    LLM_MAX_MODEL_LEN: "16000"
    LLM_GPU_MEMORY_UTILIZATION: "0.85"
    # ... otras configuraciones

Problemas posibles#

El contenedor no se inicia#

Problema: El segundo contenedor no se inicia o falla con un error.

Solución:

  1. Verifique los registros: docker logs aiserver-llm-server2
  2. Asegúrese de que la GPU esté disponible: nvidia-smi
  3. Verifique que el puerto esté libre: netstat -tuln | grep 3006
  4. Verifique que el modelo exista: ls -la llm-server/models/

Conflicto de puertos#

Problema: Error "el puerto ya está asignado".

Solución:

  • Cambie el puerto del segundo contenedor a uno libre (por ejemplo, 3007:8000)
  • O detenga el servicio que ocupa el puerto

Memoria GPU insuficiente#

Problema: El modelo no se carga, errores de memoria.

Solución:

  • Reduzca LLM_GPU_MEMORY_UTILIZATION (por ejemplo, a 0.7)
  • Utilice modelos de menor tamaño
  • Libere memoria en la GPU deteniendo otros procesos

Ambos contenedores utilizan una GPU#

Problema: Ambos contenedores utilizan la GPU 0 en lugar de diferentes GPU.

Solución:

  • Asegúrese de que LLM_CUDA_VISIBLE_DEVICES esté configurada correctamente para cada contenedor
  • Verifique que la variable no se esté redefiniendo en el archivo .env
  • Reinicie los contenedores después de cambiar la configuración

Ejemplo de configuración completa#

Ejemplo de configuración de dos contenedores en docker-compose.yml:

aiserver-llm-server:
  container_name: aiserver-llm-server
  image: aiserver-llm-server:latest
  restart: always
  env_file:
    - .env
  ports:
    - 3003:8000
  environment:
    LLM_CUDA_VISIBLE_DEVICES: 0  # GPU 0
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: all
            capabilities: [ gpu ]
  volumes:
    - "./llm-server/models:/model-store"
  networks:
    - llm-net

aiserver-llm-server2:
  container_name: aiserver-llm-server2
  image: aiserver-llm-server:latest
  restart: always
  ports:
    - 3006:8000
  environment:
    LLM_COMPLETION_MODEL_NAME: "/model-store/Qwen3-30B-A3B-AWQ"
    LLM_CUDA_VISIBLE_DEVICES: 1  # GPU 1
    LLM_TENSOR_PARALLEL_SIZE: "1"
    LLM_MAX_MODEL_LEN: "16000"
    LLM_GPU_MEMORY_UTILIZATION: "0.85"
  deploy:
    resources:
      reservations:
        devices:
          - driver: nvidia
            count: all
            capabilities: [ gpu ]
  volumes:
    - "./llm-server/models:/model-store"
  networks:
    - llm-net

Configuraciones adicionales#

Uso de diferentes modelos#

Puede ejecutar diferentes modelos en cada contenedor:

# Primer contenedor - modelo para chat
LLM_COMPLETION_MODEL_NAME: "/model-store/Llama-3-8B"

# Segundo contenedor - modelo para código
LLM_COMPLETION_MODEL_NAME: "/model-store/Qwen3-30B-A3B-AWQ"

Configuración de memoria#

Si tiene GPU con diferentes cantidades de memoria, configure el uso de memoria para cada contenedor:

# Para GPU con menor memoria
LLM_GPU_MEMORY_UTILIZATION: "0.7"

# Para GPU con mayor memoria
LLM_GPU_MEMORY_UTILIZATION: "0.9"

Monitoreo#

Para monitorear el funcionamiento de ambos contenedores:

# Estado de los contenedores
docker compose -f docker-compose.yml ps

# Uso de recursos
docker stats aiserver-llm-server aiserver-llm-server2

# Uso de GPU
watch -n 1 nvidia-smi

Resultado esperado: Ambos contenedores deben funcionar de manera estable, utilizando diferentes GPU.