thousand-token-wood-sim / modal_smoke_test.py
AdmiralTaco's picture
Thousand Token Wood: emergent small-model economy for Build Small Hackathon
c26b033
Raw
History Blame Contribute Delete
1.8 kB
"""Modal GPU smoke test for Thousand Token Wood.
Proves the serving path works end to end before the hack weekend:
- a GPU container spins up on Modal
- a small model (<=32B) loads
- it returns one in-character generation
Run: python -m modal run modal_smoke_test.py
"""
import modal
MODEL = "Qwen/Qwen2.5-7B-Instruct" # ~15GB in bf16, fits on a single L4 (24GB)
app = modal.App("ttw-smoke-test")
image = (
modal.Image.debian_slim(python_version="3.12")
.pip_install("transformers==4.46.0", "torch==2.5.1", "accelerate==1.1.1")
)
@app.function(gpu="L4", image=image, timeout=900)
def generate() -> str:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained(MODEL)
model = AutoModelForCausalLM.from_pretrained(
MODEL, torch_dtype=torch.bfloat16, device_map="cuda"
)
messages = [
{
"role": "system",
"content": "You are Fenn, a sly fox trader in Thousand Token Wood.",
},
{
"role": "user",
"content": (
"The price of acorns just crashed after a rumor that the harvest "
"was poisoned. In one sentence, decide whether you buy or sell, "
"and why."
),
},
]
text = tok.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
inputs = tok(text, return_tensors="pt").to("cuda")
out = model.generate(**inputs, max_new_tokens=80, do_sample=False)
return tok.decode(
out[0][inputs.input_ids.shape[1]:], skip_special_tokens=True
).strip()
@app.local_entrypoint()
def main():
print("\n=== Fenn the fox says ===")
print(generate.remote())
print("=========================\n")