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 Blackwell 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