FAQ

General

What models does Soup support?

Any HuggingFace-compatible model. Popular choices include Llama, Mistral, Qwen, Phi, and Gemma families. Vision models (LLaMA-3.2-Vision, Qwen2-VL) and audio models (Qwen2-Audio) are also supported.

Do I need a GPU?

A CUDA-compatible GPU is strongly recommended. Soup supports 4-bit quantization to fit larger models on smaller GPUs. A 24GB GPU (RTX 3090/4090) can fine-tune 7B-8B models comfortably.

How is Soup different from other fine-tuning tools?

Soup is CLI-first and opinionated. One command to train, one YAML to configure. It wraps best practices (Unsloth, FlashAttention, optimal hyperparameters) so you don't have to research them. 23 training methods (text / vision / audio / ASR / TTS / classifier / distill / preference / MoLE routing / online DPO), 17 quantization formats, multimodal support, full pipeline from training to deployment. Plus, you can migrate from LLaMA-Factory, Axolotl, or Unsloth in one command.

What version is current?

Soup CLI v0.73.3, in the "Borrowed Hardware" line. The headline is still that you can fine-tune Llama-3.1-8B on a 4 GB laptop GPU, and since v0.72.4 align on the same card. Three releases have shipped since v0.73.0. Two of them repair an instrument rather than adding a capability: v0.73.1 fixed the whole free notebook tier, where bf16 was assumed on every CUDA card in fourteen places, and caught the streaming VRAM pre-flight under-predicting at long sequence; v0.73.2 stopped the SHIP verdict ranking by the wrong thing and added soup ship --noise-floor. The newest, v0.73.3, is the first release the maintainer did not write: all 24 of its pull requests came from other people, and what they found was four flags the schema validated, the docs described and nothing read. Underneath them, v0.73.0 is the release that took the method to hardware this project does not own: three borrowed days on an 8x H100 box, which confirmed it against a real resident reference up to 72B and found a silent gradient defect above 32B in NF4 that is repaired here. Set training.stream_layers: true and the frozen base is never loaded resident; it streams from CPU RAM one decoder layer at a time into a small pool of VRAM buffers while only the LoRA adapters stay resident, so peak VRAM is bounded by one layer instead of the whole model. Add quantization: 4bit (v0.72.2) and that RAM store shrinks about fourfold, which is what puts 8B within reach of a card that cannot hold a quarter of it. Measured on a 4 GB RTX 3050 Laptop at batch 1: Llama-3.1-8B at 119.6 tok/s in 3.32 GB (a pre-repair figure: it was measured before the v0.73.0 NF4 gradient repair and has not been re-run on that card since), Qwen2.5-3B at 264.2 tok/s in 1.76 GB, and on the bf16 path 3B at 143.1 tok/s in 2.15 GB, 1.5B at 525.0 tok/s and 0.5B at 978.6 tok/s. The honest cost is 1.43x slower than resident (measured at 0.5B), a streamed NF4 run is bit-exact against a resident NF4 run and that is a CI test rather than a one-off, and it ships BETA. Nothing above 8B has been measured on that 4 GB card, so there is no 14B claim for it; the larger sizes were measured on the borrowed H100 box instead.

v0.72.3 is the breadth release, and it is what turns streaming from a demonstration into something you can plan a run on. Nine architectures stream instead of three (Llama, Qwen, Mistral, Gemma, Phi), with the six new families each verified bit-exact against the same checkpoint loaded resident under both bf16 and NF4, though no throughput was measured for them so none is claimed. Batches above 1 and gradient accumulation both work, and at the same effective batch raising batch_size measured about 2.52x faster than accumulating. A pre-flight now predicts peak VRAM and refuses a run that will not fit, which matters because streaming bounds the weights but not the logits: on a 151,936-token vocabulary at batch 8 the logits tensor alone measured 8.71 GB, 146x the whole layer-buffer pool. --resume and --hf-resume work. And an NVMe disk overflow tier takes a base too large even for RAM, holding nothing resident, bit-exact against the RAM tier, with its speed deliberately left unmeasured rather than guessed.

