Saltar al contenido principal
Las configuraciones personalizadas pueden causar mal funcionamiento del sistema. Realiza pruebas exhaustivas antes del despliegue.

Cuándo Usar Configuraciones Personalizadas

Considera la personalización avanzada cuando:
  • Tienes modelos fine-tuned optimizados para dominios o tareas específicas
  • Necesitas parámetros de muestreo diferentes a los valores por defecto del preset
  • Quieres ejecutar múltiples modelos especializados simultáneamente (ej., uno para visión, uno para texto, uno para razonamiento)
  • Requieres modelos de familias de modelos alternativas no incluidas en los presets estándar
Antes de proceder, asegúrate de:
  • Entender los principios de gestión de memoria GPU
  • Tener acceso a repositorios de modelos HuggingFace compatibles
  • Conocer las limitaciones de tu hardware
  • Tener un entorno de prueba para validación

Familias de Modelos Soportadas

Zylon admite estas familias de modelos para configuraciones personalizadas:
Familia de ModeloRepositorio de EjemploCasos de Uso
Qwen 3Qwen/Qwen3-14BPropósito general (por defecto)
Mistral Smallmistralai/Mistral-Small-24B-Instruct-2501Generación de texto de alta calidad
Gemma 3google/gemma-3-12b-itInferencia eficiente
Gemma 3ngoogle/gemma-3n-E4B-itModelos pequeños optimizados
GPT-OSSopenai/gpt-oss-20bArquitectura alternativa
Solo los modelos de estas familias están oficialmente soportados. Usar familias no soportadas puede resultar en inestabilidad del sistema.

Entendiendo la Estructura de Configuración

Todas las configuraciones personalizadas siguen este patrón:
ai:
  preset: "<base-preset>"           # Comienza con un preset base
  numGPUs: <number>                 # Opcional: para configuraciones multi-GPU
  config:
    models:
      - id: llm                      # Obligatorio: modelo de lenguaje principal
        # ... configuración
      - id: embed                    # Obligatorio: modelo de embeddings
        # ... configuración
      - id: <custom-id>              # Opcional: modelos adicionales
        # ... configuración
Principios clave:
  • Cada configuración debe incluir modelos llm y embed
  • Cada modelo necesita un id único
  • La memoria GPU debe gestionarse manualmente al agregar/eliminar modelos

Caso de Uso 1: Personalizar Modelos Existentes

Objetivo: Modificar los modelos por defecto del preset sin agregar nuevos. Esto es útil para usar versiones fine-tuned de modelos existentes o ajustar parámetros de inferencia.

Cuándo Usar Este Enfoque

  • Intercambiar el modelo por defecto por una versión fine-tuned (ej., Qwen3-14B-Medical en lugar de Qwen3-14B)
  • Cambiar parámetros de muestreo (temperature, max tokens, etc.) para un comportamiento diferente
  • Usar un modelo de embeddings diferente para búsqueda semántica mejorada
  • Ajustar el tamaño de la ventana de contexto según tu caso de uso

Cómo Funciona

Como no estás agregando modelos, no necesitas preocuparte por la reasignación de memoria. Simplemente especifica los cambios del modelo en la sección config, y el preset maneja la asignación de memoria automáticamente.

Esquema de Configuración

ai:
  preset: "<preset>"
  config:
    models:
      - id: llm | embed                    # Qué modelo personalizar
        modelRepo: string                  # Ruta del modelo HuggingFace
        tokenizer: string                  # Opcional: ruta del tokenizer (solo LLMs)
        promptStyle: string                # Opcional: qwen, mistral, gemma, gpt-oss
        contextWindow: integer             # Opcional: longitud máxima de contexto
        samplingParams:                    # Opcional: parámetros de inferencia
          temperature: float (0.0-2.0)
          maxTokens: integer (1-8192)
          topP: float (0.0-1.0)
          # ... otros parámetros de muestreo

Ejemplos

Ejemplo 1: Usar un Modelo Fine-Tuned

Reemplaza el modelo por defecto con tu versión fine-tuned específica del dominio:
ai:
  preset: "baseline-24g"
  config:
    models:
      - id: llm
        modelRepo: "your-org/qwen3-14b-medical-finetuned"
        tokenizer: "Qwen/Qwen3-14B-Instruct"  # Usa el tokenizer original

Ejemplo 2: Ajustar Parámetros de Muestreo

Modifica el comportamiento de inferencia sin cambiar el modelo:
ai:
  preset: "baseline-48g"
  config:
    models:
      - id: llm
        samplingParams:
          temperature: 0.3        # Más determinista
          maxTokens: 2048         # Respuestas más cortas
          topP: 0.85              # Muestreo enfocado
          repetitionPenalty: 1.3  # Reducir repetición

