File size: 1,728 Bytes
33174d8
d5df1a3
33174d8
3dc5acc
33174d8
 
3dc5acc
33174d8
3dc5acc
33174d8
 
 
 
 
3dc5acc
5c2d8fb
33174d8
5c2d8fb
33174d8
 
 
 
 
3dc5acc
33174d8
 
3dc5acc
33174d8
 
 
 
5c2d8fb
33174d8
 
 
 
3dc5acc
 
33174d8
3dc5acc
33174d8
 
 
 
 
 
 
 
 
 
 
 
5c2d8fb
33174d8
 
5c2d8fb
33174d8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import spaces
import gradio as gr
import torch
from fastapi import FastAPI, Request
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
from threading import Thread

MODEL_ID = "Qwen/Qwen3.8-27B"  # Modelos >14B suelen exceder la memoria dinámica de ZeroGPU

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_ID,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

app = FastAPI()

@spaces.GPU(duration=120)
def generate_response(prompt: str, max_tokens: int = 2048):
    inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
    streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
    generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=max_tokens)
    
    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()
    
    output_text = ""
    for new_text in streamer:
        output_text += new_text
    return output_text

@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
    data = await request.json()
    messages = data.get("messages", [])
    prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    
    response_text = generate_response(prompt)
    
    return {
        "id": "chatcmpl-zerogpu",
        "object": "chat.completion",
        "choices": [{
            "index": 0,
            "message": {
                "role": "assistant",
                "content": response_text
            },
            "finish_reason": "stop"
        }]
    }

with gr.Blocks() as demo:
    gr.Markdown("# Qwen ZeroGPU Endpoint")

app = gr.mount_gradio_app(app, demo, path="/")