GPU scheduling for small teams
Four GPUs, nine engineers and a lot of idle time. How a simple queue and a few house rules doubled our utilisation.
Daniel Reyes2 min read
When we bought our first four GPUs, we assigned them the obvious way: one per person who asked first. Three months later, monitoring showed average utilisation of 23%. Meanwhile, people waited days for a free card. The hardware was not the bottleneck; the allocation was.
Measure before you schedule
We exported per-GPU utilisation and memory every 30 seconds and looked at a week of data. The pattern was clear: notebooks held GPUs for days while running for minutes. Long training runs ran at night but nobody could start them reliably because a card was "reserved".
A queue, not a calendar
We replaced the spreadsheet of reservations with a job queue. We chose a lightweight scheduler rather than a full Kubernetes stack, because for four to sixteen GPUs the operational overhead of a cluster manager is hard to justify.
The rules we settled on:
- Interactive sessions are capped at four hours and one GPU, and are pre-empted after 30 minutes idle.
- Batch jobs go through the queue with a declared GPU count and time limit.
- Long runs checkpoint every 30 minutes so they can be pre-empted and resumed.
- Nights and weekends favour batch, weekdays favour interactive work.
# Submit a fine-tuning run: 2 GPUs, max 10 hours, resumable
queue submit \
--gpus 2 \
--time 10h \
--checkpoint-dir /shared/ckpt/$USER/run-42 \
-- python train.py --config configs/lora.yaml --resume autoMake idle time visible
We post a daily summary to the team channel: utilisation per GPU, queue wait times, and the top three idle reservations. Nobody likes appearing on that list twice. Social pressure turned out to be the cheapest scheduler feature.
Results
Utilisation went from 23% to 58% in the first month, and median queue wait for a single GPU dropped below 20 minutes. We postponed buying more hardware by two quarters.
Keep reading

The hidden cost of tokens
Per-token prices keep falling, yet our bill kept rising. Where the tokens were really going, and the five changes that cut spend by 61%.
Daniel Reyes2 min read

