chore: release v0.71.0 — split heavy deps into [train] extra

Heavy training stack (torch, transformers, peft, trl, datasets,
bitsandbytes, accelerate) moves out of the core install into a new
[train] optional-dependency extra. `pip install soup-cli` is now a
light CLI + data-tools install with no PyTorch; `pip install
'soup-cli[train]'` adds the training stack.

- pyproject: new [train] + [all] extras; [dev] self-references [train]
  so CI (`pip install -e ".[dev]"`) still gets torch. Pins unchanged.
- errors.py: missing torch/transformers/peft/trl/datasets/bitsandbytes/
  accelerate now surface a single 'install soup-cli[train]' fix.
- Dockerfile: install soup-cli[train,serve,data,eval] so the GPU image
  can still fine-tune.
- README + docs/models.md: split install into light core vs [train].
- CHANGELOG: cut [0.71.0]; bump version 0.70.0 -> 0.71.0.
This commit is contained in:
Alpamys 2026-06-01 12:27:08 +05:00
parent f2c15d306f
commit 894cb632dd
8 changed files with 110 additions and 25 deletions

View File

@ -12,11 +12,28 @@ reproducing 70+ versions of notes.
## [Unreleased]
## [0.71.0] - 2026-06-01
### Changed
- **Breaking — install split.** The heavy training stack (`torch`,
`transformers`, `peft`, `trl`, `datasets`, `bitsandbytes`, `accelerate`) moved
out of the core install into a new `[train]` extra. `pip install soup-cli` is
now a light CLI + data-tools install with **no PyTorch**; run
`pip install 'soup-cli[train]'` (or `[all]`) to fine-tune. Existing users who
train must reinstall with `[train]`. Version pins are unchanged.
- Trimmed `README.md` to a ~238-line front door; the full feature reference now
lives under `docs/` (one topic page per area, indexed from the README).
- Raised the pytest coverage gate from 50% to 77% (`--cov-fail-under=77`).
- Migrated to a `src/` layout (`src/soup_cli/`) for cleaner packaging and to
stop tests accidentally importing the in-tree package.
### Added
- `[train]` and `[all]` optional-dependency extras (`[all]` pulls
`train`, `serve`, `ui`, `data`). `[dev]` self-references `[train]` so CI and
contributors still get the full stack from `pip install -e ".[dev]"`.
- Friendly error mapping: a missing heavy dependency (`torch`, `transformers`,
`peft`, `trl`, `datasets`, `bitsandbytes`, `accelerate`) now surfaces
"Training needs the [train] extra. Run: pip install 'soup-cli[train]'".
- `py.typed` marker (PEP 561) so downstream type checkers pick up Soup's inline
type hints.
- `.pre-commit-config.yaml` with ruff (lint + format) and standard file-hygiene
@ -29,4 +46,5 @@ reproducing 70+ versions of notes.
`SECURITY.md` (~220 KB). `SECURITY.md` is now a concise security policy; the
detailed hardening notes remain in git history and the GitHub Releases notes.
[Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.70.0...HEAD
[Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.71.0...HEAD
[0.71.0]: https://github.com/MakazhanAlpamys/Soup/compare/v0.70.0...v0.71.0

View File

@ -23,8 +23,10 @@ RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1
# Set working directory
WORKDIR /workspace
# Install Soup from PyPI (always the latest published release, not local source)
RUN pip install --no-cache-dir "soup-cli[serve,data,eval]"
# Install Soup from PyPI (always the latest published release, not local source).
# v0.71.0 split the training stack into the [train] extra — include it so the
# GPU image can still fine-tune.
RUN pip install --no-cache-dir "soup-cli[train,serve,data,eval]"
# Default entrypoint and command
ENTRYPOINT ["soup"]

View File

@ -32,7 +32,7 @@
Soup turns the pain of LLM fine-tuning into a simple workflow. One config, one command, done.
```bash
pip install soup-cli
pip install 'soup-cli[train]' # add [train] to fine-tune; bare `soup-cli` is the light CLI
soup init --template chat
soup train
```
@ -49,10 +49,10 @@ infrastructure instead of improving models. Soup fixes that.
## What's New
**v0.70.0 — Loop Hardening.** Six surfaces that protect the training loop from the failure
modes that cost a real GPU-hour: a reward-hacking detector (InfoRM / RM-ensemble), cross-tokenizer
distillation (ULD), MiniLLM reverse-KL distillation, mid-epoch RL checkpoints, an iterative-DPO
loop driver, and a RAGEN echo-trap detector. See [`docs/training.md`](docs/training.md).
**v0.71.0 — Lighter install.** The heavy training stack (PyTorch, Transformers, PEFT, TRL,
datasets, bitsandbytes, accelerate) moved into a `[train]` extra. `pip install soup-cli` is now a
light CLI + data-tools install with no PyTorch; `pip install 'soup-cli[train]'` adds everything you
need to fine-tune. **Breaking:** existing users who train must reinstall with `[train]`.
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@ -61,10 +61,14 @@ Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://gi
### 1. Install
```bash
pip install soup-cli # from PyPI
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
```bash
@ -203,8 +207,9 @@ docker compose up # or build locally
- 8 GB+ VRAM for 7B models with QLoRA
All training tasks run on CPU for testing (quantization auto-disabled). Optional extras
(`fast`, `vision`, `qat`, `serve`, `serve-fast`, `ui`, `eval`, `deepspeed`, `liger`, `mlx`,
`onnx`, `tensorrt`, …) are listed in [`docs/models.md`](docs/models.md#optional-extras).
(`train`, `all`, `fast`, `vision`, `qat`, `serve`, `serve-fast`, `ui`, `eval`, `deepspeed`,
`liger`, `mlx`, `onnx`, `tensorrt`, …) are listed in
[`docs/models.md`](docs/models.md#optional-extras).
## Troubleshooting

View File

@ -50,10 +50,13 @@ Soup works with **any** of the **340,000+** text-generation models on [HuggingFa
## Optional Extras
The core `pip install soup-cli` is enough to train. Install extras only when you need them:
The core `pip install soup-cli` is a light install — the CLI, config system, and data tools, with
no PyTorch. Add `[train]` to fine-tune, or install other extras only when you need them:
| Extra | Install | What it adds |
|---|---|---|
| `train` | `pip install 'soup-cli[train]'` | Training stack: torch, transformers, peft, trl, datasets, bitsandbytes, accelerate |
| `all` | `pip install 'soup-cli[all]'` | `train` + `serve` + `ui` + `data` in one shot |
| `fast` | `pip install 'soup-cli[fast]'` | Unsloth backend (2-5x faster, lower VRAM) |
| `vision` | `pip install 'soup-cli[vision]'` | Vision / multimodal fine-tuning (Pillow) |
| `audio` | `pip install 'soup-cli[audio]'` | Audio / speech fine-tuning (librosa, soundfile) |

View File

@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "soup-cli"
version = "0.70.0"
version = "0.71.0"
description = "Fine-tune LLMs in one command. No SSH, no config hell."
readme = "README.md"
license = "Apache-2.0"
@ -21,11 +21,23 @@ classifiers = [
"Programming Language :: Python :: 3",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
# Core install (`pip install soup-cli`) is intentionally light: the CLI, config
# system, and data tools — no PyTorch. v0.71.0 split the heavy training stack
# (torch / transformers / peft / trl / datasets / bitsandbytes / accelerate)
# into the `[train]` extra below.
dependencies = [
"typer>=0.9.0,<0.21.0",
"rich>=13.0.0",
"pydantic>=2.0.0",
"pyyaml>=6.0",
"huggingface-hub>=0.16.0",
"plotext>=5.2.0",
]
[project.optional-dependencies]
# v0.71.0 — heavy training stack. `pip install 'soup-cli[train]'` to fine-tune.
# These were core dependencies through v0.70.0; pins are unchanged.
train = [
"torch>=2.0.0",
"transformers>=4.36.0,<5.0.0",
"peft>=0.7.0",
@ -33,15 +45,16 @@ dependencies = [
"datasets>=2.14.0",
"bitsandbytes>=0.41.0",
"accelerate>=0.25.0",
"huggingface-hub>=0.16.0",
"plotext>=5.2.0",
]
[project.optional-dependencies]
# v0.71.0 — convenience meta-extra pulling the main optional stacks.
all = ["soup-cli[train,serve,ui,data]"]
eval = ["lm-eval>=0.4.0"]
data = ["datasketch>=1.6.0"]
wandb = ["wandb>=0.15.0,<0.18.0"]
dev = ["pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
# Self-references `[train]` so CI / contributors get the full training stack
# (CI runs `pip install -e ".[dev]"`; without this every test would fail at
# `import torch`).
dev = ["soup-cli[train]", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
ui = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
serve = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
serve-fast = ["vllm>=0.4.0", "fastapi>=0.104.0", "uvicorn>=0.24.0"]

View File

@ -1,3 +1,3 @@
"""Soup CLI — Fine-tune LLMs in one command."""
__version__ = "0.70.0"
__version__ = "0.71.0"

View File

@ -7,6 +7,12 @@ from rich.panel import Panel
console = Console(stderr=True)
# v0.71.0 — the heavy training stack (torch / transformers / peft / trl /
# datasets / bitsandbytes / accelerate) moved out of the core install into the
# `[train]` extra. A missing one of these surfaces this single, actionable fix.
# The `\\[` escapes the literal `[` for Rich markup (it renders as `[train]`).
_TRAIN_FIX = "Training needs the \\[train] extra. Run: pip install 'soup-cli\\[train]'"
# Map known error patterns to (short message, fix suggestion)
ERROR_MAP = [
# CUDA OOM
@ -62,21 +68,41 @@ ERROR_MAP = [
"httpx is not installed (needed for data generate).",
"Run: pip install 'soup-cli\\[generate]'",
),
# Peft / transformers incompatibility
# Heavy training stack — all moved to the [train] extra in v0.71.0.
(
"No module named 'torch'",
"PyTorch is not installed (needed for training).",
_TRAIN_FIX,
),
(
"No module named 'transformers'",
"Transformers is not installed (needed for training).",
_TRAIN_FIX,
),
(
"No module named 'peft'",
"PEFT is not installed.",
"Run: pip install peft>=0.7.0",
"PEFT is not installed (needed for LoRA training).",
_TRAIN_FIX,
),
(
"No module named 'trl'",
"TRL is not installed.",
"Run: pip install trl>=0.7.0",
"TRL is not installed (needed for training).",
_TRAIN_FIX,
),
(
"No module named 'datasets'",
"Datasets is not installed (needed for training).",
_TRAIN_FIX,
),
(
"No module named 'bitsandbytes'",
"BitsAndBytes is not installed (needed for quantization).",
"Run: pip install bitsandbytes>=0.41.0",
_TRAIN_FIX,
),
(
"No module named 'accelerate'",
"Accelerate is not installed (needed for training).",
_TRAIN_FIX,
),
# CPU / quantization issues
(

View File

@ -3,6 +3,7 @@
from io import StringIO
from unittest.mock import patch
import pytest
from rich.console import Console
from typer.testing import CliRunner
@ -72,6 +73,23 @@ def test_missing_deepspeed_error():
assert "soup-cli[deepspeed]" in output
@pytest.mark.parametrize(
"module",
["torch", "transformers", "peft", "trl", "datasets", "bitsandbytes", "accelerate"],
)
def test_missing_train_dep_points_at_train_extra(module):
"""v0.71.0 — any missing heavy training dep points at the [train] extra."""
buf = StringIO()
test_console = Console(file=buf, stderr=False)
with patch("soup_cli.utils.errors.console", test_console):
exc = ModuleNotFoundError(f"No module named '{module}'")
format_friendly_error(exc, verbose=False)
output = buf.getvalue()
# The `\[train]` escape renders to a literal `[train]` in the output.
assert "soup-cli[train]" in output
assert "[train] extra" in output
def test_connection_error():
"""Connection error gets friendly message."""
buf = StringIO()