# Parameter Golf: My OpenAI Model Craft Experiment I didn't come close to the Parameter Golf leaderboard, but I still had a lot of fun running scattered H100 experiments on Modal, hunting tiny BPB improvements while watching ideas collapse against artifact size limits, and figuring out the hard way why squeezing a capable model into 16 MB is trickier than it sounds. - Published: 2026-05-04 - Modified: 2026-05-04 - Tags: Pre-Training, Autoresearch - Canonical: https://aroramrinaal.com/ai/parameter-golf-openai-model-craft - GitHub: https://github.com/aroramrinaal/parameter-golf/tree/mri/lab-setup - X: https://x.com/arora_mrinaal/status/2046931839672340880  ## Why I Tried This In April I decided to participate in [OpenAI Model Craft: Parameter Golf](https://openai.com/index/parameter-golf/). The challenge was to train the best language model that fits inside a `16 MB` artifact and finishes training in under `10 minutes` on `8xH100 SXM` GPUs. The score is bits per byte on FineWeb validation, so lower is better. What made it interesting to me was that there was no hard parameter count limit. The real limit was whether the final artifact fit, whether training finished in time, and whether the model actually compressed text better. It was not just "make the model bigger." It was more like: can you make something small, compressed, slightly weird, and still useful? I started late. The challenge ran from March 18 to April 30, 2026, but I only started properly around April 17. So I was not entering with a polished research plan. I was entering with curiosity, a fork of the repo, cloud GPU credits, and a lot of questions. ## The First Thing I Had To Understand The first thing I had to understand was `BPB`, or bits per byte. I understood it as a tokenizer agnostic compression score. That mattered because I could try different tokenizers and vocab sizes, but the final evaluation still came back to the same thing: how well the model compressed the validation bytes. The next thing was artifact size. At first `16 MB` sounds impossibly tiny, but the baseline exports the model through int8 plus zlib compression, so raw model size has more room than it first looks like. Still, size became the thing I had to keep checking again and again. A run could have a better `val_bpb`, but if the compressed artifact crossed `16,000,000` bytes, it was not useful for the actual challenge. That became the first real lesson for me: in Parameter Golf, a result is not a result until the score and the artifact size both survive. ## Starting On RunPod I first tried the official RunPod path because the challenge was built around RunPod and had a template for it.  The setup was fairly direct. Create a pod, pick the Parameter Golf template, attach storage, SSH in, clone the repo, download the data, and run the training script. I also learned very quickly that storage choices matter here because the pod can be temporary, while the experiments need to survive beyond one session.    My first personal baseline was the unmodified OpenAI provided code on `1xH100`, one training shard, and the 10 minute wallclock cap. ```bash RUN_ID=baseline_sp1024 DATA_PATH=./data/datasets/fineweb10B_sp1024/ TOKENIZER_PATH=./data/tokenizers/fineweb_1024_bpe.model VOCAB_SIZE=1024 torchrun --standalone --nproc_per_node=1 train_gpt.py ```  That run gave me a `val_bpb` of `1.36785005`, a `val_loss` of `2.30955750`, and `1161` steps before the wallclock cap. The raw submission was around `67.3 MB`, but after int8 plus zlib compression it came down to around `13.1 MB`, which was safely inside the `16 MB` limit. Peak memory was only around `10.2 GiB`, so at least on the baseline path, memory was not the scary part.  That number became my personal benchmark. If a change did not beat `1.36785` on roughly the same `1xH100` setup, I knew it was probably not worth thinking about as a serious direction. The official leaderboard was a very different world though. Around mid April, the top scores were already much lower, and they were using techniques I had not explored yet.  So I kept two comparisons separate in my head. My `1xH100` baseline was for learning and comparing my own ideas. The leaderboard was the real mountain. ## Why I Moved To Modal RunPod worked, but for my way of experimenting it felt risky. I was doing short runs, debugging runs, one minute sanity checks, and then 10 minute comparison runs. With RunPod, I had to stay aware of the pod being alive even when I was just reading logs or editing files. That is not ideal when most of the work is iteration. Modal fit my workflow better because I already use it for my ML experiments, and it charges for active compute time. I could launch detached jobs, save logs and models into a volume, and avoid the feeling that idle infrastructure was quietly eating money.  The cost view made this very concrete. Most of my Parameter Golf spend sat under ephemeral app runs, and the chart clearly showed the bursty nature of the work. This is exactly why Modal made sense for me here. I was not trying to keep a long running machine alive. I was trying to run a lot of short experiments without turning every pause into a cost problem.   The final setup became my fork of [OpenAI's Parameter Golf repo](https://github.com/openai/parameter-golf), on the `mri/lab-setup` branch, running through `modal_train_gpt.py` on `1xH100 SXM` with one training shard and a 10 minute wallclock cap. I stored logs in `/mnt/experiments/logs/`, models in `/mnt/experiments/models/`, and kept the run history in [EXPERIMENTS.md](https://github.com/aroramrinaal/parameter-golf/blob/mri/lab-setup/EXPERIMENTS.md) because without a tracker these experiments become impossible to reason about. ## My Experiment Strategy The workflow became simple: run tiny jobs to catch bugs, then run 10 minute `1xH100` jobs for real comparisons, and only think about `8xH100` if the idea already looked good and the artifact size was valid. I did not want to spend final submission level money on a broken idea. The early wins came from boring changes. Longer sequence length helped. More layers sometimes helped, but crossed the size limit. `sp4096` with sliding evaluation became the first direction that felt actually interesting.
| Experiment | val_bpb |
Delta vs baseline | Size | Valid |
|---|---|---|---|---|
Baseline sp1024 |
1.36785 |
0.0000 |
13.1 MB |
yes |
sp4096 sliding eval |
1.28724 |
-0.0806 |
15.37 MB |
yes |
sp4096 QK gain 5.0 |
1.28397 |
-0.0839 |
15.51 MB |
yes |
sp8192 loop parallel |
1.28052 |
-0.0873 |
21.31 MB |
no |
← Swipe table to see more