Logo IES Simarro
PP1-Simarro Centro de excelencia en IA y BD

Manual Single-Spark

Guía técnica para la configuración de un nodo NVIDIA DGX Spark independiente.

Build Personalizada para Docker

Configuración optimizada para vLLM en el hardware Grace-Hopper de la DGX Spark.

Bash
# Activa BuildKit para paralelismo y caché
export DOCKER_BUILDKIT=1

docker build . \
  -f docker/Dockerfile \
  --target vllm-openai \
  # Plataforma nativa de la DGX Spark (CPU Grace es ARM)
  --platform linux/arm64 \
  \
  # --- BLOQUE CUDA 13 ---
  --build-arg CUDA_VERSION=13.0.1 \
  --build-arg BUILD_BASE_IMAGE=nvidia/cuda:13.0.1-devel-ubuntu22.04 \
  \
  # --- BLOQUE ARQUITECTURA (CRÍTICO) ---
  # Apuntamos SOLO a sm_121 para reducir tiempo de compilación y tamaño.
  # Eliminamos compatibilidad con arquitecturas antiguas (Ampere/Hopper).
  --build-arg torch_cuda_arch_list="12.1" \
  \
  # --- OPTIMIZACIÓN DE BUILD ---
  # Usa los 20 cores de la CPU Grace para compilar (por defecto docker usa menos)
  --build-arg MAX_JOBS=20 \
  # Saltamos chequeos de integridad de wheels para ganar velocidad
  --build-arg RUN_WHEEL_CHECK=false \
  # Importante: vLLM suele necesitar definir esto explícitamente en builds custom
  --build-arg VLLM_TARGET_DEVICE=cuda \
  \
  -t vllm/vllm-openai:gb10-cu13-sm121

Despliegue con Docker Compose

Orquestación de vLLM y Open WebUI para una interfaz de chat completa.

docker-compose.yml
version: "3.8"

services:
  vllm:
    image: vllm/vllm-openai:gb10-cu13-sm121
    container_name: vllm_server
    restart: unless-stopped
    # IPC host es preferible a shm_size para PyTorch/NCCL
    ipc: host
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all # Usa todas las GPUs disponibles
              capabilities: [gpu]
    environment:
      - HF_TOKEN=${HF_TOKEN}
      # Optimización para evitar fragmentación de memoria en cargas altas
      - PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
      - VLLM_USE_FLASHINFER_MOE_FP8=1
      - VLLM_FLASHINFER_MOE_BACKEND=latency
      # - VLLM_ATTENTION_BACKEND=FLASH_ATTN # Descomentar si hay problemas con xformers/flashinfer
      # Forzar descarga a directorio persistente
      - HF_HOME=/root/.cache/huggingface
    volumes:
      - ${HOME}/.cache/huggingface:/root/.cache/huggingface
    command:
      - "Qwen/Qwen3-Next-80B-A3B-Instruct-FP8"
      - "--served-model-name=qwen3-next-80b-fp8"
      # Inferencia y Hardware
      - "--quantization=fp8"
      - "--dtype=bfloat16"
      - "--kv-cache-dtype=fp8"
      # Optimización de Memoria
      - "--gpu-memory-utilization=0.90" # Bajado ligeramente para dar espacio al Prefix Caching
      - "--max-model-len=8192"
      - "--max-num-seqs=64" # Aumentado ligeramente para aprovechar mejor el batching
      # Optimización de Rendimiento (NUEVO)
      - "--enable-prefix-caching" # VITAL para chat/historial
      - "--enable-chunked-prefill" # Mejora latencia en prompts largos
      # Red
      - "--host=0.0.0.0"
      - "--port=8000"
      # Si tienes múltiples GPUs, define el paralelismo explícitamente si vLLM falla al detectarlo
      # - "--tensor-parallel-size=2"
    ports:
      - "8000:8000"
    healthcheck:
      # Comprueba si el modelo responde antes de levantar el WebUI
      test: ["CMD-SHELL", "curl -f http://localhost:8000/health || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 30 # Modelos grandes (80B) tardan en cargar, damos margen
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open_webui
    restart: unless-stopped
    depends_on:
      vllm:
        condition: service_healthy # Espera a que vLLM esté OK
    environment:
      - OPENAI_API_BASE_URL=http://vllm:8000/v1
      - OPENAI_API_KEY=sk-no-key-required
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-cambiar-esta-clave-secreta}
      - ENABLE_OLLAMA_API=false
      # Optimización WebUI
      - GLOBAL_LOG_LEVEL=info
    ports:
      - "3000:8080"
    volumes:
      - open-webui:/app/backend/data
    extra_hosts:
      - "host.docker.internal:host-gateway" # Útil si necesitas conectar servicios del host

volumes:
  open-webui:

Sección en Construcción

Estamos adaptando la documentación específica para entornos de un solo nodo. Por ahora, puedes consultar los prerrequisitos básicos en el manual Dual-Spark.

Volver a Spark Manual Dual-Spark