Ejemplo 3: Usar Familia de Modelo Alternativa

Cambia a una familia de modelo diferente manteniendo la misma huella de memoria:
ai:
  preset: "experimental.gpt-oss-24g"
  config:
    models:
      - id: llm
        modelRepo: "your-org/gpt-oss-20b-finetuned"
        tokenizer: "openai/gpt-oss-20b"
        promptStyle: gpt-oss

Ejemplo 4: Modelo de Embeddings Personalizado

Usa embeddings especializados para búsqueda semántica específica del dominio:
ai:
  preset: "baseline-48g"
  config:
    models:
      - id: embed
        modelRepo: "your-org/legal-embeddings-v1"
        vectorDim: 1024

Caso de Uso 2: Agregar Nuevos Modelos

Objetivo: Ejecutar múltiples modelos especializados simultáneamente. Esto es más complejo porque debes gestionar manualmente la asignación de memoria GPU en todos los modelos.

Cuándo Usar Este Enfoque

  • Ejecutar un modelo de visión junto con tu modelo de texto principal
  • Usar modelos diferentes para diferentes tareas (ej., modelo de razonamiento + modelo de respuesta rápida)
  • Crear pipelines especializados que requieren múltiples tipos de modelos
  • Construir sistemas multi-modales que procesan texto, imágenes, audio y otros tipos de datos

Entendiendo la Gestión de Memoria GPU

El concepto crítico: La memoria GPU es un recurso fijo que debe dividirse manualmente entre todos los modelos. Cada modelo usa una fracción de la memoria GPU total, controlada por gpuMemoryUtilization (un valor entre 0.0 y 1.0). La suma de todas las asignaciones de memoria de los modelos no puede exceder 0.95 (reservando 5% para sobrecarga del sistema). Asignación por defecto para baseline-24g:
llm:   0.85  (85% de 24GB = ~20.4GB)
embed: 0.10  (10% de 24GB = ~2.4GB)
─────────────
Total: 0.95  (con 0.05 reservado para el sistema)
Para agregar un nuevo modelo, debes:
  1. Reducir las asignaciones de los modelos existentes para liberar memoria
  2. Asignar la memoria liberada al nuevo modelo
  3. Ajustar las ventanas de contexto si la memoria se reduce significativamente

Entendiendo KV Cache

Para entender por qué la asignación de memoria afecta las ventanas de contexto, necesitas saber sobre KV Cache. ¿Qué es KV Cache? Durante la inferencia, los modelos de lenguaje almacenan cálculos intermedios (Keys y Values) para cada token que procesan. Esto se llama KV Cache, y es lo que permite a los modelos mantener el contexto a través de una conversación o documento sin recalcular todo desde cero. El KV Cache crece con:
  • Longitud del contexto: Más tokens en contexto = más almacenamiento de caché necesario
  • Tamaño del modelo: Modelos más grandes requieren más caché por token
  • Tamaño del lote: Procesar múltiples solicitudes simultáneamente multiplica los requisitos de caché
Desglose de asignación de memoria: Cuando asignas memoria GPU a un modelo, esa memoria se divide entre:
  1. Pesos del modelo: Los parámetros del modelo (tamaño fijo, ~2 bytes por parámetro para FP16)
  2. KV Cache: Almacenamiento para tokens de contexto (crece con la longitud del contexto)
  3. Memoria de activación: Espacio de cálculo temporal durante la inferencia
Ejemplo para un modelo de 14B parámetros:
Asignación completa (0.85 en 24GB = 20.4GB):
├─ Pesos del modelo: ~14GB (cuantizado; el tamaño FP32 original sería ~28GB)
├─ KV Cache: ~5GB (soporta contexto de 16k)
└─ Activaciones: ~1.4GB

Asignación reducida (0.50 en 24GB = 12GB):
├─ Pesos del modelo: ~14GB (igual, pero más ajustado)
├─ KV Cache: ~2GB (ahora solo soporta contexto de 8k)
└─ Activaciones: margen mínimo
Por qué esto importa: Si reduces la asignación total de memoria de 0.85 a 0.50, los pesos del modelo aún necesitan el mismo espacio, pero tienes significativamente menos espacio para KV Cache. Esto significa que debes reducir el parámetro contextWindow proporcionalmente para evitar errores de falta de memoria durante la inferencia. Asignaciones de KV Cache por defecto de baseline:
PresetAsignación de MemoriaVentana de ContextoKV Cache Aprox
baseline-24g/48g0.8516384 (16k)~4-6GB
baseline-96g0.8532768 (32k)~8-12GB
Establecer contextWindow demasiado alto para la memoria asignada causará errores de falta de memoria durante la inferencia, especialmente durante conversaciones largas o al procesar documentos grandes. Los errores típicamente aparecen como “CUDA out of memory” en los logs de Triton.

