unstuck / scripts /finetune /modal_verify.py
art87able's picture
deploy: multi-backend (minicpm/nemotron/finetuned) + 3-tier ZeroGPU->serverless->local-finetune fallback; finetune pipeline
fe7f8fd
Raw
History Blame Contribute Delete
1.96 kB
"""Load the *published* fine-tuned model fresh from the Hub and prove it produces
a schema-valid Unstuck breakdown — airtight evidence for achievement:welltuned.
Run: .venv/bin/python -m modal run scripts/finetune/modal_verify.py
"""
from __future__ import annotations
import pathlib
import sys
import modal
MODEL = "art87able/unstuck-qwen2.5-0.5b-steps"
image = modal.Image.debian_slim(python_version="3.11").pip_install(
"torch==2.5.1", "transformers==4.46.3", "huggingface_hub==0.26.2"
)
app = modal.App("unstuck-verify", image=image)
@app.function(gpu="A10G", timeout=600)
def verify(prompt: str) -> str:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype="auto").to("cuda")
text = tok.apply_chat_template(
[{"role": "user", "content": prompt}],
add_generation_prompt=True,
tokenize=False,
)
inputs = tok(text, return_tensors="pt").to("cuda")
with torch.no_grad():
out = model.generate(**inputs, max_new_tokens=512, do_sample=False)
return tok.decode(out[0][inputs.input_ids.shape[-1] :], skip_special_tokens=True)
@app.local_entrypoint()
def main() -> None:
sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[2] / "src"))
from unstuck.model_adapter import _extract_json # type: ignore
from unstuck.prompts import breakdown_prompt # type: ignore
from unstuck.schema import validate_steps_payload # type: ignore
prompt = breakdown_prompt("Plan a small birthday dinner for six friends", "regular")
raw = verify.remote(prompt)
print("RAW:", raw)
steps = validate_steps_payload(_extract_json(raw))
print(
f"VALID ✓ {len(steps.steps)} steps; "
f"categories={sorted({s.category for s in steps.steps})}; "
f"max_minutes={max(s.est_minutes for s in steps.steps)}"
)