Fine-tune LLMs from one YAML. Layer streaming trains an 8B model on a 4 GB laptop GPU.
Go to file
Sanjay Santhanam 3b752b7b60
fix(eval): run built-in benchmark gate tasks (#315)
Use ForgettingDetector for benchmark tasks instead of probing a nonexistent helper. Cover successful scoring and unknown benchmark errors.
2026-07-17 16:30:16 +05:00
.github ci: warm HF Hub cache before tests to fix tiny-model 429 flake 2026-06-04 19:53:33 +05:00
docs docs: v0.71.36 Data Moat II (version bump + CHANGELOG + docs) 2026-07-17 12:03:15 +05:00
examples docs(train): v0.71.26 release — closed-loop reward-hacking mitigation 2026-07-01 16:55:59 +05:00
src/soup_cli fix(eval): run built-in benchmark gate tasks (#315) 2026-07-17 16:30:16 +05:00
templates Initial project setup: CLI skeleton + config + trainer + data pipeline 2026-02-20 16:14:56 +05:00
tests fix(eval): run built-in benchmark gate tasks (#315) 2026-07-17 16:30:16 +05:00
.dockerignore Enhance #14 - Add official Docker support for easier onboarding (#20) 2026-04-10 23:04:00 +05:00
.gitignore chore: stop tracking internal planning docs 2026-07-05 20:52:50 +05:00
.mailmap docs: add CONTRIBUTORS.md + .mailmap; Recognition section; fix test-count drift 2026-06-02 15:25:19 +05:00
.pre-commit-config.yaml chore: project hygiene — py.typed, pre-commit, mypy CI, CHANGELOG, slim SECURITY.md 2026-05-31 19:44:47 +05:00
AGENTS.md docs: drop all public references to the gitignored CLAUDE.md / plan.md 2026-06-01 12:05:36 +05:00
CHANGELOG.md docs: v0.71.36 Data Moat II (version bump + CHANGELOG + docs) 2026-07-17 12:03:15 +05:00
CODEOWNERS chore: migrate to src-layout 2026-05-31 12:40:06 +05:00
CODE_OF_CONDUCT.md Fix Phase 6.1 community files: real emails, DPO data format, correct file names 2026-03-24 11:19:56 +05:00
CONTRIBUTING.md docs: correct the test count to the measured 16283 2026-07-17 12:31:37 +05:00
CONTRIBUTORS.md docs: credit @Ekaanksh-dev for batched PRM reward forward (#301) 2026-07-08 21:08:11 +05:00
Dockerfile chore: release v0.71.0 — split heavy deps into [train] extra 2026-06-01 12:27:08 +05:00
LICENSE chore(license): migrate from MIT to Apache-2.0 2026-04-21 22:32:42 +05:00
NOTICE chore(license): migrate from MIT to Apache-2.0 2026-04-21 22:32:42 +05:00
README.md docs: v0.71.36 Data Moat II (version bump + CHANGELOG + docs) 2026-07-17 12:03:15 +05:00
SECURITY.md feat(prompt-compile): live soup compile / distill-prompt / compile-tools / local-rl train (v0.71.13) 2026-06-04 22:14:43 +05:00
docker-compose.yml fix(docker): correct image name and modernize compose file 2026-04-10 23:06:04 +05:00
pyproject.toml docs: v0.71.36 Data Moat II (version bump + CHANGELOG + docs) 2026-07-17 12:03:15 +05:00
soup.png fix: replace SVG logo with PNG (GitHub doesn't render SVG in README) 2026-04-01 18:22:06 +05:00
soup_logo_svg.svg fix: use relative logo path in Web UI, add SVG logo to repo 2026-04-01 18:23:57 +05:00

README.md

Soup

Soup

Fine-tune and post-train LLMs in one command. No SSH, no config hell.

Website · Quick Start · Config · Docs · Commands · Models

PyPI Downloads Python 3.10+ Apache-2.0 License Tests CI Website


Soup turns the pain of LLM fine-tuning into a simple workflow. One config, one command, done.

pip install 'soup-cli[train]'   # add [train] to fine-tune; bare `soup-cli` is the light CLI
soup init --template chat
soup train

Why Soup?

Training LLMs is still painful. Even experienced teams spend 30-50% of their time fighting infrastructure instead of improving models. Soup fixes that.

  • Zero SSH. Never SSH into a broken GPU box again.
  • One config. A simple YAML file is all you need.
  • Auto everything. Batch size, GPU detection, quantization — handled.
  • Works locally. Train on your own GPU with QLoRA. No cloud required.

What's New

v0.71.36 — Data Moat II. A semantic layer over your training data, plus two tools for what a fine-tune forgets and what it leaks.

  • soup data dedup --semantic — dedup by meaning, not by shared tokens. Catches reworded duplicates MinHash's shingling scores as distinct. Zero new dependencies.
  • soup data topics <data> — cluster your data and get a coverage table (82% code · 6% math · 1% safety) with a warning for thin topics, so you can see what you are actually training on.
  • soup data canary insert|check — insert unique secrets, then prove whether a model memorized them: each secret's loss is ranked against never-inserted controls. Exit 2 on a leak, so CI can gate. On SmolLM2-135M a memorized set lands at percentile 0.0 against a clean model's 4%93% spread.
  • soup train --replay old.jsonl — continual-learning rehearsal: interleave your old data so the new task doesn't erase it.
  • Honest result: semantic dedup is not a paraphrase detector. Measured, paraphrase cosines (0.490.76) overlap with genuinely-distinct rows (0.540.76) — "Add two numbers" vs "Multiply two numbers" scores higher than a real paraphrase — so no threshold separates them. The default is deliberately conservative; see the CHANGELOG.
  • Two blocking bugs fixed: the hardware-fit gate refused to train any model you merged yourself (a local checkpoint's name has no size marker, so it guessed 7B and predicted 16 GB), and every pip install 'soup-cli[extra]' hint printed without the extra — 17 sites where the suggested command succeeds and leaves the feature still broken.
soup data topics train.jsonl                    # what am I actually training on?
soup data dedup train.jsonl --semantic -o clean.jsonl

soup data canary insert train.jsonl -o canaried.jsonl --manifest secrets.json
soup data canary check --manifest secrets.json --base ./my-model  # exit 2 = leak

soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
Previous release — v0.71.33, soup draft (measure speculative decoding)

soup draft measure reports a draft model's acceptance rate + real plain-vs-assisted tok/s (exit 0/2/1 for CI); soup draft distill distils your target into a dense tiny draft, auto-wired into soup serve --auto-spec. The honest result on a small same-family pair: distillation didn't move acceptance (69.3% → 69.3%) and assisted decoding was a net slowdown — which is exactly the number you want before shipping speculative decoding.

soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \
  --prompts prod-prompts.jsonl        # -> acceptance %, real tok/s, ship-or-not

Full history: CHANGELOG.md · GitHub Releases.

Quick Start

1. Install

pip install soup-cli            # light: CLI + config + data tools (no PyTorch)
pip install 'soup-cli[train]'   # add the training stack (torch, transformers, peft, trl, …)
pip install git+https://github.com/MakazhanAlpamys/Soup.git   # latest dev

soup init, soup data …, and the other data/inspection commands work on the light install. Fine-tuning (soup train) needs the [train] extra.

2. Create a config

soup init                       # interactive wizard
soup init --template chat       # or start from a template

Templates: chat, code, tool-calling, medical, reasoning, vision, kto, orpo, simpo, ipo, bco, rlhf, pretrain, moe, longcontext, embedding, audio.

3. Train, test, ship

soup train --config soup.yaml                 # LoRA, quantization, batching — all handled
soup chat  --model ./output                    # talk to your model
soup push  --model ./output --repo you/my-model

soup merge  --adapter ./output                              # merge LoRA into the base
soup export --model ./output --format gguf --quant q4_k_m   # GGUF for Ollama / llama.cpp

More export targets (ONNX, TensorRT, AWQ, GPTQ, BitNet) and deployment options live in docs/serving-and-export.md.

Configuration

A complete soup.yaml:

base: meta-llama/Llama-3.1-8B-Instruct
task: sft
# backend: unsloth  # 2-5x faster, pip install 'soup-cli[fast]'

data:
  train: ./data/train.jsonl
  format: alpaca
  val_split: 0.1

training:
  epochs: 3
  lr: 2e-5
  batch_size: auto
  lora:
    r: 64
    alpha: 16
  quantization: 4bit

output: ./output

config/schema.py is the single source of truth for every field. Advanced data, training, and PEFT options are documented under Documentation.

Documentation

The full feature reference lives in docs/. Start here:

Guide Covers
Training tasks & methods SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors
PEFT, long context & efficiency DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning
Performance & quantization QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP
Data engineering Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs
Evaluation & probes Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, soup advise
Serving & export OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge
Adapters, registry & governance Adapter lifecycle/management, model registry, Soup Cans, the data flywheel (soup loop), knowledge editing, steering, supply-chain controls (scan/sign/BOM/attest/audit/airgap)
Compliance & governance quickstart HIPAA/SOC2/EU-AI-Act/SR-11-7 init templates, provenance (BOM/attest/repro-receipt), audit log, air-gap, model-card autogen (soup card), CI gate (soup ci init)
Backends, platform & ops MLX/Unsloth backends, alternative hubs, HF Hub integration, autopilot, experiment tracking, plan/apply, env lockfiles, hardware-fit, completions, plugins, utility commands
Command reference The full soup command list
Supported models & extras Recommended model families, the VRAM size guide, the pip extras matrix

Data Formats

All formats are auto-detected from JSONL, JSON, CSV, Parquet, or TXT:

  • alpaca{"instruction": ..., "input": ..., "output": ...}
  • sharegpt{"conversations": [{"from": "human", "value": ...}, ...]}
  • chatml{"messages": [{"role": "user", "content": ...}, ...]}
  • dpo / orpo / simpo / ipo{"prompt": ..., "chosen": ..., "rejected": ...}
  • kto{"prompt": ..., "completion": ..., "label": true}
  • llava / sharegpt4v (vision), audio, plaintext (pre-training), embedding, prm, pre_tokenized, video, multimodal

Full schemas and the Axolotl/LlamaFactory-parity data pipeline (remote URIs, streaming, sharding, interleaving, vocab expansion, document ingestion) are in docs/data.md.

Common Commands

soup train  --config soup.yaml        # train (SFT/DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/...)
soup infer  --model ./output --input prompts.jsonl   # batch inference
soup chat   --model ./output          # interactive chat
soup serve  --model ./output          # OpenAI-compatible API server
soup merge  --adapter ./output        # merge LoRA into the base model
soup export --model ./output --format gguf           # export for deployment
soup eval   benchmark --model ./output               # evaluate
soup data   inspect ./data/train.jsonl               # dataset stats
soup recipes list                     # 100+ ready-made model recipes
soup autopilot --model <id> --data d.jsonl --goal chat  # zero-config
soup doctor                           # check GPU / deps / environment

The complete command list is in docs/commands.md.

Supported Models

Soup works with any text-generation model on the HuggingFace Hub — if it loads with AutoModelForCausalLM, it works, zero config changes. Llama 3.x/4, Qwen 2.5/3, Gemma 3, Mistral, Mixtral, DeepSeek R1/V3, Phi-4, and 100+ others ship as ready-made recipes (soup recipes list).

VRAM Max model (QLoRA 4-bit) Example
8 GB ~7B Llama-3.1-8B, Mistral-7B
16 GB ~14B Phi-4-14B, Qwen2.5-14B
24 GB ~34B CodeLlama-34B, Yi-1.5-34B
48 GB ~70B Llama-3.3-70B
80 GB+ 70B+ (full) or MoE Mixtral-8x22B, DeepSeek-V3

Full model + vision tables and the optional-extras matrix are in docs/models.md.

Docker

Run Soup without installing CUDA or PyTorch locally (image published to GHCR on every release):

docker pull ghcr.io/makazhanalpamys/soup:latest
docker run --gpus all -v $(pwd):/workspace ghcr.io/makazhanalpamys/soup train --config soup.yaml
docker compose up   # or build locally

Requirements

  • Python 3.10+
  • GPU with CUDA (recommended), Apple Silicon (MPS), or CPU (experimental — very slow)
  • 8 GB+ VRAM for 7B models with QLoRA

All training tasks run on CPU for testing (quantization auto-disabled). Optional extras (train, all, fast, vision, qat, serve, serve-fast, ui, eval, deepspeed, liger, mlx, onnx, tensorrt, …) are listed in docs/models.md.

Troubleshooting

soup doctor    # GPU, system resources, dependencies, and version in one place
  • ImportError: DLL load failed while importing _C (Windows) — reinstall PyTorch for your CUDA version: pip install torch --index-url https://download.pytorch.org/whl/cu121.
  • soup versionpip show soup-cli — multiple Python installs; use a virtualenv.

Development

git clone https://github.com/MakazhanAlpamys/Soup.git
cd Soup
pip install -e ".[dev]"

ruff check src/soup_cli/ tests/    # lint
pytest tests/ -v                   # unit tests (fast, no GPU)
pytest tests/ -m smoke -v          # smoke tests (downloads a tiny model, trains)

pre-commit install                 # optional: ruff lint+format on commit

See CONTRIBUTING.md for the full workflow and SECURITY.md to report a vulnerability.

Contributors

Built by the community ❤️ — thank you to everyone who has contributed. See CONTRIBUTORS.md.

Contributors

License

Apache-2.0. Copyright © the Soup contributors.