JudgeGPT / modal_app.py
AliIqbal05's picture
Initialize Judge-GPT Space (#1)
335b794
Raw
History Blame Contribute Delete
5.98 kB
import os
import time
import modal
from sovereign_bench.engine import stream_trial_jsonl
from sovereign_bench.llm import (
ModelCall,
ModelResult,
build_role_messages,
messages_hash,
)
from sovereign_bench.models import TrialRequest
app = modal.App("sovereign-bench")
GPU_NAME = "H100"
GPU_TIMEOUT_SECONDS = 20 * 60
HF_CACHE_DIR = "/root/.cache/huggingface"
image = (
modal.Image.debian_slim(python_version="3.12")
.pip_install("fastapi", "huggingface_hub", "httpx", "pydantic")
.add_local_dir("sovereign_bench", remote_path="/root/sovereign_bench")
)
model_cache = modal.Volume.from_name("sovereign-bench-model-cache", create_if_missing=True)
vllm_image = (
modal.Image.from_registry("nvidia/cuda:12.8.1-devel-ubuntu22.04", add_python="3.12")
.entrypoint([])
.uv_pip_install(
"vllm==0.18.1",
"huggingface_hub[hf_transfer]==0.36.0",
"transformers",
"httpx",
"pydantic",
)
.env(
{
"HF_HUB_ENABLE_HF_TRANSFER": "1",
"HF_HOME": HF_CACHE_DIR,
"VLLM_WORKER_MULTIPROC_METHOD": "spawn",
"VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8": "1",
}
)
.add_local_dir("sovereign_bench", remote_path="/root/sovereign_bench")
)
@app.cls(
image=vllm_image,
gpu=GPU_NAME,
secrets=[modal.Secret.from_name("huggingface")],
volumes={HF_CACHE_DIR: model_cache},
timeout=GPU_TIMEOUT_SECONDS,
scaledown_window=10 * 60,
max_containers=3,
)
class VllmModel:
model_id: str = modal.parameter()
@modal.enter()
def load(self) -> None:
from vllm import LLM, SamplingParams
self.SamplingParams = SamplingParams
self.llm = LLM(
model=self.model_id,
trust_remote_code=True,
max_model_len=4096,
gpu_memory_utilization=0.9,
)
@modal.method()
def generate(self, payload: dict) -> dict:
from sovereign_bench.llm import ModelCallError, clean_model_text
started = time.perf_counter()
messages = payload["messages"]
max_tokens = int(payload.get("max_tokens") or 120)
temperature = float(payload.get("temperature") or 0.45)
sampling_params = self.SamplingParams(
max_tokens=max_tokens,
temperature=temperature,
top_p=0.9,
)
retry_messages = messages + [
{
"role": "user",
"content": (
"Your previous response did not include visible courtroom dialogue. "
"Return only the final spoken dialogue now. Do not include <think>, analysis, reasoning, markdown, or notes. /no_think"
),
}
]
last_error: Exception | None = None
text = ""
for attempt_messages in (messages, retry_messages):
outputs = self.llm.chat(
[attempt_messages],
sampling_params=sampling_params,
use_tqdm=False,
chat_template_kwargs={"enable_thinking": False},
)
raw_text = outputs[0].outputs[0].text.strip()
try:
text = clean_model_text(raw_text)
break
except ModelCallError as exc:
last_error = exc
if not text and last_error:
raise last_error
return {
"text": text,
"latency_ms": int((time.perf_counter() - started) * 1000),
}
def modal_gpu_enabled() -> bool:
return os.getenv("SOVEREIGN_DISABLE_MODAL_GPU", "").lower() not in {"1", "true", "yes"}
def modal_gpu_runner(**kwargs) -> ModelResult:
messages = build_role_messages(
agent=kwargs["agent"],
role=kwargs["role"],
case_summary=kwargs["case_summary"],
task=kwargs["task"],
evidence_summary=kwargs["evidence_summary"],
)
requested_model = kwargs["model"]
prompt_hash = messages_hash(messages)
if modal_gpu_enabled():
output = VllmModel(model_id=requested_model).generate.remote(
{
"messages": messages,
"max_tokens": kwargs.get("max_tokens", 120),
"temperature": 0.45,
}
)
return ModelResult(
text=output["text"],
input_text="\n\n".join(f"{item.get('role', 'user').upper()}:\n{item.get('content', '')}" for item in messages)
+ "\n\nASSISTANT:\n",
call=ModelCall(
model=requested_model,
provider="modal-gpu-vllm",
ok=True,
latency_ms=output["latency_ms"],
prompt_hash=prompt_hash,
requested_model=requested_model,
runtime="modal-gpu-vllm",
gpu=GPU_NAME,
),
)
raise RuntimeError("Modal GPU is disabled; no provider fallback is allowed.")
@app.function(image=image, secrets=[modal.Secret.from_name("huggingface")])
def check_huggingface_connection() -> str:
token = os.getenv("HF_TOKEN")
if not token:
return "HF_TOKEN is not available inside Modal."
from huggingface_hub import HfApi
user = HfApi(token=token).whoami()["name"]
return f"Connected to Hugging Face as {user}."
@app.function(
image=image,
secrets=[modal.Secret.from_name("huggingface")],
min_containers=1,
timeout=GPU_TIMEOUT_SECONDS,
)
@modal.fastapi_endpoint(method="POST", label="trial-stream")
def trial_stream(payload: dict):
from fastapi.responses import StreamingResponse
request = TrialRequest.model_validate(payload)
delay = {"swift": 0.02, "measured": 0.12, "ceremonial": 0.25}[request.speed]
return StreamingResponse(
stream_trial_jsonl(request, delay=delay, model_runner=modal_gpu_runner),
media_type="application/x-ndjson",
)
@app.local_entrypoint()
def main():
print(check_huggingface_connection.remote())