Fine-tune LLMs from one YAML. Layer streaming trains an 8B model on a 4 GB laptop GPU.
Go to file
Alpamys 58d280cb6f fix: remediate the HIGH-tier code-review findings
Training correctness (silent wrong results):
- ppo: refuse a randomly-initialised reward head when only reward_fn is set
  (trl 0.19.1 PPO can't use a reward_fn) instead of training against noise.
- edit_kernels (AlphaEdit): reject a non-finite key-norm (NaN <= 0.0 is False).
- preference_combine (ORPO): length-normalise log-probs so exp() doesn't
  underflow and kill the odds-ratio correction (+_read_lens caller wiring).
- ipo: anneal the beta schedule from ipo_tau, not the DPO default dpo_beta.
- distill: mask padding + prompt tokens in the default KL term (labels!=-100).
- block_expansion: freeze all-but-the-ACTUAL-added blocks (clamp over-request).
- formats (KTO): map a -1 label to False (bool(-1) was silently True).

Features that silently did nothing:
- sft: actually install the LongLoRA S² attention override (defensive).
- train --gpus re-exec: pass through --gate/--push-as/--trust-remote-code/
  --tracker/--diagnose-gate/--annex-xi/--repro-receipt/--profile/energy flags.
- eval gate-install hook: pass $GATE_SUITE to `soup eval against`, which now
  validates the locked suite as a precondition (block on missing/tampered).
- deploy_measure: fold the candidate list into the cache key.

Security:
- sglang: loopback-only CORS (was wildcard).
- fetch: lstat the ORIGINAL path (realpath resolved the symlink -> S_ISLNK
  never fired -> write followed the link).
- ui /api/data/inspect: is_under_cwd (commonpath) instead of str.startswith.
- registry lineage: unbounded cycle check (the depth-10 cap accepted a
  far-away cycle-closing edge).
- gguf calib: read from the O_NOFOLLOW fd (no close+reopen TOCTOU window).
- namespace_pin: flag ANY created_at drift (repo-recreation moves it forward).

Robustness / cross-platform:
- bench: re-raise typer.Exit (RuntimeError subclass) instead of masking it.
- eval auto: catch typer.Exit so a benchmark failure falls through.
- data split: reject negative --val/--test (negative slice inverted the split).
- trace parser: read utf-8-sig so a BOM'd first record isn't dropped.
- terraform plan: tolerate batch_size="auto" in the runtime estimate.
- rl_checkpoint: only rank-0 writes; atomic optimizer save.

Adds tests/test_code_review_high.py (29 regression tests). ruff clean;
full suite 14844 passed / 120 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 16:43:29 +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(train): v0.71.26 release — closed-loop reward-hacking mitigation 2026-07-01 16:55:59 +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: remediate the HIGH-tier code-review findings 2026-07-02 16:43:29 +05:00
templates Initial project setup: CLI skeleton + config + trainer + data pipeline 2026-02-20 16:14:56 +05:00
tests fix: remediate the HIGH-tier code-review findings 2026-07-02 16:43:29 +05:00
.dockerignore Enhance #14 - Add official Docker support for easier onboarding (#20) 2026-04-10 23:04:00 +05:00
.gitignore chore: simplify .claude gitignore to a single entry 2026-06-10 23:26:45 +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(train): v0.71.26 release — closed-loop reward-hacking mitigation 2026-07-01 16:55:59 +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 feat(train): --reward-hack-detector / --reward-hack-halt CLI flags (v0.71.26) 2026-07-01 17:02:37 +05:00
CONTRIBUTORS.md docs: credit @Deadpool2000 for qwen2.5-coder-7b-sft recipe (#285) 2026-06-28 19:23:25 +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(train): v0.71.26 release — closed-loop reward-hacking mitigation 2026-07-01 16:55:59 +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(train): v0.71.26 release — closed-loop reward-hacking mitigation 2026-07-01 16:55:59 +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.26 — Closed-loop reward-hacking auto-mitigation. Your GRPO/PPO trainer now detects reward hacking mid-run and self-corrects — instead of only halting. No OSS RLHF library closes this loop.

  • Detect → correct → continue. When the hacking signal trips, the controller raises the KL coefficient β (bang-bang + hysteresis, or a PID-Lagrangian controller), and — if hacking persists — rolls back to the last-good checkpoint, then early-stops as a last resort.
  • Anti-gaming hardening. Multi-signal voting (RM cluster-separation + length-trend + repetition), signal smoothing, conservative-on-disagreement, a reward-distribution-drift guard, and optional bounded reward shaping on the gamed proxy.
  • Observe first. reward_hack_mitigation=log_only streams a per-step mitigation_log.jsonl and never touches training — see the hacking happen before you let the controller act.
  • Honest scope. Proof-of-mechanism on SmolLM2-135M + a synthetic hacking task on one RTX 3050 (all four stages validated live, including a real rollback). PPO ships BETA.
soup train --config grpo.yaml --reward-hack-mitigation kl_control   # detect → raise KL → recover

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, 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)
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.