Kukedlc commited on
Commit
8805912
·
verified ·
1 Parent(s): ed373fe

Add main README

Browse files
Files changed (1) hide show
  1. README.md +160 -0
README.md ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Tesslate/OmniCoder-9B
4
+ tags:
5
+ - qwen3.5
6
+ - lora
7
+ - sft
8
+ - reasoning
9
+ - coding
10
+ - gguf
11
+ - omnicoder
12
+ language:
13
+ - en
14
+ - es
15
+ library_name: transformers
16
+ ---
17
+
18
+ # Slopus 9B
19
+
20
+ **Pipeline experimental de fine-tuning sobre `Tesslate/OmniCoder-9B` (Qwen3.5-9B + 425K trazas Opus agenticas).**
21
+
22
+ Dos fases de LoRA encadenadas: primero una capa fina de coding agentico, despues una segunda capa mas pesada de razonamiento puro de Opus 4.6.
23
+
24
+ ![pipeline](slopus_pipeline.png)
25
+
26
+ ## Indice
27
+ 1. [Resumen](#resumen)
28
+ 2. [Pipeline en 5 pasos](#pipeline-en-5-pasos)
29
+ 3. [Fase 1 — LoRA r=8 sobre OmniCoder-9B](#fase-1)
30
+ 4. [Fase 2 — LoRA r=128 sobre merge fase 1](#fase-2)
31
+ 5. [Costos](#costos)
32
+ 6. [Quants disponibles](#quants-disponibles)
33
+ 7. [Uso con llama-server](#uso-con-llama-server)
34
+ 8. [Limitaciones](#limitaciones)
35
+ 9. [Datasets y agradecimientos](#datasets-y-agradecimientos)
36
+
37
+ ## Resumen
38
+
39
+ | | Fase 1 | Fase 2 |
40
+ |---|--------|--------|
41
+ | Dataset | `Kukedlc/omnicoder-train` (16K, coding agentico) | `Kukedlc/omnicoder-fase2-reasoning` (24K, Opus 4.6 reasoning, derivado de [`Gryphe/Opus-4.6-Reasoning-24k`](https://huggingface.co/datasets/Gryphe/Opus-4.6-Reasoning-24k)) |
42
+ | Base | `Tesslate/OmniCoder-9B` | `Tesslate/OmniCoder-9B` + Fase 1 LoRA mergeada (fp16) |
43
+ | LoRA rank / alpha | r=8, alpha=16 | r=128, alpha=256 |
44
+ | Targets | q,k,v,o,gate,up,down,**out_proj** (GDN) | igual + r mucho mas alto |
45
+ | Epochs | 2 | 2 |
46
+ | Steps totales | 506 | 758 |
47
+ | Batch effective | 16 (batch=8, GA=8) | 64 (batch=16, GA=4) |
48
+ | LR | 2e-4 | 1e-4 (mas bajo, base ya fine-tuneado) |
49
+ | Max seq | 2048 | 4096 |
50
+ | Hardware train | RunPod H100 80GB SXM Secure | RunPod H100 80GB SXM Secure |
51
+ | Tiempo aproximado | ~1.5h | ~4.8h |
52
+ | Loss inicial → final | 1.14 → 0.88 (**-23.1%**) | 1.03 → 0.88 (**-14.3%**) |
53
+
54
+ ## Pipeline en 5 pasos
55
+
56
+ 1. **Base**: [`Tesslate/OmniCoder-9B`](https://huggingface.co/Tesslate/OmniCoder-9B) — Qwen3.5-9B con arquitectura híbrida GDN (Gated Delta Networks) fine-tuneada por Tesslate con 425K trazas Opus de coding agentico.
57
+ 2. **Fase 1 LoRA r=8 alpha=16** sobre la base, dataset `Kukedlc/omnicoder-train`. 2 epochs, 506 steps. Adapter resultante: [`Kukedlc/omnicoder-9b-lora`](https://huggingface.co/Kukedlc/omnicoder-9b-lora) (checkpoints 100/200/300/400/500/506).
58
+ 3. **Merge Fase 1**: base + adapter Fase 1 → modelo HF fp16 de ~18 GB (no publicado, solo usado como base interna para Fase 2).
59
+ 4. **Fase 2 LoRA r=128 alpha=256** sobre el merge anterior, dataset `Kukedlc/omnicoder-fase2-reasoning` (rendereado de Gryphe Opus reasoning con `<think>` inline). 2 epochs, 758 steps. Adapter resultante: [`Kukedlc/omnicoder-9b-fase2-lora`](https://huggingface.co/Kukedlc/omnicoder-9b-fase2-lora) (checkpoints 100/200/.../758).
60
+ 5. **Merge Fase 2 + Quantize** con `llama.cpp` tag `b8292` (commit `b54124110`) — el master nuevo y otras versiones NO soportan correctamente la arquitectura GDN híbrida de Qwen3.5 y fallan con `missing tensor 'blk.32.attn_norm.weight'`. Quants generados: Q2_K, Q3_K_M, Q4_K_M, Q6_K, Q8_0.
61
+
62
+ ## Fase 1
63
+
64
+ ![fase1](slopus_fase1_loss.png)
65
+
66
+ LoRA conservador (r=8 alpha=16) sobre OmniCoder-9B para introducir un primer ajuste de estilo en el dominio que nos interesa antes de la inyeccion mas agresiva de Fase 2. La idea: no romper la base con un LoRA gigante en el primer paso.
67
+
68
+ **Observacion**: la loss baja MÁS en epoch 2 que en epoch 1 (10% epoch 1 vs 15% epoch 2), señal de que la base seguia teniendo capacidad de aprender — no overfitting.
69
+
70
+ ## Fase 2
71
+
72
+ ![fase2](slopus_fase2_loss.png)
73
+
74
+ LoRA de capacidad alta (r=128 alpha=256, 258M trainable params = 2.67% del 9B) sobre el merge de Fase 1, con dataset de razonamiento puro de Opus 4.6 (24K ejemplos chat con `reasoning_content` separado, rendereados como `<think>X</think>content` inline para el chat_template de Qwen3.5).
75
+
76
+ LR bajado a 1e-4 (vs 2e-4 fase 1) porque el modelo ya estaba fine-tuneado. Cosine scheduler con 20 warmup steps.
77
+
78
+ **Sampling parameters recomendados** (de Qwen3.6 model card, validos para Qwen3.5):
79
+
80
+ | Modo | temp | top_p | pres_pen | top_k | min_p |
81
+ |------|------|-------|----------|-------|-------|
82
+ | Thinking general | 1.0 | 0.95 | 1.5 | 20 | 0 |
83
+ | Thinking coding | 0.6 | 0.95 | 0.0 | 20 | 0 |
84
+ | Instruct general | 0.7 | 0.80 | 1.5 | 20 | 0 |
85
+
86
+ ## Costos
87
+
88
+ | Item | Tiempo | Costo |
89
+ |------|--------|-------|
90
+ | Train Fase 1 H100 SXM Secure ($3.29/h) | ~1.5h | ~$4.95 |
91
+ | Train Fase 2 H100 SXM Secure ($3.29/h) | ~4.8h | ~$15.8 |
92
+ | Merge intermedios + quantize local (3090) | ~2h | $0 (local) |
93
+ | Storage HF (XET turbo) | - | $0 |
94
+ | **Total compute pago** | ~6.3h cloud | **~$20.75** |
95
+
96
+ ## Quants disponibles
97
+
98
+ | Quant | Tamano | Uso recomendado |
99
+ |-------|--------|------------------|
100
+ | `Slopus-9B-Q2_K.gguf` | ~3.6 GB | Solo si VRAM <6 GB. Calidad notablemente menor. |
101
+ | `Slopus-9B-Q3_K_M.gguf` | ~4.5 GB | VRAM ~6 GB. Compromiso ajustado. |
102
+ | **`Slopus-9B-Q4_K_M.gguf`** | **~5.5 GB** | **Sweet spot, default recomendado**. VRAM 8 GB+ |
103
+ | `Slopus-9B-Q6_K.gguf` | ~7.5 GB | Calidad casi perfecta. VRAM 10 GB+ |
104
+ | `Slopus-9B-Q8_0.gguf` | ~9.5 GB | Casi indistinguible de fp16. VRAM 12 GB+ |
105
+
106
+ ## Uso con llama-server
107
+
108
+ **IMPORTANTE**: hay que usar `llama.cpp` tag `b8292` (commit `b54124110`). El master nuevo NO carga estos GGUF (falla con missing tensor por bug del converter+loader con la arquitectura GDN híbrida de Qwen3.5).
109
+
110
+ ```bash
111
+ # Instalar llama.cpp en b8292
112
+ git clone https://github.com/ggml-org/llama.cpp
113
+ cd llama.cpp
114
+ git checkout b8292
115
+ cmake -B build -DGGML_CUDA=ON
116
+ cmake --build build --target llama-quantize llama-server -j$(nproc)
117
+
118
+ # Servir
119
+ export LLAMA_CHAT_TEMPLATE_KWARGS='{"enable_thinking":true}'
120
+ ./build/bin/llama-server \
121
+ --model Slopus-9B-Q4_K_M.gguf \
122
+ -ngl 999 -fa on --no-mmap \
123
+ -c 65536 \
124
+ --parallel 4 \
125
+ --jinja --reasoning-format deepseek \
126
+ --temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 \
127
+ --presence-penalty 1.5 \
128
+ --port 12345
129
+ ```
130
+
131
+ ## Adapter LoRA fase 2 sin merge
132
+
133
+ Si querés usar el adapter LoRA de fase 2 directo (sin el merge), está en este mismo repo bajo [`adapter/`](./adapter). Para cargarlo necesitas tener primero el merge de fase 1 — pero ese **NO está publicado** (no agrega valor frente al GGUF Q4_K_M directo). Si necesitás reproducir desde fase 1, tenes que repetir el merge tu mismo siguiendo el pipeline.
134
+
135
+ ## Limitaciones
136
+
137
+ - **r=128 alpha=256 sobre 24K** es borderline de la regla de pulgar "r alto requiere dataset grande". El modelo NO mostro signos visibles de overfit (loss bajando hasta el final del epoch 2), pero sin eval set no se puede confirmar. Para usar produccion idealmente armar un benchmark out-of-distribution.
138
+ - **GGUF requiere llama.cpp b8292** especifico. Versiones posteriores no cargan. Este modelo no es compatible con `Ollama` standard (que usa llama.cpp interno mas nuevo) — habria que parchear Ollama o usar `llama-server` directo.
139
+ - **Aritmetica basica en Q4_K_M** puede tener errores (el modelo lista bien los terminos pero a veces suma mal). Usar Q6_K o Q8_0 para tasks que requieren precision numerica.
140
+ - **Sin RLHF/DPO**. Solo SFT en ambas fases.
141
+
142
+ ## Datasets y agradecimientos
143
+
144
+ - [`Tesslate/OmniCoder-9B`](https://huggingface.co/Tesslate/OmniCoder-9B) — base. Apache 2.0.
145
+ - [`Gryphe/Opus-4.6-Reasoning-24k`](https://huggingface.co/datasets/Gryphe/Opus-4.6-Reasoning-24k) — fuente del dataset de razonamiento (rendereado a chat_template Qwen3.5 con `<think>` inline). Apache 2.0.
146
+ - llama.cpp b8292 — Github ggml-org/llama.cpp, commit b54124110.
147
+ - Unsloth para training eficiente bf16 LoRA.
148
+ - bartowski por publicar GGUFs de OmniCoder-9B con b8292 que sirvieron como referencia para confirmar la version correcta.
149
+
150
+ ## Reproducir el experimento
151
+
152
+ Scripts en [`Kukedlc/omnicoder-train`](https://huggingface.co/datasets/Kukedlc/omnicoder-train) dataset repo:
153
+ - `train_omnicoder.py` — fase 1
154
+ - `train_omnicoder_fase2.py` — fase 2
155
+ - `setup_train.sh` / `setup_fase2.sh` — launchers en pod RunPod
156
+ - `watcher_upload.sh` / `watcher_upload_fase2.sh` — auto upload de checkpoints
157
+
158
+ ## License
159
+
160
+ Apache 2.0 — heredado de la base OmniCoder-9B y datasets Gryphe.