v0.72.4 opened it to the preference losses. dpo, orpo, simpo and kto run against a streamed base now, so alignment stops being the step that forces a bigger card. DPO's reference model is the same streamed base with its adapters switched off, not a second copy: on a 365M-parameter synthetic fixture, streamed DPO peaked at 0.914x the streamed SFT peak with a byte-identical RAM store, and the control that forced a real second instance moved the peak by 730.44 MB against 730.44 MB of weights, exactly one copy. All four are bit-exact against a resident run of the same loss. Read that 0.914x as "no second copy" rather than as a saving, and note the cost that is not free: DPO reads the layer stack 1.52x as often per step. KTO is not reference-free however it is usually described, and it needs batch_size of 2 or more. No throughput figure is claimed for any preference loss, because none was measured. What remains scoped: task in sft, dpo, orpo, simpo, kto, transformers, text, plain LoRA. GRPO and PPO are permanently excluded, not pending. The measurement records behind all of it are published in full, and the work has a preprint: 10.5281/zenodo.21771064.

Is there a paper?

Yes. Layer streaming is written up as a preprint on Zenodo, CC-BY-4.0, cited by a concept DOI so a revision never strands a reference:

Exact Layer Streaming: LoRA Fine-Tuning of an 8B Model on a 4 GB Laptop GPU. Makazhan, A. (2026). Zenodo. 10.5281/zenodo.21771064.

The paper page is the short version, with the BibTeX entry. The result it defends hardest is not the throughput but the correctness protocol: a streamed trainer whose autograd graph has been severed still produces a falling loss, so the only meaningful evidence is bit-exactness against a resident reference of the same numerics, resident NF4 for a streamed NF4 run and never resident bf16. That discipline caught a dispatch path producing a 0.94 logit divergence with byte-identical weights and adapters, no crash and a healthy-looking loss curve. It is not on arXiv, so cite the Zenodo DOI above rather than an arXiv identifier.

v0.72.0 also made soup adapters arithmetic exact across mixed ranks instead of refusing them, and added --rank N.

v0.72.1 is an out-of-band correctness release, and it matters if you already used streaming: an adapter saved by a v0.72.0 streamed run is inert outside the streaming path, because its keys carried an extra .inner. segment and PEFT reports missing keys as a warning rather than an error, so soup merge, soup serve and soup chat all silently returned the untuned base. The training was correct and the bit-exactness results stand; only the saved file was wrong. Re-run that adapter. The same release also closed a hole where --hf-resume slipped around the --resume guard; both were then refused until v0.72.3 fixed the load side and unblocked them.

