Autopilot

soup autopilot is the zero-config entry point added in v0.25.0. You pass a model, a dataset, and a goal. Autopilot profiles the dataset, model, and GPU, then emits a soup.yaml with every hyperparameter chosen and justified.

Quick start

bash
soup autopilot \
  --model meta-llama/Llama-3.1-8B \
  --data chats.jsonl \
  --goal chat \
  --gpu-budget 24GB

Inputs

--model, --data and --goal are required when stdin is not a terminal: a missing one is a usage error (Missing option '--model' / '-m'., exit 2). In a terminal (since v0.76.0) Autopilot asks for whichever you left out: Base model (HF model id):, Dataset path (JSONL):, and a goal prompt that defaults to chat. A blank model or dataset exits 1. There is no way to pass a task: choosing one is what Autopilot is for.

FlagMeaning
--model / -mAny HuggingFace repo or local path (required; prompted in a terminal)
--data / -dJSONL dataset (alpaca / sharegpt / chatml / dpo / kto / tool-calling) (required; prompted in a terminal)
--goal / -gchat · reasoning · code · classification · tool-calling · alignment · domain-adapt (required; prompted in a terminal, default chat)
--gpu-budgetVRAM budget (defaults to detected GPU)
--output / -oConfig path (default: ./soup.yaml)
--dry-runPrint decisions without writing soup.yaml
--yes / -ySkip the confirmation prompt

What Autopilot decides

  1. Task — maps goal → SFT / DPO / GRPO / pretrain, including the tool-calling format where appropriate. Those four are the whole range: the seven goals above map to sft (chat, code, classification, tool-calling), grpo (reasoning), dpo (alignment) and pretrain (domain-adapt).
  2. Quantization — chooses none, 8bit or 4bit from the model size against your VRAM budget: none at 5 GB or more per billion parameters, 8bit from 3 GB, 4bit from 1.2 GB, and an error below that. A base that is already quantized (GPTQ, AWQ and similar) keeps its own format instead. A detected mxfp4 base is budgeted as the bf16 model it loads (2 bytes per parameter), and Autopilot refuses a --gpu-budget below that.
  3. PEFT — picks LoRA r=8/16/32 from dataset size, and turns on DoRA when the data is large and the VRAM headroom allows it. It does not select VeRA, and it does not turn LoRA off. DoRA stays off on a GPTQ, AWQ, AQLM or EETQ base, because peft cannot apply DoRA to those layers (v0.76.0, #1466).
  4. Batch size × grad_accum — estimates the per-device batch size from VRAM, then sets gradient accumulation to 32 // batch (at least 1), so the effective batch is about 32.
  5. Learning rate — scales with rank and quantization (e.g. LoRA r=16 → 2e-4, 4bit → ×0.8).
  6. Epochs — 5 → 3 → 2 → 1 depending on dataset size.
  7. max_length — the dataset's p95 token length times 1.1, rounded down, at least 256 and clamped to the model context.
  8. Perf flags — for the goals that train with SFT, turns on FlashAttention and Liger Kernel only when the GPU is Ampere or newer (compute capability 8.0 or higher) and the package is installed (flash-attn, or soup-cli[liger]); when the card qualifies but a package is missing, the Decisions panel names it and the install command. Before v0.76.0 it wrote both flags without checking, so soup train, --dry-run included, then refused the file Autopilot had just written. It also turns on gradient_checkpointing when max_length is above 8192 or the VRAM headroom (the budget minus 2 GB per billion parameters) is positive but under 4 GB. It does not choose a backend: backend: mlx is something you set yourself.
  9. Training intelligence — not written since v0.76.0. Through v0.75.2 Autopilot wrote forgetting_detection, checkpoint_intelligence and early_stop_on_regression as true, and soup train then printed "set but not enforced during training in this build"; it now leaves all three off and no longer prints them, because nothing enforces them. A config generated by an older Autopilot still carries the true values and still prints that note. For a check that does run, add --gate (see Training intelligence).

Autopilot prints its decisions in a Rich panel before it writes anything, and --dry-run stops there. The panel lists the values it chose, not a reason for each one, and it prints no time or VRAM estimate.

Example output

The command prints a summary panel (dataset, model, hardware, goal) and then the decisions. Here is the second one for a 15,000-row chat dataset, an 8B model, --gpu-budget 24GB and an Ampere-or-newer GPU with both kernel packages installed (on a card that qualifies but lacks the packages, the two kernel lines read off (flash-attn not installed; pip install flash-attn --no-build-isolation to enable) and off (liger-kernel not installed; pip install "soup-cli[liger]" to enable), and on a card below compute capability 8.0 they read False):

╭───── Autopilot Decisions ─────╮
│ Quantization: 8bit            │
│ PEFT: LoRA r=32, alpha=64     │
│ Batch size: 1 x grad_accum 32 │
│ Learning rate: 0.0001         │
│ Epochs: 2                     │
│ Max length: 2002              │
│ Flash Attention: True         │
│ Liger Kernel: True            │
╰───────────────────────────────╯
Config written: /home/you/project/soup.yaml

Safety

  • Dataset and output paths are resolved and constrained to the working directory (no path traversal).
  • GPU budget is bounded to 1GB–1TB; there is no time budget: --gpu-budget is the only budget the command accepts.
  • Model names are validated against HuggingFace Hub naming rules.
  • Model code is never executed during analysis — Autopilot uses HF Hub metadata only.

See also

Soup is free and Apache-2.0. If it saved you a training run, starring the repo costs nothing and helps most. You can also fund the GPU time behind the work a 4 GB laptop cannot reach.