LegionEdge
Docs

Fine-tune a model on your own data.

Teach an open base model your product, your tone, or your internal vocabulary. Upload a dataset, run a training job on our GPUs, check it actually got better, and serve the result — all from the console. Qwen3 4B Instruct is the fine-tunable base today.

1. Dataset format

A training set is JSONL: one JSON object per line, no wrapping array, no trailing commas. Each line is one conversation under a messages key, in the same shape you would send to the chat-completions API.

sft row (pretty-printed — one line per row in the file)
{"messages": [
  {"role": "system", "content": "You are Dustling Support, the assistant for Dustling Robotics home cleaning robots."},
  {"role": "user", "content": "What does error E01 mean?"},
  {"role": "assistant", "content": "E01 is a main brush jam. Flip the robot over, press the two grey tabs to lift the brush guard, pull out the brush and cut away any hair wound around the ends, then refit it until both tabs click."}
]}

The system message is optional but worth keeping consistent across rows: it is the instruction your tuned model learns to assume. The assistant content is the answer being taught — the target the model is scored against during training.

Every row is validated on upload against the purpose you pick, so a malformed corpus is refused at import rather than half-way through a training run. Rows and byte size are measured from the file you send, not typed in.

Not sure yet? The datasets page has a Use sample dataset action that imports a 100-row synthetic support corpus in exactly this format — enough to run the whole flow end to end and see what the output looks like.

2. Train

1Upload the dataset

Datasets → Import data, with the purpose set to SFT training. Console uploads take files up to 16 MiB; larger corpora go to the bucket directly.

2Start the job

Training → New job, pick your dataset and Qwen3 4B Instruct as the base. Only bases we can actually train are offered — the list is not the full model catalog.

Very small datasets are the one thing to avoid: a run needs enough steps to write a checkpoint at all, so aim for a few thousand rows rather than a few dozen.

3Watch the loss

The job page charts training loss per step while it runs. Loss falling and then flattening is the shape you want; loss that never moves usually means the dataset is too small or too repetitive.

4Collect the weights

On success the run produces a model of its own, and its weights are uploaded to durable storage rather than left on the training node — the artifact outlives the GPU it was produced on, and the job's artifacts tab shows where it landed.

3. Evaluate

A model that trained without errors is not the same as a model that got better. An evaluation suite is a second dataset — purpose Eval Q&A — of questions paired with the answer you consider correct.

eval-qa row
{"question": "What does error E01 mean?", "reference": "A main brush jam — lift the brush guard, clear hair from the brush, refit it."}

From Evaluations → New, pick a suite and select several models at once. Each model is asked every question, and a judge model scores the answer 0–100 against your reference, with its reasoning kept per question. Running your tuned model and its base in the same evaluation gives you the comparison that matters: the matrix shows both scores side by side, and the transcript shows exactly where they differ.

4. Deploy

A fine-tuned model is served from a dedicated endpoint. Deploy it, wait for it to reach Running, and call it exactly like a shared model — the endpoint's model id goes in the request body, and the base URL does not change.

The playground is the fastest way to confirm it works: pick your model, ask it something only your data would teach it, and compare against the base.