gemmaextract / app.py
mr-checker's picture
Update app.py
12fdd84 verified
Raw
History Blame Contribute Delete
1.99 kB
import os
import torch
import gradio as gr
import spaces # REQUIRED FOR ZEROGPU
from transformers import AutoTokenizer, AutoModelForCausalLM # Fixed: Added this missing import!
model_id = "mr-checker/GemmaExtract"
hf_token = os.getenv("HF_TOKEN")
# Load Tokenizer & Model
tokenizer = AutoTokenizer.from_pretrained(model_id, token=hf_token)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
token=hf_token
).to("cuda") # ZeroGPU requires models to be pushed to cuda at the root level
system_prompt = (
"You are an expert data analyst. Extract metadata from the YouTube title and description. "
"Output MUST be a valid JSON object with the exact keys: 'market_signal', 'user_intent', and 'skills'."
)
# This tells HF to allocate a GPU when the button is clicked
@spaces.GPU
def extract_metadata(title, description):
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"Title: {title}\nDescription: {description}"}
]
model_inputs = tokenizer.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
).to("cuda")
outputs = model.generate(
**model_inputs,
max_new_tokens=200,
do_sample=False
)
input_len = model_inputs["input_ids"].shape[-1]
generated_tokens = outputs[0][input_len:]
return tokenizer.decode(generated_tokens, skip_special_tokens=True)
# Build Gradio UI
demo = gr.Interface(
fn=extract_metadata,
inputs=[
gr.Textbox(label="YouTube Video Title", placeholder="Enter title..."),
gr.Textbox(label="YouTube Video Description", placeholder="Enter description...", lines=4)
],
outputs=gr.Code(label="Extracted JSON Output", language="json"),
title="GemmaExtract - YouTube Metadata Extractor"
)
demo.launch()