diff options
| author | Elvis Claros Castro <elvis@claros.ar> | 2026-09-26 18:53:33 -0300 |
|---|---|---|
| committer | Elvis Claros Castro <elvis@claros.ar> | 2026-09-26 18:53:33 -0300 |
| commit | 78192f5934a2abcbd6a3a256f1d9bb32164cd2cc (patch) | |
| tree | b0be74b7d4eedad6267cfb414bb3068d911ceefa /README.es.md | |
| download | llm-tune-main.tar.gz llm-tune-main.zip | |
Diffstat (limited to 'README.es.md')
| -rw-r--r-- | README.es.md | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..806659d --- /dev/null +++ b/README.es.md @@ -0,0 +1,75 @@ +# llm-tune + +[English](README.md) + +Ajuste fino con LoRA para modelos de la familia Llama, escrito desde cero en +Rust con [burn](https://burn.dev). Carga pesos de Hugging Face, entrena un +adaptador LoRA con un dataset de instrucciones y guarda solo el adaptador. Todo +el proceso es lo bastante chico para leerlo de una vez y corre en CPU. + +Por defecto entrena [SmolLM2-135M-Instruct](https://huggingface.co/HuggingFaceTB/SmolLM2-135M-Instruct) +con [databricks-dolly-15k](https://huggingface.co/datasets/databricks/databricks-dolly-15k). + +```console +$ llm-tune train --steps 200 +model : 30 layers, hidden 576, 9 heads / 3 kv, head_dim 64, vocab 49152 +lora : rank 8, alpha 16, scaling 2.00, targets ["q", "v"] +training 120 LoRA tensors on 256 examples +before -> |B| = 0.000000 |W_base| = 162.8625 +step 1/200 loss 0.5757 seq 157 +... +adapter saved to adapters/dolly/ +``` + +## Qué implementa + +- **Llama en burn**: RMSNorm, embeddings rotatorios con la convención + «half-split» de Hugging Face, atención con consultas agrupadas (`repeat_kv`), + MLP SwiGLU y embeddings atados. +- **Carga de pesos** desde `model.safetensors`: convierte BF16 a F32 de forma + perezosa (el backend ndarray no tiene BF16), transpone los pesos de las capas + Linear y traduce los nombres de Hugging Face a las rutas de los módulos de burn. +- **LoRA**: `LoraLinear` envuelve cada proyección; A arranca con ruido gaussiano + y B en cero, así que el entrenamiento parte exactamente del modelo base. Los + pesos base se congelan y solo A y B reciben gradiente. +- **Pérdida con máscara**: entropía cruzada causal donde solo cuenta la + respuesta del asistente; el prompt no aporta gradiente. +- **Archivos del adaptador**: `adapter.safetensors` (solo los tensores A/B) y + `adapter_config.json` (rango, alpha, targets). Al cargarlo verifica que se + aplicaron todos los tensores esperados, así un adaptador incompatible falla + con un error en lugar de generar basura. + +## Uso + +```sh +git clone https://git.all.ar/pub/llm-tune.git +cd llm-tune +./scripts/download.sh # modelo (~270 MB) y dataset, con verificación de sumas +cargo build --release + +# comprobar que el modelo base genera texto coherente +./target/release/llm-tune check "The capital of France is" + +# entrenar un adaptador y probarlo +./target/release/llm-tune train --steps 200 --examples 256 --out adapters/dolly +./target/release/llm-tune check --adapter adapters/dolly \ + $'<|im_start|>user\nWhat is the capital of France?<|im_end|>\n<|im_start|>assistant\n' +``` + +| Opción | Por defecto | | +|---|---|---| +| `--model` | `models/smollm2-135m-instruct` | directorio del modelo de Hugging Face | +| `train --data` | `data/dolly-15k/databricks-dolly-15k.jsonl` | JSONL con formato dolly | +| `train --steps` | 20 | pasos del optimizador | +| `train --batch` | 1 | ejemplos por paso | +| `train --lr` | 1e-4 | tasa de aprendizaje de AdamW | +| `train --max-len` | 256 | los ejemplos más largos se descartan | +| `train --examples` | 256 | ejemplos leídos del dataset | +| `train --out` | `adapters/dolly` | dónde se guarda el adaptador | + +El backend por defecto es ndarray (CPU). `--features cuda` o `--features wgpu` +activan los backends de GPU de burn al compilar. + +## Licencia + +MIT |