github MakazhanAlpamys/Soup v0.76.1
Soup CLI v0.76.1

2 hours ago

Soup CLI v0.76.1

A patch release on the v0.76.0 line. It makes the bundled DPO examples train again, puts the same nesting and expansion limits, and a size cap, on every YAML file Soup reads, fixes the declared Typer floor, and loads Hub dataset ids that contain a dot. Everything in v0.76.0 is unchanged.

Highlights

  • The bundled DPO examples train again: task: dpo, ipo, bco and preference no longer fail inside trl on examples/data/dpo_sample.jsonl, examples/data/chat_preferences.jsonl or any dataset written the same way (#1849, #1866).
  • soup.yaml and every other YAML file Soup reads go through one loader with the same nesting and expansion limits, and a per-reader size cap (#1827).
  • The Typer floor is now typer>=0.15.4, and a CI cell starts the CLI on the declared Typer and Click floors (#1802, #1858).
  • A single-string data.train that names a Hub dataset with a dot in its name, such as teknium/OpenHermes-2.5, loads from the Hub (#1889).
  • The README and the performance docs state the 8B NF4 figure with its SM clock and give the post-#331 row (#1207, #1699).

Fixed

  • DPO-family tasks on the bundled examples (#1849, #1866). A string prompt beside chosen / rejected message lists that repeat the user turn failed inside trl after the model had loaded, with an error that changed with PYTHONHASHSEED ('list' object has no attribute 'endswith', or a TypeError). The dpo and kto converters now hand the trainer every preference row in one layout: all strings, or all message lists with the prompt turns in prompt only. reward_model no longer trains on a text with the question in it twice, and orpo and simpo prepare the same tokens as before. A row that cannot be written that way (one answer a string and the other a message list, a malformed message, no prompt to be found) is dropped at load with a reason that names the field, and a dataset that mixes text rows with conversational ones loads as conversations, with a note.
  • Hub dataset ids with a dot (#1889). data.train: teknium/OpenHermes-2.5 failed with Data file not found because the loader read the dot as a file extension. A single string now takes the same route as the same name inside a data.train list: a supported file extension (.jsonl, .json, .csv, .parquet, .txt) means a local file, a :// string a remote URI, anything else a Hub id.

Changed

  • YAML limits on every reader (#1827). Nesting is limited to 100 levels; expansion to one node per source byte plus 10,000 for anchors, aliases and merge keys, with merge keys chained at most 100 levels. Each reader keeps its own size cap: 1 MiB for the training-config readers and for readers that had no cap before, 256 KiB for recipes, export --quant-config files, RA-DIT configs and sweep files, 5 MiB for agent specs, 16 MiB for can manifests, 64 KiB for README front matter, and 4 MiB for the config read by soup ship. A soup.yaml that is over 1 MiB, nests deeper than 100 levels, cannot be read or is not valid YAML now fails to load with one line naming the file and the problem; the other readers report through their own handlers.
  • Typer floor (#1802, #1858). typer>=0.9.0 was declared while no command could start below Typer 0.12.4, and Typer 0.12.4 to 0.15.3 start the CLI only next to Click 8.1 or older. The floor is typer>=0.15.4; click>=8.0.0 was measured again and holds. A fresh install is unchanged. An environment that holds an older Typer now has it upgraded, or the conflict named, at install time, and soup doctor reports such a Typer as outdated.
  • README and docs (#1699, #1825, #1826). The 8B NF4 figure is stated with its clock (119.6 tok/s at 952 MHz) beside the post-#331 row (208.6 tok/s at 1935-1957 MHz), with the caveat that the two are not directly comparable. The What's New block of the four README translations describes v0.76.0. Post-release documentation corrections for v0.76.0, no code change.

Security

  • Every YAML file Soup reads is now bounded in size, nesting and expansion by one shared loader; a soup.yaml over a limit is refused with one line naming the file and the limit, and the other readers report through their own handlers.
  • The audit log finds credential options from the command tree and also masks long options by name, so the values of --slack-url and --discord-url are masked, and --min-tokens, a length threshold, is no longer masked.
  • This release is not accompanied by a security advisory.

Known limitations

  • A single-string data.train with an unsupported suffix that does not exist (a typo such as data/train.jsnol) now goes to the Hub lookup, as it already did inside a data.train list, instead of failing with Data file not found; offline it reports a connection error. An existing file with an unsupported suffix (data.tsv) still gets Unsupported file format.
  • The settings that v0.76.0 accepts with a warning at load (for example lr_groups, early_stop_patience, forgetting_eval_steps) and soup export --format awq / --format gptq are unchanged in this patch: they are still accepted with a warning until v0.77, which refuses or removes them. The v0.76.0 refusals are unchanged too; coming from 0.75.x, run soup doctor --config soup.yaml first.
  • A string prompt beside message-list answers is not read when the two answers share leading turns: those turns are the prompt, as orpo and simpo already read such a row, so a question written only in that string has to be in the conversations as well.
  • The YAML nesting limit counts the document's top-level mapping as the first level, so 99 brackets under a top-level key is the deepest structure that loads.
  • The pixtral-dpo recipe still cannot train (#1867); this patch does not change it.
  • docs/data.md does not yet describe the one-layout rule for preference rows.
  • How this patch was checked: the DPO fix was run end to end on a tiny random model on CPU, without quantization (dpo, ipo, bco, kto, preference, orpo, simpo and reward_model, two hash seeds), with a control run on v0.76.0 that failed. Not exercised in that check: online_dpo, grpo and ppo (they need a judge or a reward model), runs on a GPU or with 4-bit and 8-bit bases, the oversize-file refusals of the YAML readers other than the training config, and the Typer and Click floor variants beyond Typer 0.15.4 with Click 8.0.0. The test suite was not run in full on the maintainer's machine; the CI run on the release branch covers it.
  • No gated work ships in this release, so no record is added under benchmarks/. The preprint (DOI 10.5281/zenodo.21771064) states no measured number that this patch changes and its scope is unchanged; #1699 restates the paper's 8B row with the clock it was taken at, and #1207 tracks the amendment of the preprint as a new version.

Contributors

All seven changes in this release are maintainer pull requests (#1825, #1699, #1826, #1858, #1866, #1827, #1889), plus a correction to three changelog fragments (#1894).

Thank you to:

Upgrade

pip install -U soup-cli==0.76.1

A soup.yaml larger than 1 MiB, or nested deeper than 100 levels, now fails to load with one line naming the limit. Coming from 0.75.x, read the v0.76.0 notes first: a config that loaded before can stop loading.

Full changelog: v0.76.0...v0.76.1

Don't miss a new Soup release

NewReleases is sending notifications on new releases.