JARVIS/entrena/README.md
sito 8e4bc8ad94 JARVIS: asistente de voz local para Linux
Nucleo propio: oye con whisper.cpp, piensa con un modelo de Ollama, habla
con Piper, y hace RAG sobre los apuntes del usuario. 100% local, sin
cuentas ni claves.

Escrito bajo una restriccion dura, 4 GB de VRAM: el cerebro y whisper
comparten tarjeta y solo caben porque estan dimensionados para ello. El
RAG usa embeddings estaticos con busqueda hibrida; la voz clonada se sirve
de una cache de frases.

Incluye instalador (install.sh), requisitos, y documentacion del stack,
del manejo de root y de las acciones. Los apuntes indexados y el diario NO
se incluyen: son privados y el .gitignore los bloquea.
2026-08-16 15:34:37 +02:00

2.4 KiB

Entrenamiento de JARVIS

El fine-tuning NO sustituye al RAG (nucleo/saber/), lo complementa. El RAG ya funciona y da el conocimiento fresco; esto hornea el estilo y los flujos en los pesos. Por eso fue: primero RAG, esto despues.

Los tres pasos

1. dataset.py    convierte los apuntes de COFRE en pares pregunta-respuesta
                 (usa el indice de nucleo/saber/, ~10 h con el 4B local)
2. afina.py      QLoRA sobre el dataset. --revisa dice si la maquina puede
3. exportar      el adaptador a GGUF + Modelfile con ADAPTER, para ollama

Por que falla hoy: qwen3.5 es MULTIMODAL (16 ago)

Las pruebas de afina.py cargan el modelo bien y se caen justo despues, al enganchar los adaptadores, con un mensaje que no viene a cuento:

Incorrect image source. Must be a valid URL starting with `http://`

No es un fallo de red ni de rutas. Qwen/Qwen3.5-2B es image-text-to-text —comprobado en la API de HuggingFace, y el propio GGUF lo delata: el model_info de ollama trae qwen35.vision.block_count = 24—. O sea que el modelo lleva torre de vision, y FastLanguageModel lo mete por el camino de solo texto mientras transformers intenta procesar una imagen que no existe.

La pista estaba en el log y se leyo como ruido:

Unsloth: Explicit target_modules are constrained by the
finetune_(vision|language|attention|mlp) filters

Ese aviso solo lo emite el camino multimodal.

Por donde va el arreglo: FastVisionModel con finetune_vision_layers=False, que es la via de unsloth para afinar solo la parte de lenguaje de un modelo con vision. Sin probar todavia.

De paso, los nombres que no existen en HuggingFace y que las pruebas fueron descartando: Qwen3.5-3B, Qwen3.5-3B-Instruct, Qwen3.5-1.7B, Qwen3.5-1.7B-Instruct, Qwen3.5-1.5B. El unico que carga es Qwen3.5-2B (1,95 GB).

Donde entrenar

T1200 (4 GB) al limite. Turing, sin bf16. Posible pero fragil. 3060 (12 GB) holgado. El sitio natural. El dataset viaja como fichero.

Para entrenar

pip install unsloth          # trae peft, trl, bitsandbytes
./afina.py --revisa          # comprueba
./afina.py                   # entrena

Exportar a ollama (tras entrenar)

# con llama.cpp:
python convert_lora_to_gguf.py jarvis-lora --outfile jarvis-lora.gguf
# Modelfile:
#   FROM qwen3.5:4b
#   ADAPTER ./jarvis-lora.gguf
ollama create qwen3.5:4b-jarvis-cofre -f Modelfile