Entrena un VLM de 65M desde cero en 2 horas: Inmersión profunda en MiniMind-V
Aprende a entrenar un modelo de lenguaje-visión de 65 millones de parámetros desde cero en solo 2 horas por menos de $3, con código completo y detalles del conjunto de datos.
Construir un Modelo de Lenguaje-Visión (VLM) desde cero suena como una tarea desalentadora reservada para grandes equipos con presupuestos de cómputo masivos. Pero, ¿y si pudieras entrenar uno en solo dos horas, por menos del costo de un café? Eso es exactamente lo que ofrece el proyecto MiniMind-V: un VLM completamente funcional de 65M de parámetros que puedes entrenar en una sola GPU NVIDIA 3090.
Esto no es solo un juguete. MiniMind-V es una implementación completa y de código abierto que cubre todo el pipeline: preparación de datos, preentrenamiento, ajuste fino supervisado (SFT) e inferencia. Está diseñado para ser un recurso de aprendizaje para cualquiera que quiera entender cómo funcionan realmente los VLM modernos como LLaVA y Qwen-VL bajo el capó.
Por qué MiniMind-V es importante
El lema del proyecto — "大道至简" (Las grandes verdades son simples) — captura su filosofía. La mayoría de los tutoriales de VLM o pasan por alto los detalles de implementación o requieren recursos que los desarrolladores individuales no tienen. MiniMind-V elimina la complejidad, mostrando que el núcleo de un VLM es sorprendentemente sencillo.
Con solo 65 millones de parámetros (aproximadamente 1/2600 del tamaño de GPT-3), MiniMind-V es lo suficientemente pequeño para ejecutarse en hardware de consumo. Toda la fase de SFT toma alrededor de 2 horas en una sola RTX 3090, con costos de alquiler de GPU de alrededor de $3. Esto lo hace accesible para experimentación, aprendizaje e incluso aplicaciones prácticas donde un modelo pequeño es suficiente.
Arquitectura: El VLM Mínimo
MiniMind-V sigue la misma arquitectura que LLaVA-1.5, con tres componentes principales:
- Codificador de Visión: SigLIP2 (siglip2-base-p32-256-ve) — un modelo ViT-B/32 con ~95M de parámetros, mantenido congelado durante el entrenamiento.
- Módulo de Proyección: Un MLP de 2 capas (Lineal → GELU → Lineal) con LayerNorm, que mapea las características visuales a la dimensión oculta del LLM.
- Modelo de Lenguaje: El LLM de 64M de parámetros de MiniMind (tamaño oculto 768, 8 capas), con solo la primera y última capa ajustadas.
La idea clave es que el codificador de visión actúa como un "diccionario de idiomas extranjeros" para las imágenes. Traduce los datos de píxeles en tokens que el LLM puede entender. Luego, el módulo de proyección alinea estos tokens visuales con el espacio de incrustación de tokens de texto.
Flujo de Tokens
Cuando ingresas una imagen, el codificador SigLIP2 procesa una imagen de 256×256 en 64 tokens de parche (cuadrícula de 8×8 con patch_size=32). Estos pasan a través del proyector MLP para convertirse en 64 tokens visuales, que reemplazan los marcadores de posición <|image_pad|> en el prompt de texto. La secuencia combinada luego fluye a través del LLM como de costumbre.
# Estructura de ejemplo del prompt
"<|image_pad|>" * 64 + "\n¿Qué hay en esta imagen?"
Pipeline de Entrenamiento
MiniMind-V utiliza un proceso de entrenamiento de dos etapas, aunque puedes saltarte la primera etapa si tienes poco tiempo.
Etapa 1: Preentrenamiento (Opcional)
- Datos: ~1.27M pares imagen-texto de ALLaVA-4V (subconjuntos LAION + VFLAN)
- Objetivo: Alinear tokens visuales con tokens de lenguaje
- Estrategia de Congelación: Congelar tanto el LLM como el Codificador de Visión, entrenar solo el Proyector (
--freeze_llm 2) - Tasa de Aprendizaje: 4e-4
- Longitud Máxima de Secuencia: 450 tokens
Esta etapa es opcional porque el conjunto de datos SFT ya incluye todas las muestras de preentrenamiento. Sin embargo, ejecutarla primero ayuda a que el proyector converja de manera más limpia antes de ajustar el LLM.
Etapa 2: Ajuste Fino Supervisado (SFT)
- Datos: ~2.9M muestras mixtas (instrucciones de imagen, descripciones, texto puro)
- Objetivo: Enseñar al modelo a responder preguntas sobre imágenes
- Estrategia de Congelación: Entrenar Proyector + primera y última capa del LLM (
--freeze_llm 1) - Tasa de Aprendizaje: 5e-6
- Longitud Máxima de Secuencia: 768 tokens
La estrategia de congelación es crítica. Con solo 64M de parámetros, descongelar completamente el LLM causaría un olvido catastrófico de las capacidades lingüísticas. Al mantener las capas intermedias congeladas, el modelo retiene su conocimiento preentrenado mientras se adapta a las entradas multimodales.
# Iniciar entrenamiento SFT
python train_sft_vlm.py --epochs 2 --from_weight llm
Detalles del Conjunto de Datos
Todos los datos de entrenamiento provienen de la colección ALLaVA-4V, que proporciona pares imagen-texto de alta calidad y bilingües (chino + inglés). El conjunto de datos SFT incluye:
- Instrucciones de Imagen: ~1.4M pares de preguntas y respuestas de razonamiento
- Descripciones de Imagen: ~1.27M (fusionadas del preentrenamiento)
- Texto Puro: ~230K diálogos (con imágenes de marcador de posición negras para mantener la capacidad lingüística)
Las imágenes se redimensionan a 256×256 y se almacenan como JPEG en formato Parquet para una carga eficiente. El formato Parquet elimina la necesidad de extracción lenta de archivos de imagen: todo está en un solo archivo comprimido.
# Formato del conjunto de datos (parquet)
# columnas: conversations (cadena json), image_bytes (binario)
Resultados de Evaluación
El modelo se probó en 6 imágenes diversas (perro, paraguas, bicicleta, coche, superhéroe, coche de carreras). Tanto la versión densa (65M) como la MoE (200M-A65M) identificaron correctamente el sujeto principal en los 6 casos. La versión MoE produjo descripciones de escena más ricas, mientras que la versión densa fue más concisa con menos repeticiones.
Sin embargo, ambos modelos exhiben problemas comunes de modelos pequeños: repetición ocasional y alucinación de detalles. El autor señala que esto es esperado: la señal visual es como un "idioma extranjero" para el LLM, y la calidad de la comprensión está fundamentalmente limitada por la capacidad del LLM. Escalar el backbone a unos pocos miles de millones de parámetros mejoraría drásticamente la precisión.
Primeros Pasos
Para ejecutar MiniMind-V tú mismo:
# Clonar el repositorio
git clone --depth 1 https://github.com/jingyaogong/minimind-v
cd minimind-v
# Instalar dependencias
pip install -r requirements.txt
# Descargar el codificador de visión y los pesos del LLM
modelscope download --model gongjy/siglip2-base-p32-256-ve --local_dir ./model/siglip2-base-p32-256-ve
modelscope download --model gongjy/minimind-3v-pytorch llm_768.pth --local_dir ./out
# Descargar datos SFT
wget https://hf-mirror.com/datasets/jingyaogong/minimind-v_dataset/resolve/main/sft_i2t.parquet -P ./dataset
# Entrenar (solo SFT, ~2 horas en RTX 3090)
python train_sft_vlm.py --epochs 2 --from_weight llm
Mejoras Futuras
El proyecto esboza varias direcciones prometedoras:
- Resolución dinámica y codificación basada en mosaicos (como LLaVA-NeXT)
- Codificadores de visión más potentes para características más detalladas
- Comprensión de múltiples imágenes, comprensión de video y anclaje visual
Conclusión
MiniMind-V es un logro notable en la democratización de la investigación de VLM. Demuestra que no necesitas un clúster masivo ni un gran presupuesto para construir un modelo multimodal funcional. El código es limpio, bien documentado y sirve como un excelente punto de partida para cualquiera que quiera entender o experimentar con modelos de lenguaje-visión.
Ya seas estudiante, investigador o aficionado, este proyecto te brinda las herramientas para unirte a la revolución de los VLM. Como dice el autor: "Construir un avión con LEGOs es mucho más emocionante que volar en primera clase."