File size: 1,701 Bytes
e3f4a50
44a3a0e
e3f4a50
 
 
 
 
 
 
 
 
44a3a0e
 
e3f4a50
44a3a0e
e3f4a50
 
 
 
44a3a0e
e3f4a50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
58
59
# Install the necessary packages
# pip install accelerate transformers fastapi pydantic torch jinja2

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from pydantic import BaseModel
from fastapi import FastAPI

# Initialize the FastAPI app
app = FastAPI(docs_url="/")

# Determine the device to use
device = "cuda" if torch.cuda.is_available() else "cpu"

# Load the model and tokenizer once at startup
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen1.5-0.5B-Chat",
    torch_dtype="auto",
    device_map="auto"
).to(device)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B-Chat")

# Define the request model
class RequestModel(BaseModel):
    input: str

# Define a greeting endpoint
@app.get("/")
def greet_json():
    return {"message": "working..."}

# Define the text generation endpoint
@app.post("/prompt")
def get_response(request: RequestModel):
    prompt = request.input
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = model.generate(
        model_inputs.input_ids,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    return {"generated_text": response}

# To run the FastAPI app, use the command: uvicorn <filename>:app --reload