# 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
