gnarp-m2 / README.md
CatQualia's picture
Rename MODEL_CARD.md to README.md
fc737f2 verified
|
Raw
History Blame Contribute Delete
6.77 kB
---
language:
- en
license: mit
library_name: transformers
tags:
- qlora
- smollm
- 360m
- cross-domain-transfer
- anime-isomorphism
- fine-tuned
pipeline_tag: text-generation
base_model: HuggingFaceTB/SmolLM2-360M-Instruct
---
# gnarp-m2
A 360M-parameter language model fine-tuned via QLoRA on 74,395 cross-domain isomorphism and verification-labeled instruction pairs. gnarp-m2 specializes in cross-domain structural transfer — mapping mechanisms from one domain (biology, physics, anime, economics, etc.) to software engineering constructs with concrete failure boundaries.
## Model Details
| Property | Value |
|----------|-------|
| Base model | HuggingFaceTB/SmolLM2-360M-Instruct |
| Method | QLoRA (4-bit NF4, double quantization) |
| LoRA rank | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0.05 |
| Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| Trainable params | 8,683,520 (2.34% of total) |
| Total params | 370,504,640 |
| Adapter size | 34.8 MB (rank-16, alpha-32) |
| Merged model size | 1.4 GB |
| Architecture | LlamaForCausalLM |
| Max sequence length | 768 tokens |
## Training Data
**Corpus:** `clean_corpus_v5.jsonl` — 74,395 rows
| Source | Rows | Description |
|--------|------|-------------|
| isomorphism_sft.jsonl | 53,403 | Anime-to-software structural isomorphisms with failure_class from the 17,801-row moat |
| gpu_assay_verdicts.jsonl | 11,989 | GPU assay verification-labeled pairs |
| anime_metaphor_engine.jsonl | 4,523 | Cross-domain metaphor engine outputs |
| forge_bloom | 2,117 | Forge pipeline bloom outputs |
| capability/reasoning/seed.jsonl | 1,232 | Reasoning capability seed data |
| fleet_toolforge.jsonl | 187 | Fleet tool use pairs |
| Others (30+ sources) | 944 | Security, orchestration, calibration, refusal, compliance, etc. |
Positive + unlabeled rows only. Negative rows excluded from SFT targets.
## Training Configuration
| Parameter | Value |
|-----------|-------|
| Epochs | 1 |
| Learning rate | 1e-4 (cosine schedule, 5% warmup) |
| Batch size | 1 |
| Gradient accumulation | 8 |
| Effective batch size | 8 |
| Optimizer | AdamW (bf16) |
| Eval split | 10% held out |
| Eval strategy | Every 500 steps |
| Best model selection | eval_loss (load_best_model_at_end) |
| Seed | 7 |
| Training hardware | RTX 3080 Laptop (8 GB VRAM) |
| Training time | ~13 hours |
## Training Results
| Metric | Value |
|--------|-------|
| Final train loss | 2.613 |
| Final eval loss | 2.509 |
| Token accuracy | 55.55% |
| Perplexity (train) | 13.64 |
## Evaluation: Cross-Domain Transfer Benchmark v2
36 cross-domain transfer tasks spanning anime, biology, physics, economics, fiction, geography, music, cooking, ecology, martial arts, psychology, logistics, chemistry, sports, agriculture, linguistics, city planning, finance, navigation, and architecture.
**Scoring:** Heuristic rubric (keyword + structural analysis). Trust DELTAS between models on the same tasks, not absolutes.
| Model | Judge Mean | Delta vs Base | Avg Response (chars) | Avg Latency (s) |
|-------|-----------|---------------|---------------------|-----------------|
| **gnarp-m2** | **0.7839** | **+14.1%** | 1,108 | 4.9 |
| base (SmolLM2-360M-Instruct) | 0.6871 | — | 1,489 | 6.9 |
## Prior Model Lineage (heldout benchmark, qwen3:8b judge)
| Model | Transfer Score | Heldout Loss | Perplexity | Refusal Rate | Training Data |
|-------|---------------|-------------|-----------|-------------|---------------|
| base | 0.709 | 1.625 | 5.08 | 0.130 | — |
| v1 | 0.218 | 1.850 | 6.36 | 0.385 | ~2,152 rows |
| v2 | 0.713 | 1.800 | 6.05 | 0.340 | ~2,152 rows |
| v3 | 0.561 | 1.790 | 5.99 | 0.400 | ~2,152 rows |
| **m2** | **0.7839*** | — | — | — | **74,395 rows** |
*m2 scored on transfer_benchmark_v2 (heuristic-only), not the qwen3:8b-judged heldout benchmark. Cross-benchmark comparisons should be treated with caution.
## Limitations
1. **360M parameters.** Small model. Cannot match larger models on complex reasoning, long-form generation, or nuanced instruction following.
2. **Single GPU, single epoch.** Trained on consumer hardware (RTX 3080 8GB) for one epoch. More training could improve results but risks overfitting.
3. **Heuristic eval.** The transfer benchmark v2 uses keyword/structural heuristic scoring, not a strong LLM judge. The +14.1% delta is directionally meaningful but not precisely calibrated.
4. **Cross-benchmark caveat.** v1/v2/v3 were scored with a qwen3:8b judge; m2 was scored with heuristic-only. Direct numerical comparison across the two benchmarks is not valid.
5. **Domain-specific training data.** Over 71% of training data is isomorphism pairs. The model is optimized for cross-domain structural transfer and may underperform on general chat or coding tasks.
6. **No safety fine-tuning beyond refusal data.** The model includes 19 refusal pairs but is not extensively safety-tuned.
## How to Use
### With Ollama (recommended for local inference)
```bash
# Create the Modelfile
cat > Modelfile << 'EOF'
FROM ./model/merged_gnarpm2
TEMPLATE """### Instruction: {{ .Prompt }} ### Response: """
PARAMETER num_ctx 4096
PARAMETER temperature 0.3
PARAMETER num_predict 512
SYSTEM You are gnarp-m2, a cross-domain transfer specialist.
EOF
ollama create gnarp-m2 -f Modelfile
ollama run gnarp-m2
```
### With Transformers
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "gnarp/gnarp-m2" # or local path
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
prompt = "### Instruction:\nApply the concept of biological apoptosis to software deployment strategy.\n### Response:\n"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512, temperature=0.3)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```
### With PEFT (adapter only)
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM2-360M-Instruct")
model = PeftModel.from_pretrained(base, "path/to/adapter_gnarpm2")
model = model.merge_and_unload()
```
## License
- **Model weights and code:** MIT License
- **Training data (corpus):** COPL (Community Open Public License) — derived from the WaveMotionExpansion isomorphism engine
- **Base model:** Apache 2.0 (SmolLM2-360M-Instruct by HuggingFace)
## Citation
```bibtex
@model{gnarp-m2,
title={gnarp-m2: Cross-Domain Transfer Fine-Tuned Language Model},
author={WaveMotionExpansion},
year={2026},
base_model={HuggingFaceTB/SmolLM2-360M-Instruct},
method={QLoRA},
training_rows={74395},
transfer_benchmark={0.7839}
}
```