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,bcoandpreferenceno longer fail inside trl onexamples/data/dpo_sample.jsonl,examples/data/chat_preferences.jsonlor any dataset written the same way (#1849, #1866). soup.yamland 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.trainthat names a Hub dataset with a dot in its name, such asteknium/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
promptbesidechosen/rejectedmessage lists that repeat the user turn failed inside trl after the model had loaded, with an error that changed withPYTHONHASHSEED('list' object has no attribute 'endswith', or aTypeError). Thedpoandktoconverters now hand the trainer every preference row in one layout: all strings, or all message lists with the prompt turns inpromptonly.reward_modelno longer trains on a text with the question in it twice, andorpoandsimpoprepare 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.5failed withData file not foundbecause the loader read the dot as a file extension. A single string now takes the same route as the same name inside adata.trainlist: 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-configfiles, 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 bysoup ship. Asoup.yamlthat 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.0was 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 istyper>=0.15.4;click>=8.0.0was 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, andsoup doctorreports 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.yamlover 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-urland--discord-urlare 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.trainwith an unsupported suffix that does not exist (a typo such asdata/train.jsnol) now goes to the Hub lookup, as it already did inside adata.trainlist, instead of failing withData file not found; offline it reports a connection error. An existing file with an unsupported suffix (data.tsv) still getsUnsupported file format. - The settings that v0.76.0 accepts with a warning at load (for example
lr_groups,early_stop_patience,forgetting_eval_steps) andsoup export --format awq/--format gptqare 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, runsoup doctor --config soup.yamlfirst. - A string
promptbeside message-list answers is not read when the two answers share leading turns: those turns are the prompt, asorpoandsimpoalready 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-dporecipe still cannot train (#1867); this patch does not change it. docs/data.mddoes 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,grpoandppo(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:
- @dryn85-max, who reported that every bundled DPO example failed (#1849).
- @umran666, who measured the post-#331 8B NF4 row quoted in #1699 (#1103).
Upgrade
pip install -U soup-cli==0.76.1A 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