Repository navigation
v0.12.0
A minor bump: meta.json identity moves to schema 3, with one identity per
stage, and the 0.10/0.11 deprecations are removed. RESULT_SCHEMA_VERSION
stays 1, so 0.10.x and 0.11.0 result directories resume, and an unchanged task
upgrades in place to schema 3 without regrading. sieval run now starts an
engine only for samples left to infer, and sieval run --dry-run reports what
the run would do, per model and per task.
Migrating from 0.11.x
meta.jsonidentityis schema 3 (#211, #218): one identity per stage,data,preprocess(wasprompt),inference,postprocess,feedback,report. The combinedgraderis gone; judges and services move tofeedback.preprocessis{digest, modules, args, splits?, fallback?}, the code and arguments that render a prompt, instead of a digest of the rendered prompts. Eachpreprocessrecord is stamped{data, preprocess}instead of{data, prompt}. A reader ofmeta.jsonmust accept schemas 1 to 3: 1 from 0.10.x and 0.11.0, 2 from unreleasedmainbuilds only, 3 from now on.RESULT_SCHEMA_VERSIONstays 1, so 0.10.x and 0.11.0 directories resume: an unchanged task's directory upgrades in place without regrading, after one localpreprocesscall per recorded sample. Apreprocesschange now restarts every sample of the task.TaskSaver.begin_run(identity={...})andset_identity(**stages)replace the per-stage keyword arguments.- Removed (#222):
sieval.cli.leaderboard.session, deprecated in 0.11.0. Import fromsieval.cli.session, and resolvers fromsieval.cli.resolution.--resume-from DIRis an unknown option. Use--resume DIR.runner_config.auto_resumeandrunner_config.resume_from, top-level or per task, are refused before anything runs, naming theresumeform to use. In 0.11.0 they warned and still worked. Writeresume: trueorresume: <dir>.- The Transport aliases (
sieval.core.models.Transport,OpenAIChatTransport,OpenAICompletionsTransport); use the Dialect names.SglangTransportstays.sieval.infer.InferConfigis gone.
SIEVAL_TARGET_GPU(<name>:<count>:<memory MiB>, asnvidia-smireports, e.g.NVIDIA H100 80GB HBM3:8:81559) declares the GPUs a serving plan is resolved for, so a CPU node resolves the plan, and the inference identity, a GPU node would. Unset, nothing changes. Set, an engine launches only on a node with exactly those GPUs (#215).sieval runlaunches engines lazily on a resume (#216): a run that may resume plans each task first and starts only the engines some task still has samples to infer with. A resume that reruns only grading stages starts no engine and runs without GPUs. A fresh run launches as before.sieval run --dry-runnow loads every dataset and starts each vendored service a task declares, as the run does, in order to plan each task (#217). A dry-run on a node without the data fails theresume_plancheck, where 0.11.0's passed; stage the data, or mount it, before the dry-run. It still launches no engine and writes no result directory.Model.extracarries capabilities a task may ask for, starting withsequence_wrappers(#218, #221). A malformedsequence_wrapperstemplate is refused when the model is built and by--dry-run.- A plugin task declares its report metric names with
report_metrics = report_metrics(...)(sieval.core.tasks.report_metrics) on its class (#225). Undeclared,tasks.<task>.metricsin the dry-run isnull; a malformed declaration fails thereport_metricscheck.
Changed
preprocessis identified by code, not by the prompts it renders (#218): the static walk the grading stages use, thegrader_args()it reads, and for few-shot a digest of the split it draws from. A model'sextrareaches the request, whichinferencedigests, so a wrapping and a plain model sharepreprocessand differ ininference. A run-time name or a file opened at run time falls back to the task's whole code and the data files beside the reader. A preprocess change now restarts every sample of the task, where before only the samples whose prompt changed restarted.- A resume reruns from the earliest stage that changed (#210). An extraction change reruns from
postprocess, a scoring change (judge, prompt, sampling, service,feedbackcode) fromfeedback, and areport-only change recomputesreport.jsonfrom the records with no engine or judge call. Before, each of these regraded every sample. Code is attributed to stages by a static walk; a run-time lookup (getattr(self, <expr>),eval,importlib) falls back to all grading code. No built-in task falls back. runs[].resumecounts what a resume did with each recorded sample.sieval runstarts an engine only for a model with samples to infer (closes #213). A run that may resume (--resume, orresumein arunner_config) first plans each task's resume, read-only, through the runner's own resume planning (TaskRunner.plan_run), and launches only the engines whose models some task still has samples to infer with. A resume that reruns only grading stages, or re-reports, starts no engine and runs on a node without GPUs; when some sample needs inference andnvidia-smifinds no GPU, the run is refused before anything starts. The plans,infer_plans.yaml, the inference identity and its request digest are what an eager launch records. A fresh run is not planned and launches as before. A sample thatfeedbacksends to another iteration after a rerun fromfeedbackfails atinferwhen its engine was not started, and a resume that starts it retries it.
Added
Model.extrais the capability contract between tasks and models, starting withsequence_wrappers(#218). A task asks for a capability by key and does nothing different when it is absent.sequence_wrappers: {<seq_type>: "<format with {seq}>"}(typesdna,rna,protein,mol) gives the special tokens a model was trained with around biological sequences; a task reads it withsequence_wrapper(self.model.extra, <type>)inpreprocess. A malformed template is refused when the model is built and by--dry-run. No built-in task injects such sequences yet.SIEVAL_TARGET_GPUdeclares the GPUs a serving plan is resolved for, as<name>:<count>:<memory MiB>with the name and memorynvidia-smireports, e.g.NVIDIA H100 80GB HBM3:8:81559. Recipe resolution reads it instead ofnvidia-smi, on any node, so a CPU node resolves the plan, and the inference identity, a node with those GPUs would. Unset, nothing changes. Declared, an engine launches only on a node with exactly those GPUs.infer_plans.yamlgainsgpu, the GPUs its plans were resolved for, outside every identity; asieval run --resumedeclaring the same GPUs reuses the recorded plan of each served model whosepath,infer, capability layer anddeterministicare unchanged, unless the plan held an engine secret, whichinfer_plans.yamlrecords redacted (#215, closes #212).sieval.core.runners.task_resume_plan/plan_resume: the per-stage resume plan, without running anything.TaskRunner.plan_run/MultiTaskRunner.plan_run(RunPlan): the runner's per-sample plan of a run,to_inferincluded, read-only; the onesieval runlaunches by.sieval run --dry-runreports what the run would do (closes #214).-o jsonaddsgpu,models(each served model's plan asinfer_plans.yamlwould record it, each process its launch starts, andneeds_inference, whether this run starts it),tasks(each task'sstart,resume_planwith the countsruns[].resumewill record,nullfor a fresh start,new,to_inferandto_grade) andneeds_inference, whether any engine starts. The plans come from the callsieval runlaunches by. A resume that would be refused, or planning that raises, fails the newresume_plancheck; when the dry-run stops before planning,tasksandneeds_inferencearenull. It launches no engine, writes no result directory, reads--resumedirectories in place, and runs on a node without GPUs givenSIEVAL_TARGET_GPU. Planning loads the datasets and starts each vendored service a task declares, as the run does, so a dry-run that passes its checks costs a session setup. The existing checks are unchanged.sieval run --dry-runreports each task'sstages(per-stagesame/differs/unknown, andrerun_from, the stage a resume reruns from), its ownneeds_inference, and itsmetrics(below);RunPlangainsstages(closes #219).- A task's report metric names are known before it runs (closes #223):
tasks.<task>.metricsin the dry-run is{names, patterns}, ornullwhen unknown, and a malformed declaration fails a newreport_metricscheck. Built-in tasks are declared insieval/meta/report_metrics.py, outside every stage identity; a plugin task declaresreport_metrics = report_metrics(...)(sieval.core.tasks.report_metrics) on its class. Every task test checks its report against the declaration.
Removed
sieval.cli.leaderboard.session, deprecated in 0.11.0. Import fromsieval.cli.session(resolvers fromsieval.cli.resolution).- The resume aliases deprecated in 0.10.0.
--resume-from DIRis now an unknown option (use--resume DIR). A config settingrunner_config.auto_resumeorrunner_config.resume_from, top-level or per task, is refused before anything runs, naming theresumeform to use, rather than ignored, so a resume never silently becomes a fresh run.TaskRunnerConfig(auto_resume=, resume_from=),EvalSession(resume_from=),arun_session(resume_from=)/run_session(resume_from=)andsieval.core.runners.fold_resume_aliasesare gone; passresume=Trueorresume=<dir>. - The transport import aliases:
sieval.core.models.Transport(usesieval.core.models.dialect.Dialect), andOpenAIChatTransport/OpenAICompletionsTransportfromsieval.core.models.transports(useOpenAIChatDialect/OpenAICompletionsDialectfromsieval.core.models.dialects).SglangTransportstays. sieval.infer.InferConfig, unused sinceDeploymentPlanreplaced it.
Fixed
- A concurrency limit admits no extra task.
anyiobefore 4.15 let a task scheduled ahead of a woken waiter take the slot too, soconcurrency_limit,concurrency_limitsand a model'sconcurrency_limitcould run one request over their bound. SiEval now requiresanyio>=4.15(#224).