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.