Proceso Paso a Paso

Paso 1: Conoce tu Memoria GPU

Primero, identifica tu memoria GPU total disponible:
nvidia-smi
Configuraciones comunes:
  • 24GB: RTX 4090, L4
  • 48GB: RTX A6000, L40, L40s
  • 80-96GB: A100, H100
Reserva 5% para sobrecarga del sistema, dejando 95% para modelos:
  • 24GB → 22.8GB utilizables
  • 48GB → 45.6GB utilizables
  • 96GB → 91.2GB utilizables

Paso 2: Calcula los Requisitos de Memoria del Modelo

La memoria del modelo depende del conteo de parámetros y la cuantización. Usa esta tabla para estimar:
Tamaño del ModeloFP16 (precisión completa)FP8FP4/AWQUso Típico
3-4B6-8 GB3-4 GB2-3 GBInferencia rápida, razonamiento
7B14-16 GB7-8 GB4-5 GBModelos de visión, tareas especializadas
14B28-32 GB14-16 GB8-10 GBUso común
20B40-44 GB20-22 GB12-14 GBGeneración de alta calidad
32B64-68 GB32-34 GB18-20 GBRazonamiento avanzado
70B140-150 GB70-75 GB40-45 GBTareas complejas
Notas sobre cuantización:
  • FP16: Precisión completa, mejor calidad, mayor memoria
  • FP8: Reducción de memoria del 50%, pérdida mínima de calidad
  • FP4/AWQ: Reducción de memoria del 70-75%, ligera degradación de calidad
  • La mayoría de los modelos de HuggingFace usan FP16 por defecto a menos que se especifique (ej., sufijo -AWQ, -GPTQ)
Ejemplos de cálculos para GPU de 24GB (22.8GB utilizables):
Escenario 1: Principal + Visión
- Qwen3-14B (FP16): 28GB → Demasiado grande solo
- Qwen3-14B (FP4): 10GB → Encaja
- Qwen2.5-VL-7B (AWQ): 5GB → Encaja
- Embeddings: 2-3GB → Encaja
- Total: 17-18GB → ✓ Encaja en 22.8GB

Escenario 2: Múltiples modelos más pequeños
- Gemma-3n-4B: 3GB → Encaja
- Qwen2.5-VL-7B (AWQ): 5GB → Encaja
- GPT-OSS-20B (FP4): 12GB → Encaja
- Embeddings: 2GB → Encaja
- Total: 22GB → ✓ Encaja en 22.8GB

Paso 3: Convierte GB a Porcentajes de Utilización de Memoria

Una vez que conoces los requisitos en GB, convierte a gpuMemoryUtilization: Fórmula: gpuMemoryUtilization = (Model GB / Total GPU GB) Ejemplo para GPU de 24GB:
ModeloMemoria (GB)CálculogpuMemoryUtilization
Qwen3-14B (FP4)10 GB10 / 24 = 0.4170.42
Qwen2.5-VL-7B5 GB5 / 24 = 0.2080.21
GPT-OSS-20B (FP4)12 GB12 / 24 = 0.5000.50
Embeddings2.5 GB2.5 / 24 = 0.1040.10
Total29.5 GB29.5 / 241.23 (sobre 1.00 ✗)
Ejemplo para GPU de 48GB:
ModeloMemoria (GB)CálculogpuMemoryUtilization
Qwen3-14B (FP16)30 GB30 / 48 = 0.6250.63
Qwen2.5-VL-7B5 GB5 / 48 = 0.1040.10
Gemma-3n-4B3 GB3 / 48 = 0.0630.07
Embeddings5 GB5 / 48 = 0.1040.10
Total43 GB43 / 480.90 (bajo 1.00 ✓)
Siempre redondea ligeramente hacia abajo para dejar margen. Si el cálculo da 0.417, usa 0.40 o 0.42.

Paso 4: Ajusta las Ventanas de Contexto Basado en la Memoria

Cuando reduces la asignación de memoria de un modelo, también debes reducir su contextWindow porque hay menos espacio disponible para KV Cache. Regla general: La ventana de contexto escala aproximadamente linealmente con la huella de memoria. Ejemplos:
Escenario 1: GPU de 24GB con modelo de visión
- LLM Principal: 0.85 → 0.50
  Contexto: 16384 → 8192
