Assignment2 / app.py
yk07577's picture
Create app.py
0528593 verified
Raw History Blame Contribute Delete
3.26 kB
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import math
# Default public model
DEFAULT_MODEL = "HuggingFaceH4/zephyr-7b-beta"
def run_analysis(model_id, prompt_variations, temperature, max_new_tokens):
# Load model
tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, device_map="auto")
results = []
for prompt in prompt_variations:
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
temperature=temperature,
do_sample=True if temperature > 0 else False,
return_dict_in_generate=True,
output_scores=True
)
# Decode text
output_text = tokenizer.decode(outputs.sequences[0], skip_special_tokens=True)
# Extract generated part
prompt_len = inputs["input_ids"].shape[1]
gen_ids = outputs.sequences[0][prompt_len:]
scores = outputs.scores
if len(scores) != len(gen_ids):
L = min(len(scores), len(gen_ids))
scores = scores[:L]
gen_ids = gen_ids[:L]
# Logprobs
logprobs = []
for step_logits, tid in zip(scores, gen_ids):
lp = torch.log_softmax(step_logits, dim=-1)[tid.item()].item()
logprobs.append(lp)
# Build table of top-5 alternatives
table = "Token | P(token) | Top alternatives\n"
table += "-"*50 + "\n"
for tid, lp, step_logits in zip(gen_ids, logprobs, scores):
alts = torch.topk(torch.log_softmax(step_logits, dim=-1), 5)
alt_tokens = [tokenizer.decode([i]) for i in alts.indices.tolist()]
alt_probs = [f"{math.exp(p)*100:.1f}%" for p in alts.values.tolist()]
alt_str = ", ".join([f"{t} ({p})" for t, p in zip(alt_tokens, alt_probs)])
table += f"{tokenizer.decode([tid])} | {math.exp(lp)*100:.1f}% | {alt_str}\n"
results.append(f"Prompt: {prompt}\n\nOutput:\n{output_text}\n\nToken Probabilities:\n{table}")
return "\n\n---\n\n".join(results)
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# Prompt Variations & Token Analysis (Free, HF Models)")
model_id = gr.Textbox(value=DEFAULT_MODEL, label="Model ID", placeholder="Enter a model like HuggingFaceH4/zephyr-7b-beta")
prompts = gr.Textbox(lines=6, value="Explain dollar-cost averaging to a beginner in 6–8 sentences.\nIn 6–8 sentences, teach a newbie how dollar-cost averaging works.", label="Prompt Variations (one per line)")
temp = gr.Slider(0, 1, 0.2, label="Temperature")
max_tokens = gr.Slider(10, 500, 220, step=10, label="Max new tokens")
btn = gr.Button("Run Analysis")
output = gr.Textbox(lines=30, label="Results")
btn.click(
run_analysis,
inputs=[model_id, prompts, temp, max_tokens],
outputs=output
)
if __name__ == "__main__":
demo.launch()