Коришћење FastAPI-ја за изградњу високо-перформансних, производно спремних LLM API-ја: Водич корак по корак
Коришћење FastAPI-ја за изградњу високо-перформансних, производно спремних LLM API-ја: Водич корак по корак
FastAPI, као модеран, високо-перформансан Python Web framework, је популаран због своје лакоће коришћења, брзине и аутоматски генерисане API документације. Посебно у изградњи LLM (Large Language Model) апликација за backend API, FastAPI показује велике предности. Овај чланак ће вас корак по корак научити како да користите FastAPI за изградњу производно спремног LLM API-ја, и истражити неке најбоље праксе.
Зашто одабрати FastAPI?
Приликом изградње API-ја за LLM апликације, FastAPI нуди следеће кључне предности:
- Високе перформансе: Заснован на ASGI, FastAPI може да обрађује велики број истовремених захтева, што је кључно за LLM апликације које захтевају брз одговор.
- Асинхрона подршка: FastAPI има уграђену подршку за кључне речи
asyncиawait, што олакшава руковање асинхроним операцијама, као што је позивање LLM закључивања, избегавајући блокирање главне нити. - Аутоматска API документација: FastAPI користи OpenAPI и JSON Schema за аутоматско генерисање интерактивне API документације (Swagger UI), што олакшава програмерима да тестирају и користе ваш API.
- Валидација података: FastAPI користи Pydantic за валидацију података, осигуравајући исправност параметара захтева, смањујући грешке.
- Убризгавање зависности: Систем за убризгавање зависности FastAPI-ја олакшава управљање и дељење ресурса, као што су LLM модели.
- Активна заједница: FastAPI има велику и активну заједницу, што омогућава приступ богатим ресурсима и подршци.
Припрема
-
Инсталирајте Python: Уверите се да сте инсталирали Python 3.7 или новију верзију.
-
Инсталирајте FastAPI и Uvicorn: Користите pip за инсталирање FastAPI и Uvicorn (ASGI сервер):
pip install fastapi uvicorn -
Изаберите LLM модел: Изаберите LLM модел који желите да користите. Може бити OpenAI модел, или модел отвореног кода, на пример TinyLlama. Ако одаберете OpenAI, морате да набавите OpenAI API кључ. Ако одаберете TinyLlama, морате да преузмете датотеку модела.
Корак 1: Креирање FastAPI апликације
Креирајте датотеку под називом main.py и додајте следећи код:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="A simple API for interacting with LLMs.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
Овај код дефинише FastAPI апликацију и дефинише два Pydantic модела: InputText за пријем улазног текста, OutputText за враћање генерисаног текста.
Корак 2: Додавање LLM логике закључивања
У зависности од LLM модела који сте одабрали, додајте одговарајућу логику закључивања. Овде је пример коришћења OpenAI API-ја:
import openai
import os
# Набавите OpenAI API кључ
openai.api_key = os.environ.get("OPENAI_API_KEY") # Препоручује се коришћење променљиве окружења
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generiše tekst na osnovu unetog teksta koristeći OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Izaberite model
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Ovaj kod definiše /generate rutu, koja prihvata InputText objekat kao ulaz, poziva OpenAI API za generisanje teksta i vraća generisani tekst kao OutputText objekat. Obratite pažnju da zamenite text-davinci-003 odgovarajućim modelom po vašem izboru.
Ako koristite lokalne modele kao što je TinyLlama, potrebno je da instalirate odgovarajuću biblioteku, na primer transformers, i učitate model u memoriju. Primer koda je sledeći:
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Generiše tekst na osnovu unetog teksta koristeći TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Korak 3: Pokretanje FastAPI aplikacije
Koristite Uvicorn za pokretanje FastAPI aplikacije:
uvicorn main:app --reload
```Ово ће покренути локални сервер, коме можете приступити у прегледачу на `http://127.0.0.1:8000/docs` да бисте видели аутоматски генерисану API документацију. Параметар `--reload` може аутоматски поново покренути сервер након измене кода, што олакшава развој.
## Корак 4: Тестирање API-ја
Користите API документацију или алатке као што је curl да бисте тестирали свој API. На пример, користите curl да пошаљете POST захтев:
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
Требало би да добијете JSON одговор који садржи генерисани текст.
Корак 5: Производно окружење
Примените FastAPI апликацију у производно окружење, на пример:
- Docker: Користите Docker да контејнеризујете своју апликацију, што олакшава примену и управљање.
- Cloud платформа: Примените на cloud платформу, као што су AWS, Google Cloud Platform или Azure. Azure Cosmos DB и Azure Functions, поменути у тексту, могу се користити за изградњу serverless API-ја. Modal се такође може користити за примену FastAPI апликација које се аутоматски скалирају.
- Сервер: Примените на сопствени сервер.
Најбоље праксе
- Користите променљиве окружења за складиштење осетљивих информација: Немојте хардкодирати осетљиве информације као што су API кључеви у коду, већ користите променљиве окружења.
- Додајте евидентирање (логирање): Користите модул за евидентирање да бисте забележили статус рада API-ја, што олакшава отклањање грешака и надзор.
- Додајте руковање грешкама: Користите
try...exceptблокове да бисте обрадили могуће изузетке и вратили одговарајуће поруке о грешкама. - Ограничење брзине (Rate limiting): Користите ограничавач брзине да бисте спречили злоупотребу API-ја. FastAPI има неколико готових библиотека за ограничавање брзине.
- Кеширање: За поновљене захтеве, можете користити кеширање да бисте побољшали перформансе.
- Надзор: Користите алатке за надзор да бисте пратили перформансе и доступност API-ја.
Напредни трикови
- Асинхрона обрада: За дуготрајно LLM закључивање, користите кључне речи
asyncиawaitза асинхрону обраду, избегавајући блокирање главне нити. - Стриминг одговор: Коришћење стриминг одговора (StreamingResponse) може да врати генерисани текст у реалном времену, побољшавајући корисничко искуство.
- Вишенитни/вишепроцесни рад: За CPU интензивно LLM закључивање, можете користити вишенитни или вишепроцесни рад да бисте побољшали перформансе.
- GPU убрзање: Ако ваш LLM модел подржава GPU убрзање, можете користити CUDA или друге GPU библиотеке за убрзање закључивања.





