Surogate Train
Train and serve your own model.
One open-source engine to fine-tune, run RL and serve the result over the APIs your code already uses.
curl -LsSf https://github.com/invergent-ai/surogate/releases/latest/download/install.sh | bashA team scores its fine-tunes against a big model, on questions the training chats never asked. Filmed on a demo business.
Your model, for your work.
When a general model is not enough, or may not leave your network.
Enterprise
A model trained on your own chats
Mark good and bad sessions, train on them, and keep the version that scores best.
Read morePublic sector
An air-gapped install with your own models
Train and serve on your GPUs, with no connection out.
Read moreModel providers
Inference you sell
Serve your model on the engine, then list it on llm.buzz at your own price.
Read more
From your data to a served model.
Five steps, one engine, the same terminal.
01
Your data in
One YAML file names the base model, the recipe and your datasets. Python configures it; native C++/CUDA runs it.
# train.yamlmodel: Qwen/Qwen3-0.6Boutput_dir: ./outputrecipe: bf16 # fp8-hybrid for FP8; nvfp4 for Blackwell FP4lora: truelora_rank: 16datasets: - path: mlabonne/FineTome-100k type: auto
02
Fine-tune, distil or run RL
Reinforcement learning with reward environments, preference training, and teacher-to-student distillation.
- Adapters on BF16 bases or FP8, NVFP4 and BnB/NF4 quantization, including stacked LoRA.
- Threaded data parallelism, ZeRO sharding, and Ray across nodes.
$ surogate sft train.yaml03
Train in the precision your cards have
BF16, hybrid FP8 and Blackwell NVFP4.
- CPU offload for weights, gradients, optimizer state and activations, to train models larger than your cards.
# reciperecipe: bf16recipe: fp8-hybrid # FP8recipe: nvfp4 # Blackwell FP4
04
Merge, then serve on the same engine
Chat Completions, Completions, Responses and Messages endpoints, so existing clients connect unchanged.
- Load and unload adapters without restarting; pick one per request.
- K-quants, Q8_0 and IQ formats, or safetensors in BF16, FP8 and NVFP4.
$ surogate merge --base-model Qwen/Qwen3-0.6B \ --checkpoint-dir output --output merged$ surogate serve merged --served-model-name my-finetune
05
Answer many users at once
Continuous batching, chunked prefill, CUDA graphs, and up to 128 active sequences per model.
- MTP, and DFlash with a compatible drafter on a single GPU.
- Multi-GPU layer pipelines, CPU weight offload, and GPU expert caching for MoE models.
$ surogate serve Qwen/Qwen3.5-0.8B \ --served-model-name surogate \ --port 8080 --max-model-len 4096 \ --max-num-seqs 16 --kv-capacity auto $ curl -N http://127.0.0.1:8080/v1/chat/completions \ -H 'Content-Type: application/json' \ -d '{"model": "surogate", "stream": true, "messages": [{"role": "user", "content": "Hello"}]}'
# train.yamlmodel: Qwen/Qwen3-0.6Boutput_dir: ./outputrecipe: bf16 # fp8-hybrid for FP8; nvfp4 for Blackwell FP4lora: truelora_rank: 16datasets: - path: mlabonne/FineTome-100k type: auto
Prefer a window to a terminal?
Jackalope is the desktop app for the engine. Pick a model, pick a dataset, click your GPUs, hit Launch, and watch the loss fall, live. Linux, macOS and Windows.
Measured against the tools you would use instead.
Tokens a second, each row against the baseline it names.
- training tok/s · 4× RTX 5090 · Qwen3-0.6B FP4 LoRA
- 136,200
- training tok/s · 4× RTX 5090 · Qwen3-0.6B FP4 LoRA
- training throughput vs. Unsloth · 1× H100 · BF16 on both
- 2.53×
- training throughput vs. Unsloth · 1× H100 · BF16 on both
- serving tok/s, one user · 1× RTX 5090 · Qwen3.5-0.8B GGUF
- 802
- serving tok/s, one user · 1× RTX 5090 · Qwen3.5-0.8B GGUF
- serving throughput vs. llama.cpp · 8× RTX 5090 · 16 users
- 7.0×
- serving throughput vs. llama.cpp · 8× RTX 5090 · 16 users
Training
- Qwen3-0.6B · 1× H100 80 GB2.53× vs. UnslothSurogate53,900 tok/sUnsloth21,300 tok/s
- Qwen3-0.6B · 1× RTX 50901.36× vs. UnslothSurogate30,100 tok/sUnsloth22,100 tok/s
- Qwen3-8B · 1× RTX 50901.97× vs. UnslothSurogate6,900 tok/sUnsloth3,500 tok/s
Serving, on RTX 5090s
- Qwen3.5-0.8B · 1 user · 1 GPU2.32× vs. vLLMSurogate802 tok/svLLM346 tok/s
- Qwen3.5-0.8B · 8 users · 1 GPU4.05× vs. llama.cppSurogate2,765 tok/sllama.cpp683 tok/s
- Qwen3.5-4B · 100 users · 1 GPU1.19× vs. vLLMSurogate5,345 tok/svLLM4,481 tok/s
- GLM-5.3-Flash · 16 users · 8 GPUs7.0× vs. llama.cppSurogate292.9 tok/sllama.cpp41.9 tok/s
From the engine's README and its training and serving benchmarks.
Free to run. Or we train it for you.
The engine is Apache 2.0, free on your own GPUs. On our cloud a GPU costs $2.00 a GPU-hour. Or bring your data, and the team that builds the engine trains, evaluates and serves the model.
Questions
What can I train with it?
Pretraining and full fine-tuning, LoRA and QLoRA, GRPO, DPO and distillation, on one GPU or across nodes. Configuration is Python and YAML; execution is native C++/CUDA.
Which GPUs and precisions?
BF16, hybrid FP8 and Blackwell NVFP4, with FP8, NVFP4 and NF4 quantised bases for adapters. CPU offload lets you train models larger than your cards.
How do I serve the result?
With the same engine: surogate serve exposes Chat Completions, Completions, Responses and Messages endpoints, so existing clients connect unchanged. GGUF and Hugging Face checkpoints load natively.
How were the benchmarks measured?
Each row names its GPU, model, precision and baseline. The full tables are in the engine's repository, under docs/reference/benchmarks.md and surogate/serve/BENCHMARKS.md.
What is the licence?
Apache 2.0.
Can you train a model for us?
Yes. We train on your data, evaluate it and serve it on your hardware or ours. Contact Sales.
Install the engine.
One line installs it. Docs and examples are on GitHub.
curl -LsSf https://github.com/invergent-ai/surogate/releases/latest/download/install.sh | bash