- Visión: 0.25
  Contexto: 2048

Escenario 2: GPU de 48GB con múltiples modelos  
- LLM Principal: 0.85 → 0.60
  Contexto: 16384 → 12288
- Razonamiento: 0.15
  Contexto: 4096
- Visión: 0.10
  Contexto: 2048

Paso 5: Escribe la Configuración Completa

Ahora combina todos los modelos con sus asignaciones calculadas:
ai:
  preset: "baseline-24g"
  config:
    models:
      - id: llm
        gpuMemoryUtilization: 0.42  # 10GB para Qwen3-14B FP4
        contextWindow: 4096          # Reducido desde 8192
        
      - id: llmvision
        gpuMemoryUtilization: 0.21  # 5GB para modelo de visión
        contextWindow: 1024          # Pequeño para tareas de visión
        
      - id: llmfast
        gpuMemoryUtilization: 0.12  # 3GB para modelo rápido
        contextWindow: 2048
        
      - id: embed
        gpuMemoryUtilization: 0.10  # 2.5GB para embeddings
Modelos cuantizados en HuggingFace: Busca sufijos como -AWQ o -GPTQ en el nombre del modelo. Si no hay sufijo, asume FP16.Ejemplos:
  • Qwen/Qwen3-14B-Instruct → FP16 (28-32GB)
  • Qwen/Qwen3-14B-Instruct-AWQ → FP4 (8-10GB)
  • mistralai/Mistral-Small-24B-Instruct-2501 → FP16 (44-48GB)

Esquema de Configuración

ai:
  preset: "<base-preset>"
  numGPUs: integer                         # Opcional: para multi-GPU
  config:
    models:
      - id: string                         # Requerido: identificador único
        name: string                       # Opcional: nombre para mostrar
        type: llm | embedding              # Requerido: tipo de modelo
        modelRepo: string                  # Requerido: ruta HuggingFace
        tokenizer: string                  # Opcional: ruta del tokenizer (LLMs)
        promptStyle: string                # Opcional: qwen, mistral, gemma, gpt-oss
        contextWindow: integer             # Opcional: longitud máxima de contexto
        gpuMemoryUtilization: float        # Requerido al agregar modelos (0.0-1.0)
        supportReasoning: boolean          # Opcional: habilitar razonamiento (LLMs)
        multimodal:                        # Opcional: soporte multimodal (LLMs)
          images:
            enabled: boolean
            maxNumber: integer
        samplingParams:                    # Opcional: parámetros de inferencia
          temperature: float (0.0-2.0)
          maxTokens: integer (1-8192)
          minP: float (0.0-1.0)
          topP: float (0.0-1.0)
          topK: integer (1-100)
          repetitionPenalty: float (1.0-2.0)
          presencePenalty: float (-2.0-2.0)
          frequencyPenalty: float (-2.0-2.0)
Reglas Críticas:
  • La suma de todos los gpuMemoryUtilization no debe exceder 1.00
  • Cada id debe ser único
  • llm y embed son obligatorios y no se pueden eliminar
  • Reducir la asignación de memoria requiere reducir contextWindow proporcionalmente

Ejemplo Completo: Configuración Multi-Modelo

Este ejemplo demuestra agregar modelos de visión y razonamiento para manejar diferentes tipos de cargas de trabajo: Escenario: Quieres tres modelos:
  1. LLM Principal para tareas de texto generales
  2. LLM de Visión para comprensión de imágenes
  3. Modelo de Audio Rápido para tareas de transcripción
Estrategia de asignación de memoria:
LLM Principal:   0.50  (reducido desde 0.85)
Modelo de Visión:  0.25  (nuevo)
Modelo de Audio:   0.10  (nuevo)
Embeddings:    0.10  (sin cambios)
───────────────────────────────
Total:         0.95
Configuración completa:
ai:
  preset: "baseline-24g"
  numGPUs: 1
  config:
    models:
      # LLM Principal - Maneja generación de texto general
      - id: llm
        name: qwen-3-14b-awq
        type: llm
        contextWindow: 9600              # Reducido desde 16384 (~41%) para coincidir con asignación de memoria
        promptStyle: qwen
        gpuMemoryUtilization: 0.50       # Reducido desde el defecto 0.85
        supportReasoning: true
        samplingParams:
          temperature: 0.7
          maxTokens: 4096
          topP: 0.9

      # Embeddings - Obligatorio para procesamiento de documentos (sin cambios)
      - id: embed
        gpuMemoryUtilization: 0.10

      # LLM de Visión - Maneja tareas de comprensión de imágenes
      - id: llmvision
        name: qwen-2-5-vl-7b-awq
        type: llm
        contextWindow: 1024              # Más pequeño para tareas de imagen
        promptStyle: qwen
        gpuMemoryUtilization: 0.25       # Nueva asignación
        multimodal:
          images:
            enabled: true
            maxNumber: 1
        supportReasoning: false
        samplingParams:
          temperature: 0.1               # Más determinista para visión
          maxTokens: 2048
          topP: 0.85

      # Modelo de audio rápido - Maneja tareas de transcripción
      - id: llmaudio
        name: gemma-3n-e4b
        type: llm
        contextWindow: 2048
        modelRepo: "<repo>/gemma-3n-4b-it-audio"  # Fine-tuned para audio
        promptStyle: gemma
        gpuMemoryUtilization: 0.10                # Nueva asignación
        supportReasoning: true
        samplingParams:
          temperature: 0.5
          maxTokens: 1024
          topP: 0.9