Underneath it, the v0.71 line is two stories plus a run of capstones: v0.71.0 split the install (pip install soup-cli is now a light, PyTorch-free CLI; pip install "soup-cli[train]" adds the training stack) and raised the floor to Python 3.10+, and v0.71.1 → v0.71.14 wired the entire schema-first roadmap live — the reward-hack / echo-trap detectors, ULD + MiniLLM distillation, mid-epoch RL checkpoints, soup iterative-dpo, RAFT span-mask training + soup ra-dit, CAA/ITI/RepE steering, ROME/MEMIT/AlphaEdit edits + GRACE, NPO/SimNPO/RMU unlearning, the SAE / sleeper / truth / harm / interference probes, the live eval / advise / tunability / diagnose runners, the soup build dbt-DAG materialiser, the Magpie generator, the soup compile / distill-prompt / compile-tools / local-rl train prompt family, VeRA/VB-LoRA multi-tenant serving, MoLE routing, FSDP shard consolidation, and serve-side KV-cache typing now all run end-to-end. Genuinely new in v0.71: ed25519 adapter/attestation signing with supply-chain merge gates, codecarbon energy/CO2 tracking, PDF Annex XI/XII docs, Soup Can v3 attestations, and a local audit log. v0.71.15 → v0.71.23 then closed the stub tail and added native Spectrum targeted training (soup spectrum scan + training.unfrozen_parameters), serve-time MoLE (soup serve --mole), soup agent eval --sandbox, soup train --cloud modal, GPT-2 + Mixtral knowledge editing, and live TTS / BitNet / MoE-quant trainers. v0.71.24 grew the recipe catalog from 116 to 133 with 17 new SFT recipes for the 2026 open-weight families (Qwen 3.5 / 3.6, DeepSeek-V4, GLM-5.1, Kimi K2.5 / K2.6, MiniMax M3, Mistral Large 3), v0.71.25 added soup ship, the one-command SHIP / DON'T-SHIP verdict, v0.71.26 closed the RL loop with reward-hacking auto-mitigation (the GRPO/PPO trainer self-corrects mid-run instead of only halting), plus a new qwen2.5-coder-7b-sft recipe (catalog 133 → 134). v0.71.27 "Fine-tune Doctor" added a pure-CPU pre-flight — soup data doctor (8 chat-template checks incl. the "never stops generating" EOS bug) and soup data lint (DPO length-bias as a Cohen's d effect size) — v0.71.28 shipped the soup mcp serve MCP server so any coding agent (Claude Code, Cursor, Cline, Continue) can drive Soup over stdio, v0.71.29 added soup shrink, one-command depth pruning with an optional distill-heal and a SHIP / DON'T-SHIP perplexity verdict, v0.71.30 let a Process Reward Model drive GRPO (PRM-guided GRPO), v0.71.31 shipped the judge-in-the-loop suite (Online DPO, best-of-N & Evol-Instruct, plus a pairwise judge win-rate for soup ship), v0.71.32 added ASR fine-tuning (task: asr fine-tunes Whisper on your own audio, soup infer --task asr reports WER/CER, whisper-tiny/base train on a 4 GB GPU), v0.71.33 shipped soup draft (train and, above all, measure a speculative-decoding draft: the measured verdict on our own validated pair was that it does not pay off, so the speedup pitch was withdrawn rather than shipped), v0.71.34 added adapter algebra (soup adapters arithmetic "coder + 0.5*math - toxic") and LISA (full fine-tune quality without a full fine-tune), and v0.71.35 shipped the compliance pack: regulation-shaped soup init --template hipaa|soc2|eu-ai-act|sr-11-7 configs, soup card model-card autogen from a registry entry, a soup ci init PR gate (validate to expect to ship, exit 2 blocks the merge), and GGUF export validated end-to-end on Windows for the first time. v0.71.36 "Data Moat II" added a semantic layer over your training data (soup data dedup --semantic, soup data topics) plus two tools for what a fine-tune forgets and leaks (soup data canary, soup train --replay), and v0.71.37 made every pip install "soup-cli[extra]" hint work on Windows cmd.exe and fixed eval-gate benchmark tasks. The v0.71 line closed with the eval-gate wedge: v0.71.38 gave the soup ship regression leg real teeth (answer-extraction scoring over seven bundled offline suites instead of substring-matched trivia), v0.71.39 closed the evidence loop (soup ship --emit-evidence + a committed ShipConfig + --push owner/repo#N, provenance-bound so the gate is CI for weights on every PR), and v0.71.40 + v0.71.41 shipped Reward Forge (soup reward synth auto-generates a deterministic reward verifier from your gold outputs and refuses a degenerate one, soup reward stress attacks a verifier with empty, padded, repetitive and sentinel-spam junk to prove it cannot be gamed). 369 test files, 23 training tasks, 19 data formats, 17 quantization formats, 144 recipes, 21 built-in templates. Apache-2.0 license since v0.29.0. Check with soup version --full.

