LFM2.5-2.6B-RLCD / lfm25_pcd_modal.py
monotykamary's picture
feat: add verified inference-only parallel constrained decoding
3145545 verified
Raw History Blame Contribute Delete
5.15 kB
"""Frugal PCD validation/benchmarking and optional authenticated serving on Modal.
modal run lfm25_pcd_modal.py --task prepare
modal run lfm25_pcd_modal.py --task validate
modal run lfm25_pcd_modal.py --task benchmark
Publication is a separate, explicit --task publish operation.
"""
import json
from pathlib import Path
import modal
app = modal.App("lfm25-26b-pcd")
root = Path(__file__).parent
cache = modal.Volume.from_name("huggingface-cache", create_if_missing=True)
results = modal.Volume.from_name("lfm25-26b-pcd-results", create_if_missing=True)
base = modal.Image.debian_slim(python_version="3.11").env(
{
"HF_HOME": "/root/.cache/huggingface",
"TOKENIZERS_PARALLELISM": "false",
"HF_HUB_DISABLE_TELEMETRY": "1",
"OMP_NUM_THREADS": "4",
}
)
cpu_image = base.uv_pip_install("huggingface-hub==1.31.0", "pyyaml==6.0.3").add_local_python_source(
"pcd"
)
gpu_image = (
base.pip_install_from_requirements(str(root / "requirements-pcd.txt"))
.add_local_python_source("pcd")
.add_local_dir(root / "tests" / "pcd", "/root/tests/pcd")
)
@app.function(
image=cpu_image,
secrets=[modal.Secret.from_name("huggingface")],
volumes={"/root/.cache/huggingface": cache},
timeout=900,
memory=4096,
max_containers=1,
)
def prepare():
from pcd.publishing import prepare as prepare_snapshot
info = prepare_snapshot()
cache.commit()
return info
@app.cls(
image=gpu_image,
gpu="L40S",
cpu=4,
memory=16384,
timeout=900,
min_containers=0,
max_containers=1,
scaledown_window=30,
volumes={"/root/.cache/huggingface": cache, "/results": results},
)
class PCDModel:
precision: str = modal.parameter(default="float16")
@modal.enter()
def load(self):
import torch
from pcd.engine import Engine
if self.precision not in {"float16", "bfloat16", "float32"}:
raise ValueError("unsupported precision")
torch.set_num_threads(4)
torch.set_float32_matmul_precision("highest")
self.engine = Engine(
device="cuda", dtype=self.precision, attention="sdpa", local_files_only=True
)
@modal.method()
def run(self, task: str, suite: str = "diagnostic", repeats: int = 3):
from pcd.benchmark import execute
report = execute(self.engine, task=task, suite=suite, repeats=repeats)
path = Path("/results") / (report["run_id"] + ".json")
path.write_text(json.dumps(report, indent=2, ensure_ascii=False) + "\n")
results.commit()
return report
@modal.method()
def infer(self, context: str, schema: dict, mode: str = "token"):
return self.engine.constrained(context, schema, mode=mode)
@modal.fastapi_endpoint(method="POST", requires_proxy_auth=True, docs=False)
def extract(self, payload: dict):
import jsonschema
from fastapi import HTTPException
try:
if set(payload) - {"context", "schema", "mode"}:
raise ValueError("unsupported request keys")
return self.engine.constrained(
payload["context"], payload["schema"], mode=payload.get("mode", "token")
)
except (ValueError, KeyError, TypeError, jsonschema.SchemaError) as exc:
raise HTTPException(status_code=422, detail=str(exc)) from None
release_dir = root / "release" / "pcd"
publish_image = (
cpu_image.add_local_dir(release_dir, "/release-src") if release_dir.is_dir() else cpu_image
)
@app.function(
image=publish_image,
secrets=[modal.Secret.from_name("huggingface")],
volumes={"/root/.cache/huggingface": cache, "/results": results},
timeout=1800,
cpu=4,
memory=8192,
max_containers=1,
)
def publish(public: bool = False):
from pcd.publishing import publish as publish_bundle
result = publish_bundle(public=public)
results.commit()
return result
@app.local_entrypoint()
def main(
task: str = "validate",
suite: str = "diagnostic",
repeats: int = 3,
precision: str = "float16",
public: bool = False,
):
if task not in {"prepare", "validate", "benchmark", "probe", "publish"}:
raise ValueError("task must be prepare, validate, benchmark, probe, or publish")
if repeats < 1 or repeats > 10:
raise ValueError("repeats must be between 1 and 10")
if public and task != "publish":
raise ValueError("--public only applies to --task publish")
if task == "publish":
if not release_dir.is_dir():
raise ValueError("stage the release with scripts/build_pcd_release.py first")
report = publish.remote(public)
elif task == "prepare":
report = prepare.remote()
else:
report = PCDModel(precision=precision).run.remote(task, suite, repeats)
output = root / "results" / "pcd"
output.mkdir(parents=True, exist_ok=True)
path = output / (report.get("run_id", task) + ".json")
path.write_text(json.dumps(report, indent=2, ensure_ascii=False) + "\n")
print(json.dumps({"report": str(path), "summary": report.get("summary", report)}, indent=2))