Turn your data into a state-of-the-art AI model
Penstock lets you train your own LLM or generative model for a fraction of the usual cost. No infrastructure setup and no compute sourcing; the pipeline does it automatically.
Four steps between a folder and a model that answers.
The pipeline handles scheduling, checkpointing and failure recovery. You handle the data and the eval.
Point it at your data
Upload a folder or connect a bucket. Penstock parses, deduplicates and tokenises, then shows you what it threw away and why.
Pick a base and a budget
Choose an open base model and a ceiling in dollars or hours. The planner returns the largest run that fits, before you commit.
The cluster schedules itself
Capacity is bid for across regions and preemptions are resumed from the last checkpoint. You watch loss curves, not a queue.
Evaluate, then serve
Run your eval set against every checkpoint, promote the one that wins, and serve it from a hosted endpoint or export the weights.
Bases that are actually yours to keep.
Every base is open-weight. Train it, export it, run it on your own hardware. No licence that expires when the invoice does.
Penstock 8B
The default. Fast to fine-tune, cheap to serve, and strong enough for retrieval, classification and structured extraction.
- Context
- 128K
- Tune time
- ~4h
- From
- $180 / run
Penstock 34B
For reasoning-heavy work and long documents. Sits in the range where a fine-tune usually beats a bigger general model.
- Context
- 256K
- Tune time
- ~14h
- From
- $740 / run
Diffusion XL
Image generation on your own catalogue. Trains on as few as 800 labelled assets and keeps a consistent house style.
- Res
- 1024²
- Tune time
- ~6h
- From
- $310 / run
Embed 1B
A small embedding model tuned on your vocabulary. Usually the cheapest way to make retrieval stop returning nonsense.
- Dims
- 1536
- Tune time
- ~50m
- From
- $40 / run
Speech M
Transcription tuned to your domain vocabulary and accents. Handles the jargon that generic models spell three different ways.
- Langs
- 42
- Tune time
- ~3h
- From
- $120 / run
Bring your own
Any open-weight checkpoint from the usual hubs. If it loads in transformers, the scheduler will pick it up.
- Format
- Safetensors
- Tune time
- Varies
- From
- Metered
One command, then go home.
The CLI mirrors the API exactly. Everything the dashboard can do is a flag, and every run is reproducible from its manifest.
# tokenise a folder and start a run $ zf train ./handbook \ --base penstock-8b --method lora \ --budget 200usd --eval ./evals/support.jsonl ✓ parsed ✓ planned ✓ scheduled epoch 1/3 loss 1.94 → 1.12 epoch 2/3 loss 1.12 → 0.86 epoch 3/3 loss 0.86 → 0.71 ✓ checkpoint
# score every checkpoint against your eval set $ zf eval handbook-8b --set ./evals/support.jsonl --all ckpt exact helpful refusal latency @1 0.612 0.704 0.031 412ms @2 0.688 0.771 0.024 409ms @3 0.741 0.802 0.019 411ms ← best ✓ promoted
# serve it, or export the weights and self-host $ zf serve handbook-8b --replicas 2 --scale-to-zero ✓ endpoint ✓ cold start $ zf export handbook-8b --format gguf --quant q5_k_m ✓ written
You pay for the run, not the cluster.
Compute is billed per GPU-hour at the rate the scheduler actually won it for. No reserved capacity, no minimum, no seat licence.
Enough to prove the idea on a small corpus before anyone signs anything.
- $40 of compute credit
- Models up to 8B
- Community support
Metered training on shared capacity. The plan almost everyone runs on.
- Every base, every method
- Spot recovery and checkpointing
- Hosted endpoints, scale to zero
- Weight export, always
Dedicated capacity in your region, with a contract that names the hardware.
- Guaranteed GPU pool
- VPC peering, data residency
- Named research engineer
Your data is already the differentiator.
Stop renting someone else's general model. Train the one that knows your domain, and keep the weights.