introducing BarunLM (35m) 🤗
i pretrained the world's best small model under 100m parameters.
a 35m parameter language model that outperforms models over 6x larger, including LiquidAI's lfm2.5-230m, while training on a single H200 gpu.
the gains come from a better architecture. we took inspiration from deepseek, kimi, and other frontier open source models.
BarunLM combines hybrid local and global attention, grouped query attention to reduce memory, partial rope, gated attention, bounded swiglu, and residual selectors to improve how information flows through the network.
after pretraining, we further improved the model with rlvr (reinforcement learning with verifiable rewards) using deterministic verifiers and rloo, allowing the model to reinforce correct reasoning without relying on human preference labels.
One 8GB GPU, <100 lines of core code, one day — enough to go from zero to running the full SFT → DPO → GRPO post-training pipeline.
Along the way, a repro of RL's Razor (@pulkitology et al.): on the same new task, SFT degrades the model's general ability by 10–21%, on-policy RL only 0.3% — because RL updates close to the model's own distribution, learning without forgetting.
Then <$5 of a rented 48GB GPU reproduces a DeepSeek-R1 aha moment on a 3B model — in the spirit of TinyZero by @jiayi_pirate.
Full write-up and code👇
https://t.co/NsCeWHUTnh
How can an LLM switch between low-, medium-, and high-effort reasoning? And how does an LLM learn to reason more or less?
I put together a “little” article explaining how these effort levels are implemented at inference time and during training.
Beyond response length, it may be useful to define a critic model that estimates how much remaining value the current reasoning state has in reaching the correct answer, and then use that reasoning effort to decide when to stop. For example, one could compare the critic values over the most recent (k) steps with those over the preceding (k) steps as a relative measure of reasoning progress.