Show HN: Fine-tune an 8B model on a 4 GB laptop GPU
Posted by MakazhanAlpamys 2 days ago
Comments
Comment by cmiles8 2 days ago
While hosted mega models make headlines for doing cool stuff, the vast majority of applications for AI simply don't need all that power, and thus cost. That’s a big part of why businesses are screaming that there’s no ROI from AI.
Brining this tech down into small local models is likely where this all converges for the vast majority of use cases and what solves the present ROI crisis for LLM-based AI.
Comment by scotty79 2 days ago
It supports long contexts on limited VRAM and is blazing fast.
Comment by CITIZENDOT 2 days ago
Comment by swiftcoder 2 days ago
Comment by MakazhanAlpamys 2 days ago
Comment by user_7832 2 days ago
Comment by MakazhanAlpamys 2 days ago
Writing them myself now.
Comment by fintuner 2 days ago
Comment by wonger_ 2 days ago
Comment by fintuner 1 day ago
Comment by MakazhanAlpamys 2 days ago
Comment by simonw 2 days ago
They're all very short though. Anyone got a good rule for how much data of this nature is needed to successfully fine-tune a model of this size?
Comment by MakazhanAlpamys 2 days ago
Comment by MakazhanAlpamys 2 days ago
Comment by kamranjon 2 days ago
“The whole post-training stack in one CLI. Soup doctors your data pre-flight, picks the method, writes the config, derives evals from your own data, gates every save, and self-corrects reward hacking mid-run instead of just halting.”
How does soup auto tune the hyper parameters and make some of these more complex training decisions?
Comment by MakazhanAlpamys 2 days ago
Comment by MakazhanAlpamys 2 days ago
Comment by victor106 2 days ago
Comment by MakazhanAlpamys 2 days ago
New facts is where people waste a week. The model comes back wrong in a new way. Use RAG for facts.
Comment by MakazhanAlpamys 2 days ago
Comment by fintuner 2 days ago
Comment by dagurp 2 days ago
I have a couple of comments about https://trysoup.dev
> Get Started for Free
Does this mean that this will not be free at some point?
The website is difficult to read (gray on black doesn't work well for me).
Comment by MakazhanAlpamys 2 days ago
Comment by ranger_danger 2 days ago
Comment by MakazhanAlpamys 2 days ago
So it goes from "whole model must fit" to "embeddings plus one layer plus logits must fit". That is why 8B works and why I did not try 14B.
The table on the site is the normal resident path, streaming is opt-in and BETA. Should be clearer, my fault.
Comment by MakazhanAlpamys 2 days ago
Comment by bookmon 2 days ago
Comment by MakazhanAlpamys 2 days ago
Comment by bookmon 2 days ago
Comment by MakazhanAlpamys 1 day ago
the cheapest one is the one you already have.
more vram for the money is what i'd look for. usually used :)
Comment by bookmon 1 day ago
Comment by MakazhanAlpamys 1 day ago
Comment by MakazhanAlpamys 2 days ago
Comment by MakazhanAlpamys 2 days ago
The constraint everyone works around is that the frozen base has to fit in VRAM. But during LoRA the base is frozen — read, never written. It doesn't need to live in VRAM, it needs to arrive before the matmul that uses it. So it sits in host RAM and streams into a small pool of pre-allocated VRAM buffers, one decoder layer at a time, prefetched one ahead on a dedicated CUDA stream. Peak VRAM becomes one layer instead of the whole model.
Measured on an RTX 3050 Laptop (4 GB, Windows): Llama-3.1-8B in NF4 at 119.6 tok/s, 3.32 GB peak, 100% SM occupancy. Also Qwen2.5-3B with an un-quantized bf16 base at 143 tok/s in 2.15 GB, which is CUDA OOM when trained resident on the same card. Overhead is 1.43x vs resident, measured at 0.5B — the only size on this card with a valid resident baseline, and I publish that baseline so you can check the division.
Most of the work wasn't speed, it was correctness. Streaming fails silently: cut the autograd path and the loss still falls because the upper layers keep learning. So the bar was bit-exactness against a resident reference of the same numerics — max abs logit difference 0.0, across nine architecture families in two precisions, as a CI test rather than a one-off. That protocol caught a PEFT dispatch defect producing 0.94 logit divergence with byte-identical weights and adapters, no crash, no warning.
Not claiming anything above 8B — 14B NF4 needs ~7.5 GB page-locked against a measured 7.12 GB ceiling here, so I didn't run it. All numbers are Windows, so pessimistic vs Linux.
Measurement records, including the ones I threw away: https://github.com/MakazhanAlpamys/Soup/tree/main/benchmarks
Write-up: https://doi.org/10.5281/zenodo.21771064
Happy to answer anything about the scheduler or the correctness protocol.
Comment by selimthegrim 2 days ago
Comment by skeledrew 2 days ago
Comment by selimthegrim 2 days ago
Comment by MakazhanAlpamys 2 days ago
Comment by luhgor 1 day ago
Comment by MakazhanAlpamys 1 day ago
Comment by MakazhanAlpamys 2 days ago
Comment by h2aichat 1 day ago
Comment by fintuner 1 day ago
Comment by peepsick 2 days ago
Comment by indiantrains 2 days ago