Getting Started

Installation

As of v0.71.0 the install is split. pip install soup-cli is a light, PyTorch-free CLI + data-tools install — soup init, soup data …, and the inspection commands all work on it. To fine-tune, add the [train] extra:

bash
# Light core: CLI + config + data tools, no PyTorch
pip install soup-cli

# Add the training stack (torch, transformers, peft, trl, datasets, …)
pip install "soup-cli[train]"

# Everything (train + serve + ui + data + mcp) in one shot
pip install "soup-cli[all]"

# Or from GitHub (latest dev)
pip install git+https://github.com/MakazhanAlpamys/Soup.git

Upgrading from ≤ v0.70? pip install soup-cli no longer pulls PyTorch. If you train, reinstall with pip install "soup-cli[train]" — a missing heavy dependency now surfaces a friendly Training needs the [train] extra message instead of an ImportError.

Requirements

On Debian 12, Ubuntu 23.04 or anything newer, plain pip install fails outside a virtualenv with error: externally-managed-environment, and it is not a Soup problem.

Those distributions ship an EXTERNALLY-MANAGED marker in the system Python, so pip refuses to write into a site-packages that apt also manages (PEP 668). It is the default on current Debian and Ubuntu, so it is the ordinary first-run experience there rather than an edge case, and nothing in Soup can rescue it: the package is not installed yet when the command runs.

Soup declares a soup console script, which makes it an application rather than a library, so upstream's README now leads with pipx:

bash
pipx install soup-cli               # or: uv tool install soup-cli
pipx install "soup-cli[train]"      # extras spelled exactly as below

Both give Soup its own virtualenv and put the command on PATH, which is outside PEP 668's scope entirely. Every pip line on this page stays correct inside a virtualenv, a Colab notebook or a Docker image, and python3 -m venv .venv then plain pip works just as well. Use pip rather than pipx if you also want to import soup_cli from your own code, because pipx isolation is the wrong shape for that.

Default: resident QLoRA

  • Python 3.10 to 3.12 (the floor was raised from 3.9 in v0.71.0; v0.73.0 added the upper bound, because on 3.13 and above pip resolved untested PyTorch wheels that crash inside the native extension before Soup runs)
  • The [train] stack, as of v0.75.2: torch>=2.6.0, transformers>=5.16.1,<6.0.0, trl>=0.29.0,<1.0.0, peft>=0.20.0,<1.0.0, accelerate>=0.27.0. A fresh install resolves all of that for you. One consequence worth knowing: pip install "soup-cli[train,mlx]" resolves for the first time in v0.74.0, because the two extras previously declared transformers ranges that could not be satisfied together at all
  • CUDA-compatible GPU (recommended); Apple Silicon (MPS) or CPU (experimental) also work
  • 8 GB+ VRAM for 7B models with QLoRA

The torch floor moved to 2.6.0 in v0.75.0, and that closed a real trap. v0.74.0 declared torch>=2.5.0 while trl>=0.29 could not import at 2.5.1 at all, because it needs the public FSDP2 API that arrives in 2.6.0, so a pinned 2.5.x environment silently lost DPO, KTO, GRPO and BCO. pip could not catch it, since trl declares no torch dependency. v0.74.0 published the hole rather than guessing at a fix, because 2.5.1 was measured to fail and 2.6 had not been measured to work; v0.75.0 raised the floor and proved it in CI. If you pin torch yourself, pin 2.6.0 or newer.

If the model does not fit: layer streaming (opt-in, BETA)

  • Set training.stream_layers: true in soup.yaml and the frozen base never loads into VRAM: Llama-3.1-8B fine-tunes in 3.32 GB on a 4 GB card. Slower than resident training, so leave it off for a model that already fits. See Layer Streaming.

Streaming bounds the decoder stack to one layer at a time. Embeddings and the logits tensor stay resident, so peak VRAM still depends on the model, just much less.

Optional Extras

