>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
Python

Cómo ajustar un modelo neuronal de 8B en un portátil con una GPU de 4 GB

Soup

Cualquiera que haya intentado ajustar un LLM por su cuenta conoce este ritual: configuras el entorno, luchas con las versiones de CUDA, ajustas el tamaño del batch, atrapas infinitos errores CUDA out of memory, y terminas alquilando un H100 en la nube solo para ejecutar un par de épocas en un dataset pequeño. En algún momento, configurar scripts y pelear con servidores empieza a tomar más tiempo que la preparación de datos y el análisis de resultados.

Hace poco me encontré con el repositorio Soup de Alpamis Makazhan. El autor se propuso un objetivo ambicioso: reducir toda la pipeline de ajuste a un único comando de consola y un archivo YAML simple. Lo más interesante del proyecto es la capacidad de ajustar un modelo Llama 3.1 con 8 mil millones de parámetros en un RTX 3050 móvil con solo 4 GB de memoria de video.

Parece un truco de marketing, pero bajo el capó hay algo de ingeniería interesante y un preprint abierto con benchmarks. Desglosemos cómo funciona y cómo se desempeña en la práctica.

soup train demo

Qué puede hacer Soup

Esencialmente, Soup es un wrapper CLI alrededor de una pila popular de ML (PyTorch, Transformers, PEFT, TRL). La idea principal es ocuparse de lo rutinario: detectar el hardware disponible, cuantización, auto-ajuste del tamaño del batch y formateo de datasets.

La utilidad cubre el flujo de trabajo completo del modelo:

  • inicializa plantillas para diferentes tareas (chat, código, tool-calling, clasificación);
  • detecta automáticamente formatos de datos (Alpaca, ShareGPT, ChatML) desde JSONL, Parquet o CSV;
  • ejecuta entrenamiento con métodos SFT, DPO, ORPO, SimPO o KTO;
  • prueba el resultado en busca de regresiones y fusiona adaptadores LoRA en los pesos del modelo;
  • exporta el modelo a formato GGUF para ejecutar en Ollama o llama.cpp.

Para uso básico ni siquiera necesitas PyTorch: una versión CLI ligera se instala en un par de segundos y ayuda a inspeccionar datos. Y si necesitas el entrenamiento en sí, la pila completa se descarga.

# Установка пакета с зависимостями для обучения
pip install "soup-cli[train]"

# Создание конфига через мастер или из готового шаблона
soup init --template chat

# Запуск процесса
soup train

Cómo un modelo de 8B cabe en 4 GB de memoria de video

Normalmente, un modelo de 8 mil millones de parámetros incluso en forma cuantizada de 4 bits (NF4) requiere unos 5-6 GB de VRAM solo para cargarlo en memoria. Si añades contexto, activaciones y adaptadores LoRA, una tarjeta con 4 GB inevitablemente arrojará un error de memoria insuficiente.

El autor de Soup utilizó una técnica de streaming de capas.

El modelo base no se mantiene completamente en memoria de video. Se almacena en la RAM del ordenador (o incluso se lee directamente desde un disco NVMe rápido) y se alimenta a la GPU capa por capa. Solo los adaptadores LoRA entrenables y la capa decodificadora actual se mantienen permanentemente en VRAM.

En pruebas en un portátil RTX 3050 con 4 GB de VRAM, el modelo Llama-3.1-8B-Instruct con cuantización NF4 mostró un consumo máximo de memoria de solo 3.32 GB a una velocidad de aproximadamente 119 tokens por segundo. Los cálculos producen resultados bit-identicos al entrenamiento residente convencional.

El streaming de capas se habilita literalmente con una sola línea en la configuración soup.yaml:

base: meta-llama/Llama-3.1-8B-Instruct
task: sft

data:
  train: ./data/train.jsonl
  format: alpaca

training:
  stream_layers: true      # стриминг слоев из RAM
  quantization: 4bit       # NF4 квантование
  batch_size: 4
  stream_source: auto      # RAM или NVMe
  lora:
    r: 64
    alpha: 16

output: ./output

En las versiones 0.72+, el streaming de capas se extendió no solo al SFT clásico sino también a métodos de alineación como DPO y ORPO. Con DPO, necesitas el modelo base para comparación, lo que generalmente duplica el uso de memoria. Aquí la utilidad utiliza el mismo streaming de capas con el adaptador deshabilitado, sin crear un duplicado en memoria.

Verificaciones de calidad y protección contra errores ocultos

Un problema común del ajuste fino: el modelo parece haber aprendido a responder tus preguntas específicas, pero olvidó completamente cómo llamar funciones o empezó a generar JSON roto.

Soup tiene una herramienta de verificación integrada soup ship. Esta es una puerta de calidad interna con un conjunto de pruebas (aritmética, seguimiento de esquema JSON, tool calling, seguridad) que ejecuta tanto el modelo original como el ajustado.

soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl

El comando devuelve un veredicto específico: SHIP o DON'T SHIP. Por ejemplo, si el adaptador mejoró las respuestas en la tarea objetivo pero rompió la sintaxis de tool call, la utilidad saldrá con un código no cero y mostrará dónde ocurrió la regresión.

Exportación y uso

Una vez que el adaptador está entrenado y verificado, puedes empaquetarlo en el formato deseado de inmediato:

# Проверить ответы в интерактивном режиме
soup chat --model ./output

# Влить LoRA в базовые веса
soup merge --adapter ./output

# Сконвертировать в GGUF для Ollama
soup export --model ./output --format gguf --quant q4_k_m

# Или поднять локальный API-сервер с OpenAI-совместимыми ручками
soup serve --model ./output

Si necesitas ejecutar el entrenamiento en una máquina remota o en aislamiento sin instalar drivers manualmente, el proyecto tiene una imagen Docker lista para usar en GitHub Packages (GHCR).

A quién le será útil este proyecto

Soup está dirigido a desarrolladores que necesitan un ciclo de experimentación rápido sin sumergirse en las profundidades del entrenamiento distribuido.

El proyecto definitivamente vale la pena probar si:

  1. Quieres experimentar con modelos pequeños (Qwen 2.5, Llama 3.1, Gemma) en un PC doméstico o portátil.
  2. Buscas una pipeline lista para usar: desde un dataset en bruto hasta un archivo GGUF para uso local.
  3. Estás cansado de escribir los mismos scripts basados en HuggingFace TRL para tareas típicas de SFT.

Limitaciones: se requiere estrictamente Python 3.10–3.12 (las construcciones de PyTorch para 3.13 actualmente son inestables). No se recomienda el pre-entrenamiento completo desde cero en clusters enormes a través de Soup—usa Megatron o DeepSpeed directamente para eso. Pero para el ajuste fino aplicado y el prototipado en GPUs de consumo, esta es una herramienta conveniente y bien pensada.

Proyectos relacionados