# Verificación de memoria: 0.50 + 0.25 + 0.10 + 0.10 = 0.95 ✓

Mejores Prácticas para Configuraciones Multi-Modelo

  1. Comienza mínimo: Empieza con asignaciones viables más pequeñas, aumenta basado en el uso real
  2. Monitorea continuamente: Usa nvidia-smi para rastrear el consumo real de memoria
  3. Prueba individualmente: Valida que cada modelo funciona antes de combinar. Es mejor aislar problemas en lugar de depurar múltiples modelos a la vez
  4. Planifica margen: No asignes toda la memoria. Deja algo de buffer para picos de memoria
  5. Prueba de estrés: Simula cargas de trabajo pico para asegurar estabilidad bajo carga

Referencia de Parámetros de Configuración

Referencia completa de todos los parámetros disponibles.

Parámetros Principales (Todos los Modelos)

ParámetroTipoRequeridoDescripción
idstringIdentificador único del modelo
typestringTipo de modelo: llm o embedding
modelRepostringRuta del modelo HuggingFace
namestringNoNombre personalizado para mostrar
gpuMemoryUtilizationfloatNoFracción de memoria GPU (0.0-1.0)

Parámetros Específicos de LLM

ParámetroTipoDescripción
contextWindowintegerLongitud máxima de contexto
tokenizerstringRuta del tokenizer HuggingFace
promptStylestringFormato: qwen, mistral, gemma, gpt-oss
supportReasoningbooleanHabilitar capacidades de razonamiento
supportImageintegerNúmero de imágenes soportadas
supportAudiointegerNúmero de entradas de audio soportadas
samplingParamsobjectConfiguración de muestreo por defecto
reasoningSamplingParamsobjectMuestreo para modo de razonamiento

Parámetros Específicos de Embedding

ParámetroTipoDescripción
vectorDimintegerDimensiones del vector de salida

Parámetros de Muestreo

ParámetroTipoRangoDescripción
temperaturefloat0.0-2.0Aleatoriedad en la generación
maxTokensint1-8192Tokens máximos de respuesta
minPfloat0.0-1.0Umbral de probabilidad mínimo
topPfloat0.0-1.0Umbral de muestreo de núcleo
topKint1-100Límite de muestreo Top-K
repetitionPenaltyfloat1.0-2.0Penalización por tokens repetidos
presencePenaltyfloat-2.0-2.0Penalización por presencia de token
frequencyPenaltyfloat-2.0-2.0Penalización por frecuencia de token

Parámetros Multimodales (LLMs)

multimodal:
  images:
    enabled: boolean      # Habilitar entrada de imagen
    maxNumber: integer    # Máximo de imágenes por solicitud
  audio:
    enabled: boolean      # Habilitar entrada de audio
    maxNumber: integer    # Máximo de archivos de audio por solicitud

Lista de Verificación de Validación

Antes de desplegar configuraciones personalizadas:
  • Todos los valores de id son únicos
  • Los modelos llm y embed están presentes
  • Suma de gpuMemoryUtilization ≤ 0.95
  • promptStyle coincide con la familia del modelo
  • contextWindow apropiado para la asignación de memoria
  • tokenizer coincide o es compatible con el modelo
  • Configuración probada en entorno de staging
  • Monitoreo en su lugar para uso de memoria

Errores Comunes

  1. Exceder asignación de memoria de 1.0: Siempre verifica tus cálculos
  2. No reducir ventanas de contexto: Los contextos grandes necesitan más memoria, ajusta en consecuencia
  3. Tokenizers incompatibles: Usa tokenizers compatibles para cada modelo
  4. Estilo de prompt incorrecto: Cada familia de modelo requiere formato específico
  5. Sin pruebas: Siempre valida en no-producción primero