- Hi — I’m Jasmin. This is my fine-tuned nanochat (not just the base model)
- What I built (the short version)
- What I did on Nebius (in plain terms)
- A mistake I made (so you don’t repeat it) — and the “proof”
- The screenshots — proof it runs on my machine
- What’s in this Hub (files)
- Try it yourself (beginner path)
- Quick troubleshooting
- Credits & license
- If you’re me updating this Hub later
- What I built (the short version)
Hi — I’m Jasmin. This is my fine-tuned nanochat (not just the base model)
I’m still learning a lot of this myself, so I’m going to explain what I actually did in normal words. If you’re a beginner too, hopefully this helps.
What I built (the short version)
I used nanochat — Andrej Karpathy’s small, readable stack for training little language models end to end.
There are two big phases people talk about:
- Base training — the model learns language from lots of text (like fancy autocomplete). It is not really a “chat buddy” yet.
- SFT (supervised fine-tuning) — you train it on conversations and instructions so it can answer in a chat style. That’s the part that makes the web UI feel like a tiny ChatGPT.
What you’re looking at on this Hub is the SFT step — my chat-tuned weights at step 483 (model_000483.pt), plus the small metadata file and tokenizer so you can run the same thing I run.
I did train / use a base model first (that’s where SFT starts from). I don’t upload the huge base checkpoint here because it’s another multi‑GB file, but I do include a couple of small files under artifacts/ so you can see which base step I came from (step 5568) and a tiny eval export — so it’s not “I only downloaded something”; it’s I went base → then SFT.
What I did on Nebius (in plain terms)
Nebius is a cloud provider where you can rent a GPU virtual machine — basically a powerful computer in someone else’s datacenter that you SSH into. Training SFT on my Mac alone would have been slow or not realistic, so I used a VM with serious GPUs (I followed 8× H100 in my notes; you can use fewer if you need to).
Roughly, my flow was:
- Make a VM on Nebius (Ubuntu, enough disk), note the public IP, SSH in with
ssh root@YOUR_IP. - From my Mac, copy the things the VM needs: my base checkpoint (~4 GB), tokenizer files, SFT data (like
identity_conversations.jsonl), and the nanochat code (or clone it on the VM). - On the VM, install Python tooling (
uv,uv sync --extra gpu), turn on the venv, and run SFT with nanochat’s script — for 8 GPUs something liketorchrun ... -m scripts.chat_sftwith a sensible--device-batch-size. - Wait while it trains (on 8 GPUs often on the order of 1–2 hours for a run like mine; 1 GPU takes much longer).
- Before deleting the VM — copy the new
chatsft_checkpointsfolder back to my Mac withscp. (More on that below — I learned this the hard way.)
The step-by-step version with exact commands lives in my repo as NEBIUS_SFT_GUIDE.md:
github.com/devchicajas/nanochat
Upstream nanochat: github.com/karpathy/nanochat
A mistake I made (so you don’t repeat it) — and the “proof”
The first time around, I was so focused on “did training finish?” that I deleted the Nebius machine before I had copied the SFT weights home. The checkpoints lived only on that VM’s disk. When the instance went away, that longer / better run didn’t come with me.
You can’t take a screenshot of “the mistake” itself — there’s no cute PNG of a disk that no longer exists. The proof it happened is just: I’m telling you, and the fact that the better run never showed up on my Mac or on this Hub. (If you’ve done cloud GPUs before, you’ve probably felt that stomach-drop moment too.)
What I do now: I treat “copy weights to my laptop” (or upload them) as part of the job, same as training — before I tear down the cloud box. I ls on the VM, rsync or scp, then ls on my Mac until I’m sure the big .pt files actually landed.
The messy screenshot below is real: my browser talking to nanochat on the cloud IP, the Nebius / SSH terminal on my Mac (rsync pulling nanochat + checkpoints — you can see things like base_checkpoints, identity_conversations.jsonl, etc.), and the server logs on the VM (Uvicorn, POST /chat/completions, GPU). I’m including it because it’s honest portfolio energy — yes, I messed up the shutdown once; yes, this is actually my stack, and yes, afterward I got serious about copying everything off the box first.
The model_000483.pt you can download here is the SFT checkpoint I actually saved and still run — the one that made it into my local nanochat-data folder and onto this Hub.
The screenshots — proof it runs on my machine
The pictures in huggingface_card/ are real screenshots from my browser while I ran nanochat’s local web UI (localhost — on my Mac after I brought the weights home). They’re not mockups.
So: yes, it works locally — you can load the model, open the page, and talk to it.
The answers in those chats are wrong sometimes (trees, matcha, a made-up “favorite anime”). That’s normal for a small model: it can sound confident and still hallucinate. I kept those screenshots on purpose so you see honest output, not a cherry-picked demo that pretends tiny models are always right.
What’s in this Hub (files)
| What | Why it matters |
|---|---|
model_000483.pt |
The SFT model weights (~4 GB). |
meta_000483.json |
Training step, validation score, architecture settings. |
tokenizer/tokenizer.pkl & token_bytes.pt |
You need these to run the model; I included them so you’re not hunting for mismatched files. |
artifacts/base_meta_005568.json |
A peek at the base run I started SFT from (step 5568). |
artifacts/base_eval_005568.csv |
A small base eval export from my setup. |
huggingface_card/*.png |
Local UI screenshots + one Nebius / rsync collage tied to the “deleted VM too early” story (see above). |
Heads-up: This is nanochat’s format (PyTorch checkpoints), not Hugging Face transformers / AutoModel. You run it with the nanochat code, not from_pretrained in the usual HF sense.
Try it yourself (beginner path)
1. Folder layout — nanochat looks for a root folder via NANOCHAT_BASE_DIR. I use something like ~/nanochat-data with this shape:
~/nanochat-data/
chatsft_checkpoints/d24/model_000483.pt
chatsft_checkpoints/d24/meta_000483.json
tokenizer/tokenizer.pkl
tokenizer/token_bytes.pt
2. Download from this Hub
pip install -U "huggingface_hub"
huggingface-cli download chicajas/nanochat-sft-d24-483 --local-dir ./hf-nanochat-sft-d24-483
mkdir -p "$HOME/nanochat-data/chatsft_checkpoints/d24" "$HOME/nanochat-data/tokenizer"
cp ./hf-nanochat-sft-d24-483/model_000483.pt ./hf-nanochat-sft-d24-483/meta_000483.json \
"$HOME/nanochat-data/chatsft_checkpoints/d24/"
cp ./hf-nanochat-sft-d24-483/tokenizer/tokenizer.pkl ./hf-nanochat-sft-d24-483/tokenizer/token_bytes.pt \
"$HOME/nanochat-data/tokenizer/"
export NANOCHAT_BASE_DIR="$HOME/nanochat-data"
3. Clone my fork, install, run the chat web app
git clone https://github.com/devchicajas/nanochat.git
cd nanochat
uv sync # or: pip install -e .
source .venv/bin/activate
export NANOCHAT_BASE_DIR="$HOME/nanochat-data"
python -m scripts.chat_web --source sft --step 483 --temperature 0.2 --port 8001
Open http://localhost:8001 — you should see the same kind of UI as in my screenshots (your URL might be 8001 or another port if you change it).
Quick troubleshooting
| Problem | What I’d check |
|---|---|
| Can’t find checkpoints | NANOCHAT_BASE_DIR and that chatsft_checkpoints/d24/ has both .pt and meta_000483.json. |
| Page won’t load | Something else using the port — try --port 8002. |
| Expected HF “Load model” button | This stack needs nanochat; that’s OK, just different. |
Credits & license
- nanochat — Andrej Karpathy: github.com/karpathy/nanochat
- This fine-tuned checkpoint and write-up — Jasmin Alvarez · github.com/devchicajas/nanochat
License should match nanochat and whatever data you use. There’s an MIT note in the Hub metadata; add a LICENSE file on the repo if you want it super explicit.
If you’re me updating this Hub later
brew install hf # or pip install -U "huggingface_hub"
hf auth login
cd /path/to/your-staging-folder
hf upload chicajas/nanochat-sft-d24-483 .
Big files: use hf upload-large-folder --help or the website uploader if Wi‑Fi is fussy.