Can I migrate from LLaMA-Factory / Axolotl / Unsloth?

Yes: soup migrate --from llamafactory config.yaml converts your existing config automatically. Supports LLaMA-Factory YAML, Axolotl YAML, and Unsloth Jupyter notebooks. Use --dry-run to preview without writing.

Are there ready-made configs?

Yes. Soup ships 144 recipes spanning Llama 3.1/3.2/4 (Scout + Maverick), Qwen 2.5/3 (incl. 30B and 235B MoE), the 2026 families (Qwen 3.5/3.6, DeepSeek-V4 Flash/Pro, GLM-5.1, Kimi K2.5/K2.6, MiniMax M3, Mistral Large 3 — v0.71.24), QwQ-32B, QVQ-72B, Gemma 3, Mistral, Phi-4, DeepSeek R1/V3 + all 6 R1-Distill sizes, plus v0.51 additions (GPT-OSS 20B/120B, GLM 4.6/5, Kimi K2 / K2-Thinking, MiniMax M2, Granite 4, LFM2, Cogito v2, Mistral Small 3 / Medium 3.5, Magistral / Devstral / Ministral, Baichuan 2), vision (Pixtral, Qwen2-VL, InternVL 3.5, LLaVA-Next, MiniCPM-V, Qwen-Image, DeepSeek-OCR, Paddle-OCR-VL), audio (Qwen2-Audio, Whisper-large-v3, Voxtral, SeamlessM4T-v2), ASR fine-tuning (whisper-tiny-asr / whisper-base-asr / whisper-large-v3-asr — v0.71.32), TTS (Orpheus, Sesame-CSM, Llasa, Spark, Oute — v0.52), BitNet (Falcon-E — v0.52), edge (SmolLM2 135M-1.7B, Phi-3.5-mini, LFM2), domain specialists (BioMistral, Meditron, CodeLlama, Magicoder, Mathstral, MedGemma, EmbeddingGemma), plus v0.62 RAG (raft-llama3-8b, ra-dit-retriever, ra-dit-llama3-8b), MLX-native, and multi-GPU (llama3-70b-fsdp2, qwen3-32b-zeropp, deepseek-v3-pipeline). Run soup recipes list to browse, soup recipes search llama to filter, and soup recipes use llama3.1-8b-sft to start training instantly.

Training

How long does training take?

Depends on model size, dataset, and hardware. A 1B model with 10K samples on an RTX 4090 typically takes 15-30 minutes with SFT. With Unsloth backend, 2-5x faster.

Can I resume training from a checkpoint?

Yes: soup train --config soup.yaml --resume auto (latest checkpoint) or --resume ./output/checkpoint-500 (specific checkpoint).

Does Soup support multi-GPU?

Yes. v0.27.0 added topology-aware soup train --gpus N launch, ZeRO++ (quantized weights + grads), FSDP2 + torch.compile, pipeline parallelism (parallelism: pipeline + pipeline_stages), and the DeepSpeed-MII serving backend. See Multi-GPU Mastery.

What training methods are available?

23 methods: SFT, DPO, Online DPO (v0.71.31 — on-policy against an LLM judge or a reward model, wraps TRL OnlineDPOTrainer), GRPO, PPO, KTO, ORPO, SimPO, IPO, BCO (v0.40), Pretrain, Embedding, Reward Model, the unified preference dispatcher (v0.40 — set training.preference_loss: dpo|simpo|orpo|ipo|bco to swap loss without renaming the task), PRM (v0.50 Process Reward Model — also usable as the per-step reward inside GRPO via PRM-guided GRPO, v0.71.30), TTS (v0.52 — Orpheus / Sesame-CSM / Llasa / Spark / Oute), ASR (v0.71.32 — Whisper fine-tuning with built-in WER/CER), Classifier / Reranker / Cross-Encoder (v0.52), Distill (v0.52 — kl / forward_kl / reverse_kl / js divergences), Unlearn (v0.61 — NPO / SimNPO / RMU), and MoE LoRA Routing (v0.67 — MoLE per-token gating over 2..64 task adapters). Plus soup edit set (v0.61 — ROME / MEMIT / AlphaEdit) and soup steer train (v0.62 — CAA / ITI / RepE) as inference-time / weight-surgery surfaces.

