Nova Pup 4B
By Matthew Salinas Hernandez — Hungry Nova Labs LLC
A 4B-parameter Linux systems specialist and multi-agent problem solver, trained
end-to-end on a single RTX 5090.
Also available on Ollama:
hungrynovalabs/nova-pup
(
ollama run hungrynovalabs/nova-pup:4b)
Highlights
- 3x its base model on a sealed closed-book Linux diagnostics exam (25% → 75%)
- MMLU 73.7% (vs 74.0% base) — specialization without catastrophic forgetting
- Built for agent swarms: an 8-agent pack runs in 15.5 GB VRAM at 1,539 tok/s
aggregate on one RTX 5090 (Q8_0 GGUF via Ollama), with zero per-agent slowdown
- Playful, rigorous "toon pup" persona — step-by-step reasoning with
machine-checkable final answers
Why this model exists
I originally built Nova Pup as a local Linux study and troubleshooting
assistant. I had collected technical books, manuals, man pages, and
documentation over years of study, but I needed a more practical way to
connect and apply that material while working.
The purpose was not to reproduce or redistribute those sources. It was to
build a small assistant that could help explain concepts, troubleshoot
systems, and apply Linux knowledge to new problems.
After testing it for my own use, I decided to release the trained model so
other Linux users could experiment with it as well. The original books, PDFs,
and training corpus are not included with the model.
Training
- Base: InternScience Agents-A1-4B (Qwen3.5 hybrid linear-attention family)
- Phase 1 — Continued pretraining: BF16 LoRA, 3,000 steps, 4,096-token
packed sequences over a curated, deduplicated, secret-scrubbed Linux corpus
- Phase 2 — Solver SFT: 1,200 steps on a programmatically generated,
machine-verified puzzle curriculum: logic-grid deduction, bash-pipeline
reconstruction, answer verification, and task decomposition — with a
consistent persona layer
- Adapters merged into the base weights; this repo contains the merged
BF16 safetensors
Benchmarks
Measured with EleutherAI lm-evaluation-harness (0-shot loglikelihood except
GSM8K 5-shot/300 samples), BF16, RTX 5090. Base model evaluated identically.
| Benchmark | Base Agents-A1 4B | Nova Pup 4B |
|---|
| Linux closed-book exam (sealed, 16q) | 25% | 75% |
| MMLU (57 subjects) | 74.0% | 73.7% |
| ARC-Challenge (acc_norm) | 54.4% | 56.6% |
| HellaSwag (acc_norm) | 71.7% | 73.9% |
| Winogrande | 69.0% | 69.8% |
| TruthfulQA MC2 | 49.6% | 45.9% |
| GSM8K (strict) | 77.7% | 71.0% |
Known limitations (read before using)
- Math regressed: GSM8K dropped 6.7 points vs base — math was not in the
training mix. Pair with a calculator/code tool for arithmetic-heavy work.
- TruthfulQA dipped 3.7 points; calibrate confidence accordingly.
- 4B parameters: built to be small, fast, and replicated in swarms — not to
out-reason frontier models.
- 8k context in the published configuration; long-context training planned.
- Distinct persona: a playful cartoon pup that verifies its work. Override
the system prompt for a neutral assistant.
Usage (transformers)
1from transformers import AutoModelForImageTextToText, AutoTokenizer
2import torch
3
4model = AutoModelForImageTextToText.from_pretrained(
5 "hungrynovalabs/nova-pup-4b", dtype=torch.bfloat16, device_map="auto"
6)
7tokenizer = AutoTokenizer.from_pretrained("hungrynovalabs/nova-pup-4b")
8
9messages = [{"role": "user", "content": "My apt is broken after a full disk. First steps?"}]
10text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
11inputs = tokenizer(text, return_tensors="pt").to(model.device)
12print(tokenizer.decode(model.generate(**inputs, max_new_tokens=400)[0]))
Note: the model class is Qwen3_5ForConditionalGeneration (vision-language
base); use AutoModelForImageTextToText, not AutoModelForCausalLM.
Training data & licensing
Nova Pup was trained using lawfully acquired technical materials and publicly
available Linux documentation. Openly licensed materials retain their
respective licenses. Copyrighted materials were used only for intermediate
model training and are not distributed with the model.
Base model: InternScience Agents-A1-4B (Apache-2.0).
Based on Qwen3.5-4B (Apache 2.0) by the Qwen Team.