bielik / main.py
artelo1's picture
Zmiany main.py
c8bd764 verified
raw
history blame
3.6 kB
import os
import uvicorn
import torch
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse, Response
from pydantic import BaseModel
from transformers import pipeline
# Utw贸rz instancj臋 FastAPI
app = FastAPI(
title="Bielik Text Generation API",
description="API do generowania tekstu za pomoc膮 modelu Bielik-1.5B-v3.0-Instruct",
version="1.0.0"
)
# 艢cie偶ka do modelu - Hugging Face automatycznie pobierze model
MODEL_NAME = "speakleash/Bielik-1.5B-v3.0-Instruct"
generator = None # Zostanie za艂adowany p贸藕niej
# Model wej艣ciowy dla POST request
class GenerationRequest(BaseModel):
prompt: str
max_new_tokens: int = 50
temperature: float = 0.7
top_p: float = 0.9
@app.on_event("startup")
async def startup_event():
"""
艁adowanie modelu podczas uruchamiania aplikacji.
To zajmie troch臋 czasu, ale dzieje si臋 tylko raz.
"""
global generator
print(f"艁adowanie modelu: {MODEL_NAME}...")
try:
# Mo偶esz dostosowa膰 device=0 (GPU) lub device=-1 (CPU) w zale偶no艣ci od wybranej maszyny Space
# Free tier spaces usually run on CPU, unless you explicitly select a GPU.
# It's safer to not specify device if you want it to auto-detect or default to CPU.
generator = pipeline(
"text-generation",
model=MODEL_NAME,
# device=0 if torch.cuda.is_available() else -1 # Odkomentuj dla detekcji GPU
)
print("Model za艂adowany pomy艣lnie!")
except Exception as e:
print(f"B艂膮d 艂adowania modelu: {e}")
# Mo偶esz zdecydowa膰, czy aplikacja ma zako艅czy膰 dzia艂anie, czy kontynuowa膰 bez modelu
# W przypadku b艂臋du 艂adowania modelu, endpoint generacji tekstu b臋dzie zwraca艂 b艂膮d
generator = None # Ustaw na None, aby sygnalizowa膰 problem
@app.get("/")
async def root():
"""
G艂贸wny endpoint (health check).
"""
return {"message": "Bielik Text Generation API is running!"}
@app.post("/generate")
async def generate_text(request: GenerationRequest):
"""
Endpoint do generowania tekstu na podstawie promptu.
"""
if generator is None:
raise HTTPException(status_code=503, detail="Model nie zosta艂 za艂adowany lub wyst膮pi艂 b艂膮d.")
try:
generated_text = generator(
request.prompt,
max_new_tokens=request.max_new_tokens,
temperature=request.temperature,
top_p=request.top_p,
do_sample=True, # Wa偶ne dla generowania z temperatur膮
return_full_text=False # Dodaj ten parametr, aby model nie zwraca艂 od razu promptu
)
# Pipeline zwraca list臋 s艂ownik贸w, bierzemy pierwszy wynik
#gen_text = {"generated_text": generated_text[0]["generated_text"]}
response_data = {"generated_text": generated_text[0]["generated_text"]}
return JSONResponse(
content=response_data,
media_type="application/json; charset=utf-8"
)
#return Response(content=generated_text[0]["generated_text"], media_type="text/plain; charset=utf-8")
# return {"generated_text": generated_text[0]["generated_text"]}
except Exception as e:
raise HTTPException(status_code=500, detail=f"B艂膮d podczas generowania tekstu: {e}")
# Uruchamianie serwera Uvicorn bezpo艣rednio (dla Dockera)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", 7860)))