Bring small, clean examples
Upload JSONL directly, or use the optional Qwen formatter and inspect its proposed records before training.
Upload messy text training data, upload a base model and learning focus, then download a verified native adapter. There is one fixed price, a visible queue, and no cloud-manifest archaeology.
Checking the studio…
We choose which model images are admitted, generally if it's safetensors or from HuggingFace, it's fine. You choose which admitted model to adapt, a sensible learning focus, and your reviewed JSONL or messy text-ish data. You can choose to have it formatted for us at no extra cost. GPUless does the awkward part.
Upload JSONL directly, or use the optional Qwen formatter and inspect its proposed records before training.
A credit admits one bounded job. It shows its place in the single-worker FIFO and a conservative completion estimate.
Finished artifacts are private to your sign-in and carry an integrity digest plus their exact admitted model revision.
The base causal model runs its real forward pass from host DRAM. GPUless computes normal language-model loss; you get a LoRA download that you can apply to your model.
The pTPU path is a cache-fanatic native engine for LLM adapters, paired measurements, optimizer state, checkpoints, and export. It keeps the expensive base model honest while avoiding a permanently reserved training GPU for the adapter portion.
This is not magic “GPU performance on any CPU.” It is a deliberately engineered training shape: local admitted models, finite plans, an explicit FIFO, and a virtual tensor processing unit made from matmul optimizations, a lot of work, and an ultra L1 cache friendly execution shape with a few twists.
Checking the pTPU runtime…
This separate GPU stage turns messy UTF-8 source material into reviewable training JSONL. It never starts a job by itself.
What makes a useful training example?
The studio accepts an administrator-admitted local model ID, never a path. JSONL is validated before it exists as a job. ZIP/tar.gz inputs yield exactly one admitted JSONL member; anything else is ignored or rejected.
Loading your private jobs…