mirror of https://github.com/razor-ai/soup.git
feat(recipes): add ready-made SFT recipe for Qwen2.5-Coder-7B-Instruct (#285)
* feat(recipes): add qwen2.5-coder-7b-sft recipe to catalog * test(recipes): update catalog size assertion to 134 in recipe tests * test(recipes): update version catalog count to 134 in v0.71.24 tests * docs(contrib): bump recipe count in project structure overview * docs(commands): update recipe list count reference to 134 * docs(serve): update Web UI recipe count references in serving docs
This commit is contained in:
parent
6cb2e0201e
commit
14de9ec9d5
|
|
@ -110,7 +110,7 @@ src/soup_cli/
|
|||
experiment/ - SQLite experiment tracking
|
||||
eval/ - Eval platform (custom tasks, LLM judge, human eval, leaderboard)
|
||||
migrate/ - Config migration (LLaMA-Factory, Axolotl, Unsloth)
|
||||
recipes/ - Ready-made configs for popular models (133 recipes)
|
||||
recipes/ - Ready-made configs for popular models (134 recipes)
|
||||
autopilot/ - Zero-config decision engine (v0.25.0)
|
||||
registry/ - Model Registry (hashing, store, diff, attach) (v0.26.0 + v0.33.0)
|
||||
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
|
|||
soup migrate --from axolotl config.yml Import config from Axolotl
|
||||
soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
|
||||
soup migrate --from llamafactory c.yaml --dry-run Preview without writing
|
||||
soup recipes list List all 133 ready-made recipes
|
||||
soup recipes list List all 134 ready-made recipes
|
||||
soup recipes show llama3.1-8b-sft Print recipe YAML
|
||||
soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
|
||||
soup recipes search "reasoning" Search by keyword/task/size
|
||||
|
|
|
|||
|
|
@ -418,7 +418,7 @@ soup ui
|
|||
|
||||
**Pages:**
|
||||
- **Dashboard** — view all experiment runs, loss charts, system info, multi-run comparison
|
||||
- **New Training** — create configs from templates or 133 ready-made recipes, validate, start training with live SSE log streaming and progress bar
|
||||
- **New Training** — create configs from templates or 134 ready-made recipes, validate, start training with live SSE log streaming and progress bar
|
||||
- **Data Explorer** — browse and inspect datasets (JSONL, JSON, CSV, Parquet)
|
||||
- **Model Chat** — chat with streaming responses, configurable temperature/top_p/max_tokens, system prompt, adapter selection, markdown rendering, chat export
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ soup ui
|
|||
- **Enhanced Metrics** — 2x2 chart grid (loss, LR, grad_norm, throughput) + GPU memory chart, eval results table
|
||||
- **Multi-Run Compare** — overlay loss curves from up to 5 runs side-by-side
|
||||
- **Chat Upgrade** — SSE streaming via proxy, typing indicator, cancel button, markdown renderer (bold, italic, code blocks), chat export as JSON
|
||||
- **Config Builder** — recipe dropdown (133 recipes), config schema API for dynamic form generation
|
||||
- **Config Builder** — recipe dropdown (134 recipes), config schema API for dynamic form generation
|
||||
|
||||
**Security:** The Web UI generates a random auth token at startup (printed to console). All mutating endpoints (start/stop training, delete runs, inspect data, validate config) require `Authorization: Bearer <token>` header. CORS is restricted to the served origin. Data inspection is sandboxed to the working directory.
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ def search_recipes(
|
|||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Recipe catalog (133 recipes)
|
||||
# Recipe catalog (134 recipes)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
RECIPES: Dict[str, RecipeMeta] = {
|
||||
|
|
@ -252,6 +252,34 @@ training:
|
|||
target_modules: auto
|
||||
quantization: 8bit
|
||||
|
||||
output: ./output
|
||||
""",
|
||||
),
|
||||
"qwen2.5-coder-7b-sft": RecipeMeta(
|
||||
model="Qwen/Qwen2.5-Coder-7B-Instruct",
|
||||
task="sft",
|
||||
size="7B",
|
||||
tags=("qwen", "qwen2.5", "coder", "code", "sft"),
|
||||
description="Qwen 2.5 Coder 7B instruction tuning with LoRA",
|
||||
yaml_str="""\
|
||||
base: Qwen/Qwen2.5-Coder-7B-Instruct
|
||||
task: sft
|
||||
|
||||
data:
|
||||
train: ./data/train.jsonl
|
||||
format: auto
|
||||
max_length: 2048
|
||||
|
||||
training:
|
||||
epochs: 3
|
||||
lr: 2e-4
|
||||
batch_size: auto
|
||||
lora:
|
||||
r: 16
|
||||
alpha: 32
|
||||
target_modules: auto
|
||||
quantization: 4bit
|
||||
|
||||
output: ./output
|
||||
""",
|
||||
),
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ class TestV025NewRecipes:
|
|||
assert cfg.base == recipe.model
|
||||
assert cfg.task == recipe.task
|
||||
|
||||
def test_catalog_size_is_133(self):
|
||||
def test_catalog_size_is_134(self):
|
||||
"""Total catalog size — grew with each release.
|
||||
|
||||
v0.25.0 shipped 43 recipes (29 + 9 Part A + 2 Part B tools + 3 Part E MLX).
|
||||
|
|
@ -271,10 +271,11 @@ class TestV025NewRecipes:
|
|||
v0.53.5 added 1 (deepseek-v3-reasoning) -> 113.
|
||||
v0.62.0 added 3 (raft-llama3-8b, ra-dit-retriever, ra-dit-llama3-8b) -> 116.
|
||||
v0.71.24 added 17 (2026 model-family expansion) -> 133.
|
||||
v0.71.25 added 1 (qwen2.5-coder-7b-sft) -> 134.
|
||||
"""
|
||||
from soup_cli.recipes.catalog import RECIPES
|
||||
|
||||
assert len(RECIPES) == 133
|
||||
assert len(RECIPES) == 134
|
||||
|
||||
def test_new_recipes_searchable(self):
|
||||
"""Search returns the new recipes via keyword/task filter."""
|
||||
|
|
|
|||
|
|
@ -264,13 +264,13 @@ class TestGlm5RepoIdFix:
|
|||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Catalog count — 116 -> 133
|
||||
# Catalog count — 116 -> 134
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
class TestCatalogCount:
|
||||
def test_total_recipe_count_is_133(self) -> None:
|
||||
assert len(RECIPES) == 133
|
||||
def test_total_recipe_count_is_134(self) -> None:
|
||||
assert len(RECIPES) == 134
|
||||
|
||||
def test_list_recipes_matches_dict(self) -> None:
|
||||
assert len(list_recipes()) == len(RECIPES)
|
||||
|
|
|
|||
Loading…
Reference in New Issue