Can I auto-push checkpoints to HuggingFace during training?

Yes — soup train --push-as user/my-model uploads every save_steps checkpoint to HF Hub as a checkpoint-<N> branch. Pair with --hf-resume to pull the latest branch and keep going after a spot-instance preemption. Set HF_ENDPOINT=https://hf.internal.example.com to target a self-hosted Hub. See HF Hub integration.

Can I train faster on large-vocab models?

Yes — v0.28.0 adds Cut Cross-Entropy (use_cut_ce: true), which avoids materialising the full [seq × vocab] logits tensor. Best on Llama 3 / Qwen 3 (vocab ≥ 128k). Install with pip install "soup-cli[cce]". v0.28 also ships FP8 training on Hopper+ GPUs, tiered gradient checkpointing, kernel auto-composition, cross-document attention masking, and CPU/disk activation offloading. See Training speed & memory.

Data

What data formats are supported?

19 formats: Alpaca, ShareGPT, ChatML, DPO, KTO, LLaVA, ShareGPT4V, Plaintext, Embedding, Audio, Tool-calling, Auto, PRM, Pre-tokenized, Input-output, Video, Multimodal (v0.42), RAFT (v0.62 Retrieval-Augmented Fine-Tuning — query + golden_doc + distractors + answer), and ASR (v0.71.32 Whisper fine-tuning — {"audio": path, "text": transcript}). Format is auto-detected from the first row. Local paths or remote URIs (s3 / gs / az / abfs / oci). Use soup data convert to switch between formats. v0.69 adds soup build (dbt-shaped DAG of dataset transforms with incremental materialisation), soup expect (Great Expectations suite for chat data), and soup data brain-rot (AI-slop detector — refuses to train on clickbait).

How much data do I need?

For SFT, 1K-10K high-quality samples is a good starting point. Quality matters more than quantity. Use soup data filter to check data quality.

Can I generate synthetic data?

Yes: soup data generate --prompt "Create math problems" --count 100. Supports OpenAI, Ollama, Anthropic Claude, vLLM, and custom servers. Includes domain templates (code, conversation, QA, preference, reasoning) and a full quality pipeline.

Deployment

How do I serve my model?

soup serve --model ./output --backend vllm for production. The API is OpenAI-compatible.

Can I export to llama.cpp / Ollama?

Yes: soup export --model ./output --format gguf --quant q4_k_m

What export formats are supported?

GGUF (llama.cpp/Ollama), ONNX (cross-platform), TensorRT-LLM (NVIDIA optimized), AWQ, and GPTQ (quantized deployment).

Troubleshooting

How do I see full error messages?

Use soup --verbose <command> for full tracebacks.

How do I check my environment?

Run soup doctor to check Python version, GPU availability, dependency versions, and get fix suggestions.

ImportError: DLL load failed while importing _C on Windows

That is PyTorch, not Soup: the installed wheel does not match your CUDA runtime. Reinstall torch from the index for your CUDA version, for example pip install torch --index-url https://download.pytorch.org/whl/cu121.

soup version disagrees with pip show soup-cli

You have more than one Python installation and they are not the one you think. Use a virtual environment. This is worth taking seriously rather than ignoring, because the two commands read different things: soup version reads the source that is actually going to run.

My environment used to work and now something is off

soup env check audits your installed packages against the version bounds Soup itself declares and exits 3 when one is violated, with no lock file required. The usual cause is a later pip install of a serving stack into a training environment. soup env fix then prints a reproducible install plan from your lock file.

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.