mirror of https://github.com/razor-ai/soup.git
97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
"""v0.44.0 Part D — `soup fetch` example/config catalog.
|
|
|
|
Maps short names (e.g. `llama-3.1-8b-lora`) to ready-to-edit YAML payloads.
|
|
The catalog is a frozen registry; payload bodies live in
|
|
`templates/fetch_examples/*.yaml`.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from types import MappingProxyType
|
|
from typing import Mapping, Optional
|
|
|
|
# Closed-allowlist of fetch namespaces.
|
|
_VALID_NAMESPACES = frozenset({"examples", "configs", "deepspeed_configs"})
|
|
|
|
_MAX_NAME_LEN = 96
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class FetchEntry:
|
|
"""One catalog entry."""
|
|
|
|
name: str
|
|
namespace: str
|
|
filename: str
|
|
description: str
|
|
|
|
|
|
def _build_catalog() -> Mapping[str, FetchEntry]:
|
|
"""Construct the static catalog. Keep small and curated."""
|
|
raw = [
|
|
FetchEntry(
|
|
name="llama-3.1-8b-lora",
|
|
namespace="examples",
|
|
filename="llama-3.1-8b-lora.yaml",
|
|
description="Llama 3.1 8B SFT LoRA recipe (4-bit + r=16).",
|
|
),
|
|
FetchEntry(
|
|
name="qwen2.5-7b-dpo",
|
|
namespace="examples",
|
|
filename="qwen2.5-7b-dpo.yaml",
|
|
description="Qwen 2.5 7B DPO preference recipe.",
|
|
),
|
|
FetchEntry(
|
|
name="zero3-cpu-offload",
|
|
namespace="deepspeed_configs",
|
|
filename="zero3-cpu-offload.json",
|
|
description="DeepSpeed ZeRO-3 with CPU offload (24-32GB GPUs).",
|
|
),
|
|
]
|
|
return MappingProxyType({entry.name: entry for entry in raw})
|
|
|
|
|
|
CATALOG: Mapping[str, FetchEntry] = _build_catalog()
|
|
|
|
|
|
def list_entries(namespace: Optional[str] = None) -> Mapping[str, FetchEntry]:
|
|
"""Return entries, optionally filtered by namespace."""
|
|
if namespace is None:
|
|
return CATALOG
|
|
if namespace not in _VALID_NAMESPACES:
|
|
raise ValueError(
|
|
f"namespace must be one of {sorted(_VALID_NAMESPACES)}; "
|
|
f"got {namespace!r}"
|
|
)
|
|
return MappingProxyType(
|
|
{
|
|
name: entry
|
|
for name, entry in CATALOG.items()
|
|
if entry.namespace == namespace
|
|
}
|
|
)
|
|
|
|
|
|
def get_entry(name: str) -> Optional[FetchEntry]:
|
|
"""Look up a single entry by short name."""
|
|
if not isinstance(name, str):
|
|
return None
|
|
if not name or "\x00" in name or len(name) > _MAX_NAME_LEN:
|
|
return None
|
|
return CATALOG.get(name)
|
|
|
|
|
|
def fetch_examples_dir() -> str:
|
|
"""Filesystem path to the bundled fetch-example directory.
|
|
|
|
Uses `os.path.realpath` (project policy) so symlinked installs resolve
|
|
to the real package root, not the symlink target's parent.
|
|
"""
|
|
return os.path.join(
|
|
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
|
|
"templates",
|
|
"fetch_examples",
|
|
)
|