github MakazhanAlpamys/Soup v0.77.2
v0.77.2 — a cut of main: explicit refusals, MLX preference and GRPO, corrected VRAM estimates and server replies

3 hours ago

v0.77.2, 2026-11-05

153 of the 159 pull requests in this release came from 30 people outside the maintainer.
Thank you: the Contributors section below names each of these contributors and what was found or built.

v0.77.2 is a cut of main after v0.77.1, not a backport: it carries every pull request merged since that tag. By the CHANGELOG count that is 6 additions, 5 changes, 2 removals and 117 fixes. Read the upgrade notes under Install / Upgrade before you upgrade a soup serve deployment that sets --tool-auth-token, a shell completion script, a script that checks exit codes, or a task: sft config on the vision, audio, MLX, Unsloth, RAFT or pre-tokenized path. Coming from v0.76.x or older, read the v0.77.0 notes first and run:

soup doctor --config soup.yaml

Every change, with its pull request, is in CHANGELOG.md, section [0.77.2]. Compare with the previous release: v0.77.1...v0.77.2.

What's New

Added

  • soup profile --model answers "will it fit?" without a soup.yaml (#2285). It prices the run set by --seq, --batch, --method lora|qlora|full, --lora-r, --optimizer and --gradient-checkpointing from the model's config.json (a local directory, the Hugging Face cache or the Hub), with the same estimate as a soup.yaml describing that run; when no config.json can be read it exits 1 with the reason. On Apple Silicon, soup profile and the MCP profile tool now compare the estimate with Metal's recommended working-set size instead of the whole unified memory, and soup profile --json returns a lora_r field.
  • soup plan and soup apply take --minillm-on-policy (#2315), so an on-policy MiniLLM distill config is validated and hashed like any other, without rewriting YAML. soup apply keeps the flag in its suggested train command and still only records the plan.
  • MLX preference training (#2333): backend: mlx with task: preference and training.preference_loss: dpo, orpo or simpo runs the native trainer. The config keeps task: preference; adapter_config.json records the native task.
  • MLX GRPO on pre-quantized 4-bit bases (#2386): task: grpo with backend: mlx now trains on a base pre-quantized by mlx-lm at 4 bits in affine mode (mlx-community/...-4bit, mlx_lm.convert -q). The quantized layers stay frozen and only the LoRA adapter trains; any other quantized base is refused right after the load, naming the first layer outside the rule. adapter_config.json records base_quantization.
  • Recipe qwen3.5-0.8b-dpo (#2184), text preference pairs for Qwen/Qwen3.5-0.8B, with inherited Qwen3.5 DPO settings rather than hyperparameters tuned for 0.8B.
  • Recipe qwen3.5-27b-dpo (#2445), a text-only preference starting configuration for Qwen/Qwen3.5-27B with inherited Qwen3.5 DPO settings, LoRA and 4-bit quantization. The catalog now has 173 recipes.

Changed

  • soup serve checks --tool-auth-token with the rule soup ui and soup mcp serve use, and the vLLM, SGLang and MII servers refuse a cross-site Origin as the transformers server already did (#2329). Details and the one-line token command are in the upgrade notes.
  • One shared terminal-safe refusal for a soup data output that aliases an input, links and alternate path spellings included; soup data ingest also refuses an output that names its source document before reading it (#2349).
  • soup ship --progress jsonl reports live evaluation items after each generation chunk instead of after the whole suite; failed chunks retry only their own items, and scores and the event schema are unchanged. soup eval custom and the forgetting probe use the same chunked path with unchanged results (#2421).
  • Transformers model loading uses the supported dtype argument instead of the deprecated torch_dtype, with the same precision and quantization choices (#2257).
  • benchmarks/gate-h100-validation.md now says under finding 9 that the pinned arm in the 6.56x comparison was the wrong one; every number is unchanged (#2271).

Removed

  • Six unused estimate functions of soup_cli.utils.profiler (estimate_model_memory, estimate_trainable_params, estimate_lora_memory, estimate_optimizer_memory, estimate_activation_memory, estimate_total), with their tests. soup profile output is unchanged (#2369).
  • An unreachable minillm_enabled check in soup train when --minillm-on-policy is given (#2422).

Fixed: the ones that matter most

  • No silent overwrites, no empty results. More soup data commands, soup adapters arithmetic and merge refuse an output that names one of their inputs (#2274, #2349, #2379). soup distill-prompt with no usable prompt, soup data evolve and gen-magpie when every provider call failed, soup data filter --perplexity without torch or transformers, soup data dedup --field on an absent key and soup registry push on a run that is not completed now stop instead of writing an empty, unfiltered or unusable result (#2209, #2348, #2377, #2336, #2248).
  • Training. data.max_length holds again for SimPO and KTO, and a prompt is cut only when the row does not fit (#1196). PPO no longer crashes at the first rollout with gradient checkpointing on, and checkpoints the policy outside 4-bit and 8-bit (#2319, #2340); PPO, GRPO and online DPO stop adding an input-gradient hook per step (#2373). MLX Adafactor applies the configured learning rate and schedule (#2484). Both soup merge paths load the base at the Hub commit recorded in the adapter's training provenance (#2485). task: sft refuses four settings on the paths that never applied them (#2278). soup bench train measures 4-bit and 8-bit configs (#2216). soup train --gpus N asks the confirmation once (#2250).
  • VRAM estimates. The optimizer step is priced as its own phase (#2338); a task: prm step is charged the logits of one position (#2337, #2372); a sharded FSDP or DeepSpeed run is priced per card (#2313); a stream_loss_chunk step is charged its last layer's recompute (#2290); backend: unsloth is priced with the targets and dtypes its loader uses (#2376); the estimate says when activation_offloading is set and not modelled (#2331).
  • Eval and ship. soup ship --adapter refuses an adapter whose lora_B tensors are all zero (#2434). Non-finite stored scores, regression tolerances and judge recheck limits are refused (#2477, #2464, #2493), and judge JSONL rows are checked before generation (#2494). soup eval quant-check exits 3 on an unparseable --tasks file before any model loads (#2185).
  • Server. A reply cut off at max_tokens now ends with finish_reason: "length" (/v1/chat/completions) or stop_reason: "max_tokens" (/v1/messages) (#2380); /v1/messages applies the request's temperature and top_p (#2388).
  • Loop, cloud and CLI. soup loop watch resets the monthly spend when the UTC month changes and soup loop status shows what the next iteration will see (#2387, #2424). RunPod jobs bootstrap in a virtual environment and keep bounded failure diagnostics (#2352, #2256); Lambda install output reaches the log (#2282). Shell completion scripts work again (#2283). soup plan and soup apply name an unreadable config and exit 2 (#2323). soup doctor names GPUs hidden by CUDA_VISIBLE_DEVICES (#2206). soup ci init --python checks the supported range (#2249).
  • Text shown as typed. More than 50 pull requests make soup runs, soup registry, soup deploy, soup migrate, soup push, soup init, soup data and many more commands print paths, names and messages as typed: brackets and :name: text are kept and terminal control characters are removed from the display only. What is left is under Known Limitations.

No gate ran for this release and the preprint is unchanged.

Install / Upgrade

pip install -U soup-cli               # or: pipx upgrade soup-cli
soup --version                        # soup v0.77.2
soup doctor --config soup.yaml        # before the first run of an existing config
  • From v0.77.1: a valid soup.yaml loads unless it is a task: sft config with one of four settings on a path that never applied it; the upgrade notes below list the rest.
  • From v0.76.x or older: read the v0.77.0 notes first. Python 3.10 stays on v0.76.x (pip install "soup-cli[train]<0.77"); AWQ and GPTQ export were removed in v0.77.0. This release supports Python 3.11 to 3.13.
  • Docker: docker pull ghcr.io/makazhanalpamys/soup:0.77.2 (also latest); the host driver must support CUDA 12.8.

Upgrade notes

A soup.yaml that loads on 0.77.1 loads on 0.77.2, unless it is a task: sft config that sets
one of four settings on a path that never applied it (second item). Coming from 0.76.x or older,
read the v0.77.0 release notes first and run soup doctor --config soup.yaml before the
first run of an existing config.

  • soup serve --tool-auth-token follows the token rule of soup ui and soup mcp serve:
    16 to 128 characters from A-Z, a-z, 0-9, _ and -. 0.77.1 accepted any non-empty
    value; 0.77.2 exits 2 before the model loads, on every bind, whether the value comes from the
    option or from SOUP_TOOL_AUTH_TOKEN, and the message names the rule, never the value. All
    three commands now match the whole value, so a token with a trailing newline is refused too.
    Generate one with python -c "import secrets; print(secrets.token_urlsafe(32))" and send the
    same value as Authorization: Bearer <token> (#2329).

  • task: sft refuses four settings on the paths that never applied them (#2278). 0.77.1
    loaded them and trained without them; 0.77.2 refuses the config at load and names the field,
    the setting that selects the path and what to change. A value of false or null loads.

    Path Refused when set
    modality: vision or modality: audio reasoning_effort, train_on_eot, use_flash_attn, use_liger
    backend: mlx reasoning_effort, train_on_eot (use_flash_attn / use_liger keep their ignore warning)
    backend: unsloth use_flash_attn, use_liger
    data.format: raft reasoning_effort, train_on_eot
    data.format: pre_tokenized reasoning_effort (train_on_eot loads: the cache is keyed on it)

    Remove the key, or move the run to the path the message names. stream_layers: true and the
    other tasks are unchanged.

  • More commands refuse an output that names one of their inputs, before reading (exit 1).
    soup data ingest <document> --output <same document> replaced the document with JSONL;
    soup data persona-mix, generate, canary check, mix --optimize, forge and
    recipe --execute, and soup adapters arithmetic and merge with an --output that is an
    input adapter, overwrote their input. Write to a new path. The shared refusal no longer starts
    with Error: (soup data doctor, lint) or Plan failed: (soup data forge); exit codes
    are unchanged (#2274, #2349, #2379).

  • MLX: two refusals are lifted, one is added (Apple Silicon only). backend: mlx with
    task: preference and training.preference_loss: dpo, orpo or simpo was refused at load;
    it now runs the native trainer, the config keeps task: preference, and adapter_config.json
    records the native task, so a resume matches whichever of the two spellings the config uses.
    ipo, bco and preference_loss_weights blends stay refused (#2333). task: grpo now trains
    on a base pre-quantized by mlx-lm at 4 bits in affine mode (mlx-community/...-4bit,
    mlx_lm.convert -q); any other quantized base is refused right after the load, naming the
    first layer outside the rule; quantization: 8bit stays refused at load, reworded; and
    adapter_config.json gains base_quantization (#2386). MLX DPO --resume now refuses an
    adapter of another task or base, an MLX SFT adapter included (#2321).

  • Exit codes that changed:

    Command and case 0.77.1 0.77.2
    soup eval quant-check, unparseable --tasks file 1, after loading both models 3, before (#2185)
    soup distill-prompt, no trace row has a prompt 0, empty output written 3, output untouched (#2209)
    soup data evolve / gen-magpie, every provider call failed, no row 0, output emptied 1, output kept (#2348)
    soup data filter --perplexity / --score-only without torch or transformers 0, unfiltered or partial 1 (#2377)
    soup data dedup --field <key> absent from every row 0, distinct rows dropped 1 (#2336)
    soup registry push --run-id on a run that is not completed 0, entry registered 1 (#2248)
    soup plan / soup apply, malformed YAML or a config that cannot be read 1, with the raw parser or OS error 2, naming the config and the YAML location (#2323)
    soup quantize --to "[/]" (a value Rich read as markup) 1 2 (#2217)
    soup ship --progress jsonl, Ctrl+C 1 130 (#2417)
    soup loop status, stored spend NaN or Infinity 0, printed $nan 2 (#2424)
  • The VRAM pre-flight prices some runs differently. A short full fine-tune with
    adamw_torch is priced higher (the optimizer step is its own phase), so inside the fitted range
    the pre-flight can now refuse one it let through; --allow-oom-attempt still launches it
    (#2338). A run sharded with --fsdp full_shard, full_offload, shard_grad or DeepSpeed
    ZeRO-2/3 is priced per card and only warned about (#2313). A task: prm step is priced lower
    (#2337, #2372); a stream_loss_chunk step higher (#2290); backend: unsloth is priced with its
    seven automatic LoRA targets and 16-bit embeddings and output head (#2376).

  • Server replies. On the transformers backend and MoLE, a reply cut at max_tokens without
    an end token now ends with finish_reason: "length" (/v1/chat/completions) or
    stop_reason: "max_tokens" (/v1/messages) (#2380). /v1/messages applies the request's
    temperature and top_p; a value out of range or null is 400 instead of the default (#2388).
    The vLLM, SGLang and MII servers answer a generation request whose Origin names another site
    with 403, as the transformers server did (#2329).

  • Shell completion: scripts written by soup completions bash|zsh|fish before 0.77.2 do not
    complete; run the command again and replace the installed script (#2283).

  • Python API: soup_cli.utils.profiler no longer has estimate_model_memory,
    estimate_trainable_params, estimate_lora_memory, estimate_optimizer_memory,
    estimate_activation_memory or estimate_total (no caller since #2146 in 0.77.1, so their
    numbers were not what soup profile printed). Use soup profile --json; the estimate itself is
    soup_cli.utils.vram_estimate.estimate_vram (#2369).

  • Smaller changes that alter a result:

    • soup data from-traces --signal thumbs_up, and the harvest stage of soup loop, pair a
      thumbs-up and a thumbs-down answer that differ, and skip a prompt whose answers are all the
      same text; 0.77.1 could write a pair whose chosen and rejected were identical, so the
      number of pairs from the same logs can change (#2495).
    • MLX Adafactor (backend: mlx, training.optimizer: adafactor) applies the configured learning
      rate, warmup and schedule, so an existing run trains differently (#2484).
    • Both soup merge paths load the base at the Hub commit recorded in the adapter's training
      provenance, not the latest one. With HF_HUB_OFFLINE set and that commit not cached, the
      merge now fails where 0.77.1 merged whatever was cached (#2485).
    • soup ci init --python refuses a version outside 3.11 to 3.13 with exit 1 (#2249).
    • soup eval compare and soup eval leaderboard refuse a stored score that is not finite, with
      exit 1 (#2477); ensure_judge_calibrated (Python API) refuses a non-finite min_agreement or
      max_bias (#2493); a judge task refuses a JSONL row that is not an object or whose prompt is
      not a string, naming the file and line (#2494).
    • soup ship --adapter returns DON'T SHIP with the rule adapter_noop for an adapter whose
      lora_B tensors are all zero (#2434).
    • On Windows, soup adapters bisect --eval-command splits the template without POSIX quoting:
      single quotes and a quote inside a word no longer group words, so write "{ckpt}" in double
      quotes (#2314).

Security

This release includes security hardening fixes; details follow through the project's advisory process (see SECURITY.md).

Known Limitations

New in this release:

  • On Apple Silicon, task: preference (DPO, ORPO and SimPO only; IPO, BCO and preference_loss_weights blends stay refused) and MLX GRPO on 4-bit mlx-community bases are covered only by the hosted macOS MLX test job. MLX GRPO still refuses --resume, 8-bit and mixed-bit bases, mxfp4, mxfp8 and nvfp4, quantized MoE and BitNet layers, lora.r: 0, custom or ensemble reward_fn settings and non-text modalities. The mlx extra's declared floor is tracked in #2471.
  • The VRAM estimate: the per-card estimate of a sharded run is fitted on single-card runs, so it warns and never refuses; the stream_loss_chunk recompute charge is measured on one model and one card and does not cover fused gate_up, MoE layers or LoRA on MLP modules; training.activation_offloading is not modelled (the estimate says so when it is set); the Unsloth pricing rests on one load-and-inject record with no training-peak measurement.
  • KTO and BCO on trl 0.29: a row whose prompt is cut to max_length // 2 loses its BOS token (#2487), and the KTO length cap reads the whole answer columns into memory (#2486).
  • soup adapters bisect --eval-command on Windows splits the template without POSIX quoting: write "{ckpt}" in double quotes (#2488).
  • Text shown as typed, what is left: the :name: emoji codes still expand in the diagnostics soup eval compare and soup eval leaderboard print for a non-finite stored score (added in #2477) and in many other modules; the tracker that lists them is #2489.
  • Text shown as typed: a backslash before a [ that is not a complete markup tag is dropped when a path or name is printed by soup env lock, soup init, soup shrink, soup data mix --apply, soup draft distill and soup registry show, and soup export --format "[/x]" ends in a markup error with exit 1 (#2533).
  • Text shown as typed: soup doctor --config with a Windows path that contains a colon can expand an :name: code in its Config file ... cannot be read line, and the soup draft distill --plan-only YAML preview wraps at the console width (#2489, #2536).
  • soup ci init --python still accepts 03.11 and 3.011 and writes them into the workflow as typed (#2534).
  • A judge task in the eval gate checks its JSONL row by row, so a bad row at line 500 is found after 499 generations (the check arrived in #2494) (#2535).
  • Partial fixes whose issues stay open: only the MLX Adafactor slice of the settings a backend never applies is fixed, and the rest stays open (#1811); only soup merge pins the recorded base commit, and an offline merge now needs that snapshot cached (#1902); qwen3.5-0.8b-dpo and qwen3.5-27b-dpo use inherited settings and are not tuned or measured (#275); the RunPod virtual-environment bootstrap has not been validated on a live Pod (#2192, #2098).
  • Not exercised by hand before this release: any GPU path, MLX itself, the Origin check of the vLLM, SGLang and MII servers, the RunPod bootstrap, the Ctrl+C exit code 130 of soup ship --progress jsonl, and a merge at a recorded Hub commit. The pre-release smoke run was on CPU.

Carried over from v0.77.1, still open:

  • training.fast_lora has no speedup claim and no end-to-end claim; its correctness half is open (#792).
  • training.stream_recompute is SFT only; auto works on the RAM tier only, gains nothing on a read-bound disk tier, and at a high VRAM fill it is slower.
  • Kimi K2 admission is verified on CPU with a tiny K2-shaped checkpoint only; nothing has been trained on K2. Its tokenizer needs --trust-remote-code and pip install tiktoken. Resident K2 loads are refused at load, and Kimi-K2-Thinking and Kimi-K2-Instruct-0905 have no supported route yet (#2104).
  • stream_expert_layout: per_expert covers the DeepSeek-V3 family only and costs step time (about 2x to 2.7x on Moonlight-16B); a non-NVMe cache volume is warned about. two_read_experts has no hardware speed record yet (#2170).
  • After upgrading, the first pinned layer-streamed run re-shards into a new <slug>@<commit> cache slot; the old slot stays on disk and nothing names or removes it (#2196).
  • The RunPod controller has not been run against a real RunPod account (#2098); local input files are not uploaded.
  • soup export --format gguf still clones llama.cpp b5270, which cannot convert Qwen3.5; it refuses before cloning and names --llama-cpp <dir> (#1911).
  • Base-revision binding covers the transformers backend and soup merge; Unsloth and MLX loads, and local or cached-path hints, are not bound yet (#1902).
  • lora.rank_pattern and alpha_pattern are refused on MLX and Unsloth until those trainers apply them (MLX: #1996).
  • freeze_layers and freeze_ratio with LoRA need a list of lora.target_modules; a regex, all-linear, lora.target_parameters and VeRA are refused when the model is built (#2201).
  • soup merge --low-memory refuses adapters it cannot reproduce exactly (DoRA, modules_to_save, rank or alpha patterns, embedding adapters) and names the regular merge instead.
  • soup serve's /v1/tools/python is unavailable (501) on Windows and on Linux with Python 3.11, as /v1/tools/bash already was.
  • Native MLX inference covers text LoRA adapters only; soup chat on MLX is open (#1986, #2123).
  • Still open from v0.76.0: fields that reach no consumer outside the staged table (#1814), soup doctor --config coverage (#1815) and config-error wording (#1816).
  • Layer streaming remains BETA and opt-in; --cuda-graphs remains experimental.

Fixed since v0.77.1 and no longer limits: SimPO and KTO rows past data.max_length (#1185), the unmeasured stream_loss_chunk peak (#1693), the soup data commands not yet checked for output aliases (#2226), soup plan and soup apply without --minillm-on-policy (#2303), the refusal of MLX task: preference for DPO, ORPO and SimPO (#2202), the dense-only MLX GRPO baseline (#1976) and rows of an unknown shape that were named nowhere (#1818).

Contributors

Grouped by person, in order of merged pull requests; each line says what was found or built. 30 people outside the maintainer, 153 merged pull requests. Thank you to all 30.

  • Nariman Abdikarim (@Nari-Ab), 69: text shown as typed in more than 50 pull requests, with brackets and :name: text kept and terminal controls removed (soup runs, soup registry, soup deploy, soup migrate, soup push and many more); shell completion scripts restored (#2283); --minillm-on-policy on soup plan and soup apply (#2315); dtype for Transformers loads (#2257); Windows paths in soup adapters bisect --eval-command (#2314); named config read errors in soup plan and soup apply (#2323); GPUs hidden by CUDA_VISIBLE_DEVICES in soup doctor (#2206); Docker latest kept on the newest stable release (#2214); bounded RunPod failure diagnostics (#2256); JSON diagnostics kept on stderr for soup cost and soup profile (#2345, #2398); recorded zero metrics in soup why (#2344); Click-safe test runners (#2189, #2334)
  • Nurkhan Esenbek (@kok-o), 16: output-over-input refusals for the remaining soup data commands and soup data ingest (#2274, #2349); soup data evolve and gen-magpie keep their output when every provider call fails (#2348); soup data filter --perplexity fails without its dependencies (#2377); soup data dedup --field on an absent key (#2336); thumbs-up pairs that differ (#2495); live soup ship --progress jsonl items per chunk (#2421); the RunPod bootstrap in a virtual environment (#2352); corrected DPO demo pairs (#2335); the recipes qwen3.5-0.8b-dpo and qwen3.5-27b-dpo (#2184, #2445); benchmark, test and docs records (#2172, #2183, #2354, #2413, #2273)
  • Yang Bai (@ybai08), 11: the VRAM pre-flight charges a stream_loss_chunk step's last-layer recompute (#2290), prices a sharded run per card (#2313) and a PRM step's logits (#2337, #2372), and says it does not model activation offloading (#2331); PPO gradient checkpointing (#2319, #2340); one input-gradient hook across PPO, GRPO and online DPO steps (#2373); MLX GRPO on pre-quantized 4-bit bases (#2386); a streamed DeepSeek-V3 test for DPO, ORPO, SimPO and KTO (#2291); MLX TF32 default off in the native tests (#2391)
  • Abdulwaarith Zakariyya (@abdulwaarith0), 8: soup profile --model (#2285); task: sft refuses the four settings a path never reads (#2278); the optimizer step as its own phase of the VRAM peak (#2338); finish_reason: "length" replies (#2380); the monthly spend reset in soup loop watch and the state shown by soup loop status (#2387, #2424); the Fast-LoRA timing harness (#2287); the Windows CI bf16 skips (#2346)
  • Tal (@taljeon), 5: eval batches that mutate their input (#2463), a non-finite regression tolerance (#2464), non-finite stored scores (#2477), non-finite judge recheck limits (#2493) and judge JSONL rows checked before generation (#2494)
  • EtherealMelon (@EtherealMelon), 4: rows Soup cannot interpret are named instead of dropped (#2281); Lambda install output kept in the log (#2282); soup train --resume names the path it searched (#2389); three tests no longer depend on the machine (#2318)
  • Faisal Fayaz (@Faisal-Fayaz), 4: soup eval quant-check exits 3 on an unparseable --tasks file (#2185); the #792 CUDA rows rewritten against the 2x float64 rule (#2188); NF4 streaming and o_proj Fast-LoRA coverage (#2328); the unlisted MLX tests run in mlx-smoke (#2342)
  • vaputa (@vaputa), 4: MLX task: preference (#2333); soup ship --progress jsonl errors and exit 130 on Ctrl+C (#2417); MLX Adafactor with the configured learning rate and schedule (#2484); soup merge at the recorded base revision (#2485)
  • Ryzn (@ryznren), 3: Unsloth targets and 4-bit weight dtypes in the VRAM estimate (#2376); duplicate README stamps and banners rejected by a test (#2316); GRPO judge reason length boundaries covered (#2317)
  • Aditya Pratap Singh (@akkupratap323), 2: soup distill-prompt refuses traces with no prompt instead of emptying its output (#2209); the strip-before-escape order for bidi and invisible format characters pinned (#2350)
  • Sharvin (@Guts1005), 2: soup registry push refuses runs that are not completed (#2248); soup ci init --python checks the supported range (#2249)
  • Harry C (@harryc295), 2: a skipped near-duplicate check in soup data lint reads SKIPPED, not OK (#2411); CONTRIBUTING names scripts/sync_recipe_count.py (#2394)
  • Harshit Sharma (@harshitthek), 2: resolve_device("auto") resolves to a real device (#2396); CPU GRPO numerical probes (#2364)
  • WU Leizhi (@MbappeWU), 2: the MLX rsLoRA alpha rebuilt as scale * sqrt(rank) in soup adapters audit (#2255); /v1/messages applies temperature and top_p (#2388)
  • ShryukGrandhi (@ShryukGrandhi), 2: soup adapters arithmetic and merge refuse an output that names an input adapter (#2379); soup ship --adapter refuses an adapter whose lora_B tensors are all zero (#2434)
  • shubham-dev-stack (@Shubham-dev-stack), 2: an unreachable minillm_enabled check removed (#2422); the MLX test scan memoized (#2504)
  • Vansh Sharma (@VanshSharmaPES), 2: soup bench train measures 4-bit configs whose adapters TRL casts to bf16 (#2216); the T4 forecast bracket measured against a real tokens-per-second figure (#2230)
  • King's MAN (@CG-5228), 1: soup train --gpus N asks the confirmation once and passes --yes to the child ranks (#2250)
  • Columbus Labs (@ColumbusLabs), 1: soup quantize --to awq and gptq name their v0.77.0 removal, and a --to value is shown as typed (#2217)
  • Mayuri (@mayuriphad), 1: MLX DPO --resume refuses an adapter of another task or base (#2321)
  • Matt Van Horn (@mvanhorn), 1: Rich markup in soup data paths and flags no longer raises MarkupError (#1882)
  • Sohaib Kamash (@Nick-800), 1: soup infer --cuda-graphs inspects a local adapter's recorded base before the load (#1942)
  • Ben Younes (@ousamabenyounes), 1: data.max_length enforced across the SimPO, KTO, IPO and BCO wrappers (#1196)
  • qwist1233-cpu (@qwist1233-cpu), 1: the unused estimate functions of utils/profiler.py removed (#2369)
  • Samarth Mukhija (@Samearth17), 1: soup doctor --config drops MLX support rows that config loading refuses (#2258)
  • Shivansh Shukla (@ShivanshShukla), 1: the Aider benchmark container is removed on timeout and Ctrl+C (#2280)
  • Baktiyar Ablaikhan (@sronters), 1: k-bit logits memory overhead pinned by a test (#2351)
  • Tektrix (@Tektrix), 1: the mypy errors added in v0.77.1 annotated and narrowed (#2320)
  • Tejas (@TejasS1233), 1: stale v0.77.0 help text corrected (#2268)
  • xiemocun (@xiemocun), 1: the pinned arm in the 6.56x comparison of benchmarks/gate-h100-validation.md marked as the wrong one (#2271)

Reports that led to fixes in this release: @Batyrkhantzy111 (#2359, #2360), @abdulwaarith0 (#2288).

Don't miss a new Soup release

NewReleases is sending notifications on new releases.