bash
pip install "soup-cli[train]"      # Training stack: torch, transformers, peft, trl, …
pip install "soup-cli[fast]"       # Unsloth 2-5x training speedup
pip install "soup-cli[mlx]"        # Apple Silicon backend (M1–M4)
pip install "soup-cli[serve]"      # FastAPI inference server
pip install "soup-cli[serve-fast]" # vLLM backend
pip install "soup-cli[sglang]"     # SGLang backend
pip install "soup-cli[eval]"       # lm-evaluation-harness
pip install "soup-cli[data]"       # MinHash dedup + semantic split (scikit-learn)
pip install "soup-cli[data-pro]"   # langdetect + Presidio PII
pip install "soup-cli[vision]"     # Pillow for vision fine-tuning
pip install "soup-cli[audio]"      # librosa + soundfile
pip install "soup-cli[qat]"        # Quantization-aware training
pip install "soup-cli[liger]"      # Liger Kernel fused ops
pip install "soup-cli[onnx]"       # ONNX export
pip install "soup-cli[tensorrt]"   # TensorRT-LLM export
pip install "soup-cli[awq]"        # AWQ quantized export
pip install "soup-cli[gptq]"       # GPTQ quantized export (a separate extra)
pip install "soup-cli[ui]"         # Web UI dashboard
pip install "soup-cli[tui]"        # Full-screen Textual dashboard
pip install "soup-cli[trackers]"   # MLflow / SwanLab / Trackio logging
pip install "soup-cli[wandb]"      # Weights & Biases, for soup train --wandb
pip install "soup-cli[generate]"   # httpx, for soup data generate provider calls
pip install "soup-cli[deepspeed]"  # ZeRO distributed training
pip install "soup-cli[ring-attn]"  # ring-flash-attn (training.use_ring_attention is checked but not applied in v0.75.2)
pip install "soup-cli[remote]"     # Remote datasets (s3 / gs / az; oci needs ocifs, installed separately)
pip install "soup-cli[sign]"       # ed25519 adapter / attestation signing
pip install "soup-cli[compile]"    # DSPy / GEPA / TextGrad prompt compiler
pip install "soup-cli[carbon]"     # codecarbon energy / CO2 tracking
pip install "soup-cli[modal]"      # Serverless cloud GPU (soup train --cloud modal; --cloud lambda needs no extra)
pip install "soup-cli[aider]"      # Aider CLI, for soup eval aider (v0.74.0)
pip install "soup-cli[mcp]"        # MCP server (soup mcp serve) for coding agents
pip install "soup-cli[cce]"        # Cut Cross-Entropy (training.use_cut_ce)
pip install "soup-cli[mix]"        # scikit-optimize, for soup data mix --optimize
pip install "soup-cli[pdf]"        # reportlab, for the EU AI Act Annex XI/XII PDFs
pip install "soup-cli[dev]"        # the test and lint stack, for contributing
pip install "soup-cli[all]"        # shorthand for train + serve + ui + data + mcp

Use double quotes, and here is why

pip install "soup-cli[train]" is the only spelling that works in every shell: cmd.exe, PowerShell, bash and zsh. Every command above uses it.

Older tutorials and videos, including some of ours, show the single-quoted pip install 'soup-cli[train]'. That is bash, zsh and PowerShell syntax. Windows cmd.exe has no single-quote quoting, so it hands the quotes straight to pip:

ERROR: Invalid requirement: "'soup-cli[train]'": Expected package name at the start of dependency specifier

If you hit that, swap the ' for ". Nothing is wrong with the package: pip is rejecting a literal quote character. Dropping the quotes entirely also works on Windows, but then zsh reads [train] as a glob and fails instead.

Quick Start

1. Create a config

bash
# Interactive wizard
soup init

# Or use a template
soup init --template chat

2. Train

bash
soup train --config soup.yaml

Soup automatically detects your GPU, sets optimal batch size, configures LoRA, and begins training.

3. Chat with your model

bash
soup chat --model ./output

4. Push to HuggingFace

bash
soup push --model ./output --repo your-username/my-model

5. Export and serve

bash
# Export to GGUF for Ollama / llama.cpp
soup export --model ./output --format gguf --quant q4_k_m

# Start OpenAI-compatible server
soup serve --model ./output --port 8000

Health Check

Check your environment for compatibility issues:

bash
soup doctor

Shows Python version, GPU availability, all dependency versions, and fix suggestions.

Quick Demo

Run a complete demo in one command:

bash
soup quickstart          # Creates sample data + config + trains TinyLlama
soup quickstart --dry-run # Just